Empty WorkContinuation node makes subsequent nodes the head node and replaces the chain.
* Enqueue runnable looks for a node with no pre-requisites to start a REPLACE
* When we insert an empty node in the middle of the chain, the next node
becomes the new head node, and previously inserted nodes are replaced.
* This fix just treats a then(emptyList) a no-op and returns the existing
WorkContinuation.
Fixes: b/142835274
Test: Added unit tests. Ran integration tests.
Change-Id: Ib34badf0477771eb06a6bfe68c7d9f4ed664563b
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
index 82cf2d4..4228970 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
@@ -168,6 +168,25 @@
}
@Test
+ public void testContinuation_withEmptyNode_enqueue() throws ExecutionException,
+ InterruptedException {
+ OneTimeWorkRequest first = createTestWorker();
+ OneTimeWorkRequest second = createTestWorker();
+ WorkContinuation continuation = new WorkContinuationImpl(mWorkManagerImpl,
+ Collections.singletonList(first));
+ continuation = continuation.then(Collections.<OneTimeWorkRequest>emptyList());
+ continuation = continuation.then(Collections.singletonList(second));
+ continuation.enqueue().getResult().get();
+ WorkSpec firstWorkSpec = mDatabase.workSpecDao().getWorkSpec(first.getStringId());
+ WorkSpec secondWorkSpec = mDatabase.workSpecDao().getWorkSpec(second.getStringId());
+ assertThat(firstWorkSpec, is(notNullValue()));
+ assertThat(secondWorkSpec, is(notNullValue()));
+ List<String> prerequisites =
+ mDatabase.dependencyDao().getPrerequisites(second.getStringId());
+ assertThat(prerequisites, containsInAnyOrder(first.getStringId()));
+ }
+
+ @Test
public void testContinuation_chainEnqueue() throws ExecutionException, InterruptedException {
WorkContinuationImpl continuation =
new WorkContinuationImpl(mWorkManagerImpl, createTestWorkerList());
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
index a1e1a44..9ba6b39 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
@@ -151,11 +151,15 @@
@Override
public @NonNull WorkContinuation then(@NonNull List<OneTimeWorkRequest> work) {
- return new WorkContinuationImpl(mWorkManagerImpl,
- mName,
- ExistingWorkPolicy.KEEP,
- work,
- Collections.singletonList(this));
+ if (work.isEmpty()) {
+ return this;
+ } else {
+ return new WorkContinuationImpl(mWorkManagerImpl,
+ mName,
+ ExistingWorkPolicy.KEEP,
+ work,
+ Collections.singletonList(this));
+ }
}
@Override