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
8 package org.opendaylight.yangtools.yang.data.tree.spi;
10 import static org.hamcrest.CoreMatchers.containsString;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertThrows;
15 import static org.junit.Assert.assertTrue;
16 import static org.mockito.ArgumentMatchers.any;
17 import static org.mockito.ArgumentMatchers.isNull;
18 import static org.mockito.Mockito.doReturn;
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.times;
21 import static org.mockito.Mockito.verify;
23 import java.util.List;
24 import java.util.Optional;
25 import org.junit.Test;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
28 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
29 import org.opendaylight.yangtools.yang.data.tree.api.CursorAwareDataTreeModification;
30 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
31 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
32 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
33 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModificationCursor;
34 import org.opendaylight.yangtools.yang.data.tree.api.ModificationType;
36 public class DataTreeCandidatesTest {
39 public void testNewDataTreeCandidate() {
40 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
41 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
42 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(mockedRootPath,
43 mockedDataTreeCandidateNode);
45 assertNotNull(dataTreeCandidate);
46 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
47 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
48 assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
49 assertTrue(dataTreeCandidate.toString().contains(
50 "DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
54 public void testFromNormalizedNode() {
55 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
56 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
57 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(mockedRootPath,
58 mockedNormalizedNode);
60 assertNotNull(dataTreeCandidate);
61 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
62 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
63 assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
67 public void testApplyToCursor() {
68 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
69 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
71 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
72 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
73 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
74 DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
75 verify(mockedCursor, times(1)).delete(isNull());
79 public void testApplyToCursorAwareModification() {
80 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
81 final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
83 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
84 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
85 final YangInstanceIdentifier mockedRootPathParent = mock(YangInstanceIdentifier.class);
86 doReturn(mockedRootPathParent).when(mockedRootPath).getParent();
88 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
89 doReturn(Optional.of(mockedCursor)).when(mockedModification).openCursor(mockedRootPathParent);
90 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
91 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
93 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
95 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
96 verify(mockedRootPath, times(1)).getParent();
97 verify(mockedModification, times(1)).openCursor(mockedRootPathParent);
98 verify(mockedCursor, times(1)).delete(isNull());
102 public void testApplyToCursorAwareModificationRoot() {
103 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
104 final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
105 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
106 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
107 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
108 doReturn(null).when(mockedRootPath).getParent();
109 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
110 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
112 IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
113 () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
114 assertEquals("Can not delete root.", thrown.getMessage());
118 public void testApplyToModificationWithDeleteModificationType() {
119 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
120 final DataTreeModification mockedModification = mock(DataTreeModification.class);
122 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
123 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
124 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
125 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
127 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
129 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
130 verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
134 public void testApplyToModificationWithWriteModificationType() {
135 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
136 final DataTreeModification mockedModification = mock(DataTreeModification.class);
138 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
139 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
140 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
141 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
142 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
143 doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
145 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
147 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
148 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
152 public void testApplyToModificationWithSubtreeModifiedModificationType() {
153 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
154 final DataTreeModification mockedModification = mock(DataTreeModification.class);
156 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
157 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
158 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
159 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
161 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
163 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
164 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
165 final PathArgument mockedPathArgument1 = mock(PathArgument.class);
166 doReturn(mockedPathArgument1).when(mockedChildNode1).getIdentifier();
168 final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
169 doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
170 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
171 doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
172 final PathArgument mockedPathArgument2 = mock(PathArgument.class);
173 doReturn(mockedPathArgument2).when(mockedChildNode2).getIdentifier();
175 final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
176 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
177 final PathArgument mockedPathArgument3 = mock(PathArgument.class);
178 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
179 final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
180 doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
181 final PathArgument mockedPathArgument31 = mock(PathArgument.class);
182 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
183 doReturn(mockedPathArgument31).when(mockedChildNode3ChildNode).getIdentifier();
184 doReturn(List.of(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
186 final List<DataTreeCandidateNode> childNodes = List.of(mockedChildNode1, mockedChildNode2, mockedChildNode3);
187 doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
189 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
190 verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
191 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
195 public void testApplyToModificationWithUnsupportedModificationType() {
196 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
197 final DataTreeModification mockedModification = mock(DataTreeModification.class);
199 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
200 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
201 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
202 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
204 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
206 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
207 () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
208 assertThat(ex.getMessage(), containsString("Unsupported modification"));