2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.yangtools.yang.data.api.schema.tree;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.junit.Assert.fail;
15 import static org.mockito.Matchers.any;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.mock;
18 import static org.mockito.Mockito.times;
19 import static org.mockito.Mockito.verify;
21 import com.google.common.base.Optional;
22 import com.google.common.collect.Lists;
23 import java.util.Collection;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
27 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
29 public class DataTreeCandidatesTest {
32 public void testNewDataTreeCandidate() {
33 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
34 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
35 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(mockedRootPath,
36 mockedDataTreeCandidateNode);
38 assertNotNull(dataTreeCandidate);
39 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
40 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
41 assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
42 assertTrue(dataTreeCandidate.toString().contains(
43 "DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
47 public void testFromNormalizedNode() {
48 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
49 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
50 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(mockedRootPath,
51 mockedNormalizedNode);
53 assertNotNull(dataTreeCandidate);
54 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
55 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
56 assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
60 public void testApplyToCursor() {
61 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
62 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
64 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
65 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
66 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
67 DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
68 verify(mockedCursor, times(1)).delete(any(PathArgument.class));
72 public void testApplyToCursorAwareModification() {
73 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
74 final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
76 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
77 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
78 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
79 doReturn(mockedCursor).when(mockedModification).createCursor(any(YangInstanceIdentifier.class));
80 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
81 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
83 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
85 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
86 verify(mockedModification, times(1)).createCursor(any(YangInstanceIdentifier.class));
87 verify(mockedCursor, times(1)).delete(any(PathArgument.class));
89 doReturn(Boolean.TRUE).when(mockedRootPath).isEmpty();
91 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
92 fail("An IllegalArgumentException should have been thrown!");
93 } catch (IllegalArgumentException ex) {
94 assertTrue(ex.getMessage().contains("Can not delete root"));
99 public void testApplyToModificationWithDeleteModificationType() {
100 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
101 final DataTreeModification mockedModification = mock(DataTreeModification.class);
103 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
104 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
105 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
106 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
108 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
110 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
111 verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
115 public void testApplyToModificationWithWriteModificationType() {
116 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
117 final DataTreeModification mockedModification = mock(DataTreeModification.class);
119 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
120 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
121 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
122 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
123 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
124 doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
126 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
128 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
129 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
133 public void testApplyToModificationWithSubtreeModifiedModificationType() {
134 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
135 final DataTreeModification mockedModification = mock(DataTreeModification.class);
137 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
138 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
139 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
140 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
142 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
144 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
145 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
146 final PathArgument mockedPathArgument1 = mock(PathArgument.class);
147 doReturn(mockedPathArgument1).when(mockedChildNode1).getIdentifier();
149 final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
150 doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
151 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
152 doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
153 final PathArgument mockedPathArgument2 = mock(PathArgument.class);
154 doReturn(mockedPathArgument2).when(mockedChildNode2).getIdentifier();
156 final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
157 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
158 final PathArgument mockedPathArgument3 = mock(PathArgument.class);
159 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
160 final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
161 doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
162 final PathArgument mockedPathArgument31 = mock(PathArgument.class);
163 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
164 doReturn(mockedPathArgument31).when(mockedChildNode3ChildNode).getIdentifier();
165 doReturn(Lists.newArrayList(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
167 final Collection<DataTreeCandidateNode> childNodes = Lists.newArrayList(mockedChildNode1, mockedChildNode2,
169 doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
171 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
172 verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
173 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
177 public void testApplyToModificationWithUnsupportedModificationType() {
178 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
179 final DataTreeModification mockedModification = mock(DataTreeModification.class);
181 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
182 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
183 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
184 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
186 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
189 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
190 fail("An IllegalArgumentException should have been thrown!");
191 } catch (IllegalArgumentException ex) {
192 assertTrue(ex.getMessage().contains("Unsupported modification"));