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.assertNotNull;
13 import static org.junit.Assert.assertThrows;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.ArgumentMatchers.isNull;
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 java.util.List;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.junit.MockitoJUnitRunner;
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;
28 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
29 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModificationCursor;
30 import org.opendaylight.yangtools.yang.data.tree.api.ModificationType;
32 @RunWith(MockitoJUnitRunner.StrictStubs.class)
33 public class DataTreeCandidateNodesTest {
35 public void testFromNormalizedNode() {
36 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
37 final DataTreeCandidateNode dataTreeCandidateNode = DataTreeCandidateNodes.written(mockedNormalizedNode);
38 assertNotNull(dataTreeCandidateNode);
42 public void testApplyToCursorWithWriteModificationType() {
43 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
44 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
46 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).modificationType();
47 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
48 doReturn(mockedNormalizedNode).when(mockedDataTreeCandidateNode).dataAfter();
49 DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
50 verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
54 public void testApplyToCursorWithDeleteModificationType() {
55 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
56 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
58 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).modificationType();
59 DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
60 verify(mockedCursor, times(1)).delete(isNull());
64 public void testApplyToCursorWithSubtreeModifiedModificationType() {
65 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
66 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
68 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).modificationType();
70 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
71 doReturn(ModificationType.DELETE).when(mockedChildNode1).modificationType();
73 final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
74 doReturn(ModificationType.WRITE).when(mockedChildNode2).modificationType();
75 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
76 doReturn(mockedNormalizedNode).when(mockedChildNode2).dataAfter();
78 final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
79 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).modificationType();
80 final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
81 doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).modificationType();
82 doReturn(List.of(mockedChildNode3ChildNode)).when(mockedChildNode3).childNodes();
84 doReturn(List.of(mockedChildNode1, mockedChildNode2, mockedChildNode3))
85 .when(mockedDataTreeCandidateNode).childNodes();
87 DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
88 verify(mockedCursor, times(2)).enter((PathArgument) isNull());
89 verify(mockedCursor, times(2)).delete(isNull());
90 verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
94 public void testApplyToCursorWithUnsupportedModificationType() {
95 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
96 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
98 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).modificationType();
99 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
100 () -> DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode));
101 assertThat(ex.getMessage(), containsString("Unsupported modification"));
105 public void testApplyRootedNodeToCursorWithWriteModificationType() {
106 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
107 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
109 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).modificationType();
110 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
111 doReturn(mockedNormalizedNode).when(mockedDataTreeCandidateNode).dataAfter();
112 DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
113 mockedDataTreeCandidateNode);
114 verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
118 public void testApplyRootedNodeToCursorWithDeleteModificationType() {
119 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
120 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
122 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).modificationType();
123 DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
124 mockedDataTreeCandidateNode);
125 verify(mockedCursor, times(1)).delete(isNull());
129 public void testApplyRootedNodeToCursorWithSubtreeModifiedModificationType() {
130 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
131 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
133 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).modificationType();
135 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
136 doReturn(ModificationType.DELETE).when(mockedChildNode1).modificationType();
137 doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).childNodes();
139 DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
140 mockedDataTreeCandidateNode);
141 verify(mockedCursor, times(1)).enter((PathArgument) isNull());
142 verify(mockedCursor, times(1)).delete(isNull());
146 public void testApplyRootedNodeToCursorWithUnsupportedModificationType() {
147 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
148 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
150 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).modificationType();
151 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
152 () -> DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
153 mockedDataTreeCandidateNode));
154 assertThat(ex.getMessage(), containsString("Unsupported modification"));
158 public void testApplyRootToCursorWithSubtreeModifiedModificationType() {
159 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
160 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
162 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).modificationType();
164 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
165 doReturn(ModificationType.DELETE).when(mockedChildNode1).modificationType();
166 doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).childNodes();
168 DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode);
169 verify(mockedCursor, times(1)).delete(isNull());
173 public void testApplyRootToCursorWithDeleteModificationType() {
174 final var mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
175 final var mockedCursor = mock(DataTreeModificationCursor.class);
177 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).modificationType();
178 final var ex = assertThrows(IllegalArgumentException.class,
179 () -> DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode));
180 assertThat(ex.getMessage(), containsString("Can not delete root"));
184 public void testApplyRootToCursorWithUnsupportedModificationType() {
185 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
186 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
188 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).modificationType();
189 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
190 () -> DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode));
191 assertThat(ex.getMessage(), containsString("Unsupported modification"));