Return boolean from Processor#process(String)
- Update ForegroundProcessor#process(String) to return boolean
- Remove outdated test, ProcessorTest#testProcess_noWorkInitialDelay
The boolean indicates whether or not the work was successfully enqueued
for processing. If process(workId) was already called before for that
workId, it will return false.
Currently, Processor#process() silently checks if a work was already
set to be processed, but does not notify the caller. This will be used
to determine whether or not a Work was actually enqueued for processing.
Otherwise, the caller would need to keep its own set of work IDs that
it called Processor#process().
ProcessorTest#testProcess_noWorkInitialDelay took 2 seconds to check
that a work was put into running state. That functionality is tested in
WorkerWrapperTest#testRunning.
Test: Update and run ProcessorTest and ForegroundProcessorTest on
API 16, 18, 23, 26
Change-Id: I2b82cde2a36498f31ff0b0050f4c27cfdd090d0f
diff --git a/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/ProcessorTest.java b/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/ProcessorTest.java
index 1659016..b5c1379 100644
--- a/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/ProcessorTest.java
+++ b/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/ProcessorTest.java
@@ -17,11 +17,9 @@
package android.arch.background.workmanager.impl;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
-import android.arch.background.workmanager.BaseWork;
import android.arch.background.workmanager.DatabaseTest;
import android.arch.background.workmanager.Work;
import android.arch.background.workmanager.worker.InfiniteTestWorker;
@@ -30,17 +28,14 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
@RunWith(AndroidJUnit4.class)
public class ProcessorTest extends DatabaseTest {
- private static final long ASYNC_WAIT_DURATION = 2000L;
private Processor mProcessor;
@Before
@@ -54,22 +49,6 @@
};
}
- @After
- public void tearDown() {
- mProcessor = null;
- }
-
- @Test
- @SmallTest
- public void testProcess_noWorkInitialDelay() throws InterruptedException {
- Work work = Work.newBuilder(InfiniteTestWorker.class).build();
- insertWork(work);
- mProcessor.process(work.getId());
- Thread.sleep(ASYNC_WAIT_DURATION);
- assertThat(mDatabase.workSpecDao().getWorkSpecStatus(work.getId()),
- is(BaseWork.STATUS_RUNNING));
- }
-
@Test
@SmallTest
public void testCancel_invalidWorkId() {
@@ -84,12 +63,8 @@
Work work = Work.newBuilder(InfiniteTestWorker.class).build();
String id = work.getId();
insertWork(work);
- mProcessor.process(id);
- assertThat(mProcessor.mEnqueuedWorkMap, hasKey(id));
- Future future = mProcessor.mEnqueuedWorkMap.get(id);
- mProcessor.process(id);
- assertThat(mProcessor.mEnqueuedWorkMap, hasKey(id));
- assertThat(mProcessor.mEnqueuedWorkMap.get(id), is(future));
+ assertThat(mProcessor.process(id), is(true));
+ assertThat(mProcessor.process(id), is(false));
}
@Test
diff --git a/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessorTest.java b/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessorTest.java
index da455a9..00bac85 100644
--- a/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessorTest.java
+++ b/background/workmanager/src/androidTest/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessorTest.java
@@ -34,6 +34,7 @@
import android.arch.core.executor.testing.CountingTaskExecutorRule;
import android.arch.lifecycle.Lifecycle;
import android.content.Context;
+import android.support.annotation.NonNull;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -71,7 +72,7 @@
@After
@Override
public void closeDb() {
- postLifecycleStopOnMainThread();
+ postLifecycleEventOnMainThread(Lifecycle.Event.ON_STOP);
try {
drain();
} catch (Exception e) {
@@ -87,10 +88,9 @@
Work work = Work.newBuilder(TestWorker.class).build();
insertWork(work);
drain();
- mForegroundProcessor.process(work.getId());
+ assertThat(mForegroundProcessor.process(work.getId()), is(true));
drain();
- assertThat(mDatabase.workSpecDao().getWorkSpecStatus(work.getId()),
- is(STATUS_SUCCEEDED));
+ assertThat(mDatabase.workSpecDao().getWorkSpecStatus(work.getId()), is(STATUS_SUCCEEDED));
}
@Test
@@ -106,7 +106,7 @@
mDatabase.dependencyDao().insertDependency(
new Dependency(workSpec.getId(), prerequisite.getId()));
drain();
- mForegroundProcessor.process(prerequisite.getId());
+ assertThat(mForegroundProcessor.process(prerequisite.getId()), is(true));
drain();
assertThat(mDatabase.workSpecDao().getWorkSpecStatus(prerequisite.getId()),
@@ -117,23 +117,35 @@
@Test
@SmallTest
- public void testProcess_processorInactive() throws TimeoutException, InterruptedException {
- postLifecycleStopOnMainThread();
+ public void testProcess_activeLifecycle() throws TimeoutException, InterruptedException {
+ postLifecycleEventOnMainThread(Lifecycle.Event.ON_START);
drain();
Work work = Work.newBuilder(TestWorker.class).build();
insertWork(work);
drain();
- mForegroundProcessor.process(work.getId());
+ assertThat(mForegroundProcessor.process(work.getId()), is(true));
drain();
- assertThat(mDatabase.workSpecDao().getWorkSpecStatus(work.getId()),
- is(STATUS_ENQUEUED));
+ assertThat(mDatabase.workSpecDao().getWorkSpecStatus(work.getId()), is(STATUS_SUCCEEDED));
}
- private void postLifecycleStopOnMainThread() {
+ @Test
+ @SmallTest
+ public void testProcess_processorInactive() throws TimeoutException, InterruptedException {
+ postLifecycleEventOnMainThread(Lifecycle.Event.ON_STOP);
+ drain();
+ Work work = Work.newBuilder(TestWorker.class).build();
+ insertWork(work);
+ drain();
+ assertThat(mForegroundProcessor.process(work.getId()), is(false));
+ drain();
+ assertThat(mDatabase.workSpecDao().getWorkSpecStatus(work.getId()), is(STATUS_ENQUEUED));
+ }
+
+ private void postLifecycleEventOnMainThread(@NonNull final Lifecycle.Event event) {
ArchTaskExecutor.getInstance().postToMainThread(new Runnable() {
@Override
public void run() {
- mLifecycleOwner.mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+ mLifecycleOwner.mLifecycleRegistry.handleLifecycleEvent(event);
}
});
}
diff --git a/background/workmanager/src/main/java/android/arch/background/workmanager/impl/Processor.java b/background/workmanager/src/main/java/android/arch/background/workmanager/impl/Processor.java
index fcd71ff..79a4ca9 100644
--- a/background/workmanager/src/main/java/android/arch/background/workmanager/impl/Processor.java
+++ b/background/workmanager/src/main/java/android/arch/background/workmanager/impl/Processor.java
@@ -55,22 +55,24 @@
/**
* Processes a given unit of work in the background.
*
- * @param id The work id to execute.
+ * @param id The work id to execute.
+ * @return {@code true} if the work was successfully enqueued for processing
*/
- public void process(String id) {
+ public boolean process(String id) {
// Work may get triggered multiple times if they have passing constraints and new work with
// those constraints are added.
if (mEnqueuedWorkMap.containsKey(id)) {
- return;
+ Log.d(TAG, "Work " + id + " is already enqueued for processing");
+ return false;
}
WorkerWrapper workWrapper = new WorkerWrapper.Builder(mAppContext, mWorkDatabase, id)
.withListener(this)
.withScheduler(mScheduler)
.build();
- Future<?> future = mExecutorService.submit(workWrapper);
- mEnqueuedWorkMap.put(id, future);
- Log.d(TAG, getClass().getSimpleName() + " submitted " + id + " to ExecutorService");
+ mEnqueuedWorkMap.put(id, mExecutorService.submit(workWrapper));
+ Log.d(TAG, getClass().getSimpleName() + ": processing " + id);
+ return true;
}
/**
diff --git a/background/workmanager/src/main/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessor.java b/background/workmanager/src/main/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessor.java
index 0d19eda..21a4531 100644
--- a/background/workmanager/src/main/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessor.java
+++ b/background/workmanager/src/main/java/android/arch/background/workmanager/impl/foreground/ForegroundProcessor.java
@@ -75,13 +75,12 @@
}
@Override
- public void process(String id) {
- Log.d(TAG, "Trying to process " + id);
- if (isActive()) {
- super.process(id);
- } else {
+ public boolean process(String id) {
+ if (!isActive()) {
Log.d(TAG, "Inactive lifecycle; not processing " + id);
+ return false;
}
+ return super.process(id);
}
@Override