JoinWorker should pass inputs along.
Test: Added and ran tests.
Change-Id: Ib9a5d783a50aaeb89e52b9d42cdeacdb61b24577
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 47ac4a9..1f32e03 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
@@ -17,9 +17,11 @@
package androidx.work.impl;
import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -33,26 +35,32 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import androidx.work.Arguments;
+import androidx.work.State;
+import androidx.work.TestLifecycleOwner;
+import androidx.work.Work;
+import androidx.work.WorkContinuation;
+import androidx.work.WorkManagerTest;
+import androidx.work.impl.model.WorkSpec;
+import androidx.work.impl.model.WorkSpecDao;
+import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule;
+import androidx.work.worker.TestWorker;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executors;
-import androidx.work.TestLifecycleOwner;
-import androidx.work.Work;
-import androidx.work.WorkContinuation;
-import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule;
-import androidx.work.worker.TestWorker;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
-public class WorkContinuationImplTest {
+public class WorkContinuationImplTest extends WorkManagerTest {
private WorkDatabase mDatabase;
private WorkManagerImpl mWorkManagerImpl;
@@ -233,6 +241,60 @@
verifyEnqueued(dependent);
}
+ @Test
+ @SmallTest
+ @SuppressWarnings("unchecked")
+ public void testContinuation_joinPassesAllOutput() throws InterruptedException {
+ final String intTag = "myint";
+ final String stringTag = "mystring";
+
+ Work firstWork = new Work.Builder(TestWorker.class)
+ .withInitialState(State.SUCCEEDED)
+ .build();
+ Work secondWork = new Work.Builder(TestWorker.class)
+ .withInitialState(State.SUCCEEDED)
+ .build();
+
+ WorkSpecDao workSpecDao = mDatabase.workSpecDao();
+ workSpecDao.insertWorkSpec(getWorkSpec(firstWork));
+ workSpecDao.insertWorkSpec(getWorkSpec(secondWork));
+
+ workSpecDao.setOutput(
+ firstWork.getId(),
+ new Arguments.Builder().putInt(intTag, 0).build());
+ workSpecDao.setOutput(
+ secondWork.getId(),
+ new Arguments.Builder().putInt(intTag, 1).putString(stringTag, "hello").build());
+
+ WorkContinuationImpl firstContinuation =
+ new WorkContinuationImpl(mWorkManagerImpl, Collections.singletonList(firstWork));
+ WorkContinuationImpl secondContinuation =
+ new WorkContinuationImpl(mWorkManagerImpl, Collections.singletonList(secondWork));
+ WorkContinuationImpl dependentContinuation =
+ (WorkContinuationImpl) WorkContinuation.join(firstContinuation, secondContinuation);
+ dependentContinuation.enqueue();
+
+ String joinId = null;
+ for (String id : dependentContinuation.getAllIds()) {
+ if (!firstWork.getId().equals(id) && !secondWork.getId().equals(id)) {
+ joinId = id;
+ mWorkManagerImpl.getProcessor().startWork(id);
+ Thread.sleep(5000L);
+ break;
+ }
+ }
+
+ assertThat(joinId, is(not(nullValue())));
+ WorkSpec joinWorkSpec = workSpecDao.getWorkSpec(joinId);
+ assertThat(joinWorkSpec, is(not(nullValue())));
+
+ Arguments output = joinWorkSpec.getOutput();
+ assertThat(output.getIntArray(intTag), is(not(nullValue())));
+ assertThat(Arrays.asList(output.getIntArray(intTag)), containsInAnyOrder(0, 1));
+ assertThat(output.getStringArray(stringTag), is(not(nullValue())));
+ assertThat(Arrays.asList(output.getStringArray(stringTag)), contains("hello"));
+ }
+
private void verifyEnqueued(WorkContinuationImpl continuation) {
assertThat(continuation.isEnqueued(), is(true));
List<WorkContinuationImpl> parents = continuation.getParents();
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 4675a86..be9782f 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
@@ -24,6 +24,7 @@
import android.support.annotation.WorkerThread;
import android.text.TextUtils;
+import androidx.work.ArrayCreatingInputMerger;
import androidx.work.BaseWork;
import androidx.work.BlockingWorkContinuation;
import androidx.work.ExistingWorkPolicy;
@@ -199,7 +200,9 @@
@NonNull List<WorkContinuation> continuations) {
if (work == null) {
- work = new Work.Builder(JoinWorker.class).build();
+ work = new Work.Builder(JoinWorker.class)
+ .withInputMerger(ArrayCreatingInputMerger.class)
+ .build();
}
List<WorkContinuationImpl> parents = new ArrayList<>(continuations.size());
diff --git a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
index 6055290..7307e75 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
@@ -16,7 +16,7 @@
package androidx.work.impl.model;
-import static android.arch.persistence.room.OnConflictStrategy.FAIL;
+import static android.arch.persistence.room.OnConflictStrategy.IGNORE;
import static androidx.work.impl.model.EnumTypeConverters.StateIds.COMPLETED_STATES;
@@ -43,7 +43,7 @@
*
* @param workSpec The WorkSpec to insert.
*/
- @Insert(onConflict = FAIL)
+ @Insert(onConflict = IGNORE)
void insertWorkSpec(WorkSpec workSpec);
/**
diff --git a/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java b/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java
index fb876b8..ad04256 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java
@@ -30,6 +30,7 @@
public class JoinWorker extends Worker {
@Override
public WorkerResult doWork() {
+ setOutput(getArguments());
return WorkerResult.SUCCESS;
}
}