+ verifyBatchedModifications(batchedModifications.get(0), true, true);
+ }
+
+ @Test
+ public void testReadyWithMultipleShardWrites() {
+ ActorRef actorRef1 = setupActorContextWithInitialCreateTransaction(getSystem(), WRITE_ONLY);
+
+ ActorRef actorRef2 = setupActorContextWithInitialCreateTransaction(getSystem(), WRITE_ONLY,
+ TestModel.JUNK_QNAME.getLocalName());
+
+ expectBatchedModificationsReady(actorRef1);
+ expectBatchedModificationsReady(actorRef2);
+
+ ActorRef actorRef3 = getSystem().actorOf(Props.create(DoNothingActor.class));
+
+ doReturn(getSystem().actorSelection(actorRef3.path())).when(mockActorContext)
+ .actorSelection(actorRef3.path().toString());
+
+ doReturn(Futures.successful(newPrimaryShardInfo(actorRef3, createDataTree()))).when(mockActorContext)
+ .findPrimaryShardAsync(eq(CarsModel.BASE_QNAME.getLocalName()));
+
+ expectReadyLocalTransaction(actorRef3, false);
+
+ TransactionProxy transactionProxy = new TransactionProxy(mockComponentFactory, WRITE_ONLY);
+
+ transactionProxy.write(TestModel.JUNK_PATH, ImmutableNodes.containerNode(TestModel.JUNK_QNAME));
+ transactionProxy.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
+ transactionProxy.write(CarsModel.BASE_PATH, ImmutableNodes.containerNode(CarsModel.BASE_QNAME));
+
+ DOMStoreThreePhaseCommitCohort ready = transactionProxy.ready();
+
+ assertTrue(ready instanceof ThreePhaseCommitCohortProxy);
+
+ verifyCohortFutures((ThreePhaseCommitCohortProxy)ready, actorSelection(actorRef1),
+ actorSelection(actorRef2), actorSelection(actorRef3));
+
+ SortedSet<String> expShardNames =
+ ImmutableSortedSet.of(DefaultShardStrategy.DEFAULT_SHARD,
+ TestModel.JUNK_QNAME.getLocalName(), CarsModel.BASE_QNAME.getLocalName());
+
+ ArgumentCaptor<BatchedModifications> batchedMods = ArgumentCaptor.forClass(BatchedModifications.class);
+ verify(mockActorContext).executeOperationAsync(
+ eq(actorSelection(actorRef1)), batchedMods.capture(), any(Timeout.class));
+ assertTrue("Participating shards present", batchedMods.getValue().getParticipatingShardNames().isPresent());
+ assertEquals("Participating shards", expShardNames, batchedMods.getValue().getParticipatingShardNames().get());
+
+ batchedMods = ArgumentCaptor.forClass(BatchedModifications.class);
+ verify(mockActorContext).executeOperationAsync(
+ eq(actorSelection(actorRef2)), batchedMods.capture(), any(Timeout.class));
+ assertTrue("Participating shards present", batchedMods.getValue().getParticipatingShardNames().isPresent());
+ assertEquals("Participating shards", expShardNames, batchedMods.getValue().getParticipatingShardNames().get());
+
+ ArgumentCaptor<ReadyLocalTransaction> readyLocalTx = ArgumentCaptor.forClass(ReadyLocalTransaction.class);
+ verify(mockActorContext).executeOperationAsync(
+ eq(actorSelection(actorRef3)), readyLocalTx.capture(), any(Timeout.class));
+ assertTrue("Participating shards present", readyLocalTx.getValue().getParticipatingShardNames().isPresent());
+ assertEquals("Participating shards", expShardNames, readyLocalTx.getValue().getParticipatingShardNames().get());