+ public void mergeToStore(final ShardDataTree store, final YangInstanceIdentifier id,
+ final NormalizedNode<?,?> node) throws DataValidationFailedException {
+ final BatchedModifications batched = new BatchedModifications(nextTransactionId(), CURRENT_VERSION);
+ batched.addModification(new MergeModification(id, node));
+ batched.setReady();
+ batched.setDoCommitOnReady(true);
+ batched.setTotalMessagesSent(1);
+
+ DataTreeModification modification = store.getDataTree().takeSnapshot().newModification();
+ batched.apply(modification);
+ store.notifyListeners(commitTransaction(store.getDataTree(), modification));
+ }
+
+ DataTree setupInMemorySnapshotStore() throws DataValidationFailedException {
+ final DataTree testStore = new InMemoryDataTreeFactory().create(
+ DataTreeConfiguration.DEFAULT_OPERATIONAL, SCHEMA_CONTEXT);
+
+ writeToStore(testStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
+
+ final NormalizedNode<?, ?> root = readStore(testStore, YangInstanceIdentifier.empty());
+
+ InMemorySnapshotStore.addSnapshot(shardID.toString(), Snapshot.create(
+ new ShardSnapshotState(new MetadataShardDataTreeSnapshot(root)),
+ Collections.<ReplicatedLogEntry>emptyList(), 0, 1, -1, -1, 1, null, null));
+ return testStore;
+ }
+
+ static CommitTransactionPayload payloadForModification(final DataTree source, final DataTreeModification mod,
+ final TransactionIdentifier transactionId) throws DataValidationFailedException, IOException {
+ source.validate(mod);
+ final DataTreeCandidate candidate = source.prepare(mod);
+ source.commit(candidate);
+ return CommitTransactionPayload.create(transactionId, candidate);
+ }
+
+ static BatchedModifications newBatchedModifications(final TransactionIdentifier transactionID,
+ final YangInstanceIdentifier path, final NormalizedNode<?, ?> data, final boolean ready,
+ final boolean doCommitOnReady, final int messagesSent) {
+ final BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION);
+ batched.addModification(new WriteModification(path, data));
+ if (ready) {
+ batched.setReady();
+ }
+ batched.setDoCommitOnReady(doCommitOnReady);
+ batched.setTotalMessagesSent(messagesSent);
+ return batched;
+ }
+
+ static BatchedModifications newReadyBatchedModifications(final TransactionIdentifier transactionID,
+ final YangInstanceIdentifier path, final NormalizedNode<?, ?> data,
+ final SortedSet<String> participatingShardNames) {
+ final BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION);
+ batched.addModification(new WriteModification(path, data));
+ batched.setReady(Optional.of(participatingShardNames));
+ batched.setTotalMessagesSent(1);
+ return batched;
+ }
+
+ @SuppressWarnings("unchecked")
+ static void verifyOuterListEntry(final TestActorRef<Shard> shard, final Object expIDValue) {
+ final NormalizedNode<?, ?> outerList = readStore(shard, TestModel.OUTER_LIST_PATH);
+ assertNotNull(TestModel.OUTER_LIST_QNAME.getLocalName() + " not found", outerList);
+ assertTrue(TestModel.OUTER_LIST_QNAME.getLocalName() + " value is not Iterable",
+ outerList.getValue() instanceof Iterable);
+ final Object entry = ((Iterable<Object>)outerList.getValue()).iterator().next();
+ assertTrue(TestModel.OUTER_LIST_QNAME.getLocalName() + " entry is not MapEntryNode",
+ entry instanceof MapEntryNode);
+ final MapEntryNode mapEntry = (MapEntryNode)entry;
+ final Optional<DataContainerChild<? extends PathArgument, ?>> idLeaf =
+ mapEntry.getChild(new YangInstanceIdentifier.NodeIdentifier(TestModel.ID_QNAME));
+ assertTrue("Missing leaf " + TestModel.ID_QNAME.getLocalName(), idLeaf.isPresent());
+ assertEquals(TestModel.ID_QNAME.getLocalName() + " value", expIDValue, idLeaf.get().getValue());
+ }
+
+ public 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(CarsModel.CARS_QNAME)))
+ .when(mockCandidateNode).getDataAfter();
+ doReturn(CarsModel.BASE_PATH).when(mockCandidate).getRootPath();
+ doReturn(mockCandidateNode).when(mockCandidate).getRootNode();
+ return mockCandidate;
+ }
+
+ 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.empty()).when(mockCandidate).getRootPath();
+ doReturn(mockCandidateNode).when(mockCandidate).getRootNode();
+ return mockCandidate;
+ }
+
+ static DataTreeCandidate commitTransaction(final DataTree store, final DataTreeModification modification)
+ throws DataValidationFailedException {
+ modification.ready();
+ store.validate(modification);
+ final DataTreeCandidate candidate = store.prepare(modification);
+ store.commit(candidate);
+ return candidate;
+ }
+