@SmallTest @MediumTest @LargeTest public void testRunSomething() { CountingRunnable run = new CountingRunnable(); assertEquals(0, run.getRunCount()); ScriptableExecutor executor = new ScriptableExecutor(); assertEquals(0, executor.getPendingCount()); WorkQueue manager = new WorkQueue(1, executor); addActiveWorkItem(manager, run); assertEquals(1, executor.getPendingCount()); assertEquals(0, run.getRunCount()); executeNext(manager, executor); assertEquals(0, executor.getPendingCount()); assertEquals(1, run.getRunCount()); }
@SmallTest @MediumTest @LargeTest public void testRunSequence() { final int workTotal = 100; CountingRunnable run = new CountingRunnable(); ScriptableExecutor executor = new ScriptableExecutor(); WorkQueue manager = new WorkQueue(1, executor); for (int i = 0; i < workTotal; i++) { addActiveWorkItem(manager, run); assertEquals(1, executor.getPendingCount()); } for (int i = 0; i < workTotal; i++) { assertEquals(1, executor.getPendingCount()); assertEquals(i, run.getRunCount()); executeNext(manager, executor); } assertEquals(0, executor.getPendingCount()); assertEquals(workTotal, run.getRunCount()); }
@SmallTest @MediumTest @LargeTest public void testRunParallel() { final int workTotal = 100; CountingRunnable run = new CountingRunnable(); ScriptableExecutor executor = new ScriptableExecutor(); WorkQueue manager = new WorkQueue(workTotal, executor); for (int i = 0; i < workTotal; i++) { assertEquals(i, executor.getPendingCount()); addActiveWorkItem(manager, run); } for (int i = 0; i < workTotal; i++) { assertEquals(workTotal - i, executor.getPendingCount()); assertEquals(i, run.getRunCount()); executeNext(manager, executor); } assertEquals(0, executor.getPendingCount()); assertEquals(workTotal, run.getRunCount()); }
@SmallTest @MediumTest @LargeTest public void testSimpleCancel() { CountingRunnable run = new CountingRunnable(); ScriptableExecutor executor = new ScriptableExecutor(); WorkQueue manager = new WorkQueue(1, executor); addActiveWorkItem(manager, run); WorkQueue.WorkItem work1 = addActiveWorkItem(manager, run); cancelWork(manager, work1); assertEquals(1, executor.getPendingCount()); executeNext(manager, executor); assertEquals(0, executor.getPendingCount()); }
@LargeTest public void testThreadStress() { WorkQueue manager = new WorkQueue(); ArrayList<StressRunnable> runnables = new ArrayList<StressRunnable>(); final int threadCount = 20; for (int i = 0; i < threadCount; i++) { runnables.add(new StressRunnable(manager, 20)); } for (int i = 0; i < threadCount; i++) { manager.addActiveWorkItem(runnables.get(i)); } for (int i = 0; i < threadCount; i++) { runnables.get(i).waitForDone(); } }
@SmallTest @MediumTest @LargeTest public void testEmptyValidate() { WorkQueue manager = new WorkQueue(); manager.validate(); }
@SmallTest @MediumTest @LargeTest public void testMoveToFront() { final int firstCount = 8; final int highCount = 17; ArrayList<WorkQueue.WorkItem> highWorkItems = new ArrayList<WorkQueue.WorkItem>(); CountingRunnable highRun = new CountingRunnable(); CountingRunnable firstRun = new CountingRunnable(); CountingRunnable lowRun = new CountingRunnable(); ScriptableExecutor executor = new ScriptableExecutor(); WorkQueue manager = new WorkQueue(firstCount, executor); for (int i = 0; i < firstCount; i++) { addActiveWorkItem(manager, firstRun); } int lowCount = 0; for (int h = 0; h < highCount; h++) { highWorkItems.add(addActiveWorkItem(manager, highRun)); for (int l = 0; l < h; l++) { addActiveWorkItem(manager, lowRun); lowCount++; } } assertEquals(firstCount, executor.getPendingCount()); for (WorkQueue.WorkItem highItem : highWorkItems) { prioritizeWork(manager, highItem); } for (int i = 0; i < firstCount; i++) { assertEquals(i, firstRun.getRunCount()); executeNext(manager, executor); } for (int i = 0; i < highCount; i++) { assertEquals(i, highRun.getRunCount()); executeNext(manager, executor); } for (int i = 0; i < lowCount; i++) { assertEquals(i, lowRun.getRunCount()); executeNext(manager, executor); } assertEquals(firstCount, firstRun.getRunCount()); assertEquals(highCount, highRun.getRunCount()); assertEquals(lowCount, lowRun.getRunCount()); }
private WorkQueue.WorkItem addActiveWorkItem(WorkQueue manager, Runnable runnable) { manager.validate(); WorkQueue.WorkItem workItem = manager.addActiveWorkItem(runnable); manager.validate(); return workItem; }
private void executeNext(WorkQueue manager, ScriptableExecutor executor) { manager.validate(); executor.runNext(); manager.validate(); }
private void cancelWork(WorkQueue manager, WorkQueue.WorkItem workItem) { manager.validate(); workItem.cancel(); manager.validate(); }
private void prioritizeWork(WorkQueue manager, WorkQueue.WorkItem workItem) { manager.validate(); workItem.moveToFront(); manager.validate(); }
StressRunnable(WorkQueue manager, int iterationCount) { this.manager = manager; this.iterationCount = iterationCount; }
@Override public void run() { // Each iteration runs a random action against the WorkQueue. if (iterationIndex++ < iterationCount) { final int sleepWeight = 80; final int trackThisWeight = 10; final int prioritizeTrackedWeight = 6; final int validateWeight = 2; int weight = 0; final int n = random.nextInt(sleepWeight + trackThisWeight + prioritizeTrackedWeight + validateWeight); WorkQueue.WorkItem workItem = manager.addActiveWorkItem(this); if (n < (weight += sleepWeight)) { // Sleep try { Thread.sleep(n/4); } catch (InterruptedException e) { } } else if (n < (weight += trackThisWeight)) { // Track this work item to activate later synchronized (tracked) { tracked.add(workItem); } } else if (n < (weight += prioritizeTrackedWeight)) { // Background all pending items, prioritize tracked items, and clear tracked list ArrayList<WorkQueue.WorkItem> items = new ArrayList<WorkQueue.WorkItem>(); synchronized (tracked) { items.addAll(tracked); tracked.clear(); } for (WorkQueue.WorkItem item : items) { item.moveToFront(); } } else { // Validate manager.validate(); } } else { // Also have all threads validate once they are done. manager.validate(); synchronized (this) { isDone = true; this.notifyAll(); } } }