--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.yangtools.yang.data.api.schema.tree;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
+import java.util.Collection;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+public class DataTreeCandidatesTest {
+
+ @Test
+ public void testNewDataTreeCandidate() {
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(mockedRootPath,
+ mockedDataTreeCandidateNode);
+
+ assertNotNull(dataTreeCandidate);
+ assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
+ assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
+ assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
+ assertTrue(dataTreeCandidate.toString().contains(
+ "DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
+ }
+
+ @Test
+ public void testFromNormalizedNode() {
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
+ final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(mockedRootPath,
+ mockedNormalizedNode);
+
+ assertNotNull(dataTreeCandidate);
+ assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
+ assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
+ assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
+ }
+
+ @Test
+ public void testApplyToCursor() {
+ final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
+ final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
+
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
+ doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
+ DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
+ verify(mockedCursor, times(1)).delete(any(PathArgument.class));
+ }
+
+ @Test
+ public void testApplyToCursorAwareModification() {
+ final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
+ final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
+
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
+ final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
+ doReturn(mockedCursor).when(mockedModification).createCursor(any(YangInstanceIdentifier.class));
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
+
+ doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
+
+ DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
+ verify(mockedModification, times(1)).createCursor(any(YangInstanceIdentifier.class));
+ verify(mockedCursor, times(1)).delete(any(PathArgument.class));
+
+ doReturn(true).when(mockedRootPath).isEmpty();
+ try {
+ DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
+ fail("An IllegalArgumentException should have been thrown!");
+ } catch (IllegalArgumentException ex) {
+ assertTrue(ex.getMessage().contains("Can not delete root"));
+ }
+ }
+
+ @Test
+ public void testApplyToModificationWithDeleteModificationType() {
+ final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
+ final DataTreeModification mockedModification = mock(DataTreeModification.class);
+
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
+
+ doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
+
+ DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
+ verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
+ }
+
+ @Test
+ public void testApplyToModificationWithWriteModificationType() {
+ final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
+ final DataTreeModification mockedModification = mock(DataTreeModification.class);
+
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
+ final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
+ doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
+
+ doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
+
+ DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
+ verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+ }
+
+ @Test
+ public void testApplyToModificationWithSubtreeModifiedModificationType() {
+ final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
+ final DataTreeModification mockedModification = mock(DataTreeModification.class);
+
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
+
+ doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
+
+ final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
+ doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
+ final PathArgument mockedPathArgument1 = mock(PathArgument.class);
+ doReturn(mockedPathArgument1).when(mockedChildNode1).getIdentifier();
+
+ final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
+ doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
+ final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
+ doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
+ final PathArgument mockedPathArgument2 = mock(PathArgument.class);
+ doReturn(mockedPathArgument2).when(mockedChildNode2).getIdentifier();
+
+ final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
+ doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
+ final PathArgument mockedPathArgument3 = mock(PathArgument.class);
+ doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
+ final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
+ doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
+ final PathArgument mockedPathArgument31 = mock(PathArgument.class);
+ doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
+ doReturn(mockedPathArgument31).when(mockedChildNode3ChildNode).getIdentifier();
+ doReturn(Lists.newArrayList(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
+
+ final Collection<DataTreeCandidateNode> childNodes = Lists.newArrayList(mockedChildNode1, mockedChildNode2,
+ mockedChildNode3);
+ doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
+
+ DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
+ verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
+ verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+ }
+
+ @Test
+ public void testApplyToModificationWithUnsupportedModificationType() {
+ final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
+ final DataTreeModification mockedModification = mock(DataTreeModification.class);
+
+ final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
+ doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
+ final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
+ doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
+
+ doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
+
+ try {
+ DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
+ fail("An IllegalArgumentException should have been thrown!");
+ } catch (IllegalArgumentException ex) {
+ assertTrue(ex.getMessage().contains("Unsupported modification"));
+ }
+ }
+}