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