Increase unit test coverage for Yangtools
[yangtools.git] / yang / yang-data-api / src / test / java / org / opendaylight / yangtools / yang / data / api / schema / tree / DataTreeCandidatesTest.java
diff --git a/yang/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeCandidatesTest.java b/yang/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeCandidatesTest.java
new file mode 100644 (file)
index 0000000..a42b699
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * 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"));
+        }
+    }
+}