- new ShardTestKit(getSystem()) {{
- final TestActorRef<Shard> shard = TestActorRef.create(getSystem(),
- newShardProps().withDispatcher(Dispatchers.DefaultDispatcherId()),
- "testCommitWithPersistenceDisabled-" + readWrite);
-
- waitUntilLeader(shard);
-
- final ShardDataTree dataStore = shard.underlyingActor().getDataStore();
-
- // Setup a simulated transactions with a mock cohort.
-
- final String transactionID = "tx";
- final MutableCompositeModification modification = new MutableCompositeModification();
- final NormalizedNode<?, ?> containerNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME);
- final ShardDataTreeCohort cohort = setupMockWriteTransaction("cohort", dataStore,
- TestModel.TEST_PATH, containerNode, modification);
-
- final FiniteDuration duration = duration("5 seconds");
-
- shard.tell(prepareReadyTransactionMessage(readWrite, shard.underlyingActor(), cohort, transactionID, modification), getRef());
- expectMsgClass(duration, ReadyTransactionReply.class);
-
- // Send the CanCommitTransaction message.
-
- shard.tell(new CanCommitTransaction(transactionID).toSerializable(), getRef());
- final CanCommitTransactionReply canCommitReply = CanCommitTransactionReply.fromSerializable(
- expectMsgClass(duration, CanCommitTransactionReply.SERIALIZABLE_CLASS));
- assertEquals("Can commit", true, canCommitReply.getCanCommit());
-
- // Send the CanCommitTransaction message.
-
- shard.tell(new CommitTransaction(transactionID).toSerializable(), getRef());
- expectMsgClass(duration, CommitTransactionReply.SERIALIZABLE_CLASS);
-
- final InOrder inOrder = inOrder(cohort);
- inOrder.verify(cohort).canCommit();
- inOrder.verify(cohort).preCommit();
- inOrder.verify(cohort).commit();
-
- final NormalizedNode<?, ?> actualNode = readStore(shard, TestModel.TEST_PATH);
- assertEquals(TestModel.TEST_QNAME.getLocalName(), containerNode, actualNode);
-
- shard.tell(PoisonPill.getInstance(), ActorRef.noSender());
- }};
- }
-
- private static DataTreeCandidateTip mockCandidate(final String name) {
- final DataTreeCandidateTip mockCandidate = mock(DataTreeCandidateTip.class, name);
- final DataTreeCandidateNode mockCandidateNode = mock(DataTreeCandidateNode.class, name + "-node");
- doReturn(ModificationType.WRITE).when(mockCandidateNode).getModificationType();
- doReturn(Optional.of(ImmutableNodes.containerNode(CARS_QNAME))).when(mockCandidateNode).getDataAfter();
- doReturn(YangInstanceIdentifier.builder().build()).when(mockCandidate).getRootPath();
- doReturn(mockCandidateNode).when(mockCandidate).getRootNode();
- return mockCandidate;
- }
-
- private static DataTreeCandidateTip mockUnmodifiedCandidate(final String name) {
- final DataTreeCandidateTip mockCandidate = mock(DataTreeCandidateTip.class, name);
- final DataTreeCandidateNode mockCandidateNode = mock(DataTreeCandidateNode.class, name + "-node");
- doReturn(ModificationType.UNMODIFIED).when(mockCandidateNode).getModificationType();
- doReturn(YangInstanceIdentifier.builder().build()).when(mockCandidate).getRootPath();
- doReturn(mockCandidateNode).when(mockCandidate).getRootNode();
- return mockCandidate;
- }
-
- @Test
- public void testCommitWhenTransactionHasNoModifications() {
- testCommitWhenTransactionHasNoModifications(true);
- testCommitWhenTransactionHasNoModifications(false);
- }
-
- public void testCommitWhenTransactionHasNoModifications(final boolean readWrite){
- // Note that persistence is enabled which would normally result in the entry getting written to the journal
- // but here that need not happen