/** * Enqueues the given task sometime in the serial queue. If the {@code task} is in the head of * the serial queue, the {@code task} will be started automatically. */ public synchronized void enqueue(DownloadTask task) { taskList.add(task); Collections.sort(taskList); if (!paused && !looping) { looping = true; startNewLooper(); } }
/** * Resume the queue if the queue is paused. * * @see #pause() */ public synchronized void resume() { if (!paused) { Util.w(TAG, "require resume this queue(remain " + taskList.size() + "), but it is" + " still running"); return; } paused = false; if (!taskList.isEmpty() && !looping) { looping = true; startNewLooper(); } }
@Test public void resume_listNotEmpty_unpark() { doNothing().when(serialQueue).startNewLooper(); serialQueue.paused = true; taskList.add(task1); serialQueue.resume(); verify(serialQueue).startNewLooper(); }
@Test public void enqueue_newLooper() { doNothing().when(serialQueue).startNewLooper(); serialQueue.paused = true; serialQueue.enqueue(task1); verify(serialQueue, never()).startNewLooper(); serialQueue.looping = true; serialQueue.enqueue(task1); verify(serialQueue, never()).startNewLooper(); serialQueue.paused = false; serialQueue.looping = false; serialQueue.enqueue(task1); verify(serialQueue).startNewLooper(); assertThat(serialQueue.looping).isTrue(); }
@Test public void resume() { serialQueue.paused = true; serialQueue.looping = false; doNothing().when(serialQueue).startNewLooper(); taskList.add(mock(DownloadTask.class)); serialQueue.resume(); verify(serialQueue).startNewLooper(); assertThat(serialQueue.paused).isFalse(); assertThat(serialQueue.looping).isTrue(); }
@Test public void resume_notPaused() { serialQueue = spy(new DownloadSerialQueue()); serialQueue.paused = false; serialQueue.resume(); verify(serialQueue, never()).startNewLooper(); }
@Test public void enqueue() { doNothing().when(serialQueue).startNewLooper(); // order when(task1.compareTo(task2)).thenReturn(-1); serialQueue.enqueue(task2); serialQueue.enqueue(task1); verify(taskList).add(eq(task1)); verify(taskList).add(eq(task2)); assertThat(taskList).containsExactly(task1, task2); }