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 java.util.Optional;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.junit.MockitoJUnitRunner;
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.DataTreeCandidateNode;
30 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModificationCursor;
31 import org.opendaylight.yangtools.yang.data.tree.api.ModificationType;
33 @RunWith(MockitoJUnitRunner.StrictStubs.class)
34 public class DataTreeCandidateNodesTest {
36 public void testFromNormalizedNode() {
37 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
38 final DataTreeCandidateNode dataTreeCandidateNode = DataTreeCandidateNodes.written(mockedNormalizedNode);
39 assertNotNull(dataTreeCandidateNode);
43 public void testApplyToCursorWithWriteModificationType() {
44 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
45 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
47 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
48 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
49 doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
50 DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
51 verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
55 public void testApplyToCursorWithDeleteModificationType() {
56 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
57 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
59 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
60 DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
61 verify(mockedCursor, times(1)).delete(isNull());
65 public void testApplyToCursorWithSubtreeModifiedModificationType() {
66 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
67 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
69 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
71 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
72 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
74 final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
75 doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
76 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
77 doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
79 final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
80 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
81 final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
82 doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
83 doReturn(List.of(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
85 doReturn(List.of(mockedChildNode1, mockedChildNode2, mockedChildNode3))
86 .when(mockedDataTreeCandidateNode).getChildNodes();
88 DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
89 verify(mockedCursor, times(2)).enter((PathArgument) isNull());
90 verify(mockedCursor, times(2)).delete(isNull());
91 verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
95 public void testApplyToCursorWithUnsupportedModificationType() {
96 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
97 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
99 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
100 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
101 () -> DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode));
102 assertThat(ex.getMessage(), containsString("Unsupported modification"));
106 public void testApplyRootedNodeToCursorWithWriteModificationType() {
107 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
108 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
110 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
111 final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
112 doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
113 DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.empty(),
114 mockedDataTreeCandidateNode);
115 verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
119 public void testApplyRootedNodeToCursorWithDeleteModificationType() {
120 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
121 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
123 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
124 DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.empty(),
125 mockedDataTreeCandidateNode);
126 verify(mockedCursor, times(1)).delete(isNull());
130 public void testApplyRootedNodeToCursorWithSubtreeModifiedModificationType() {
131 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
132 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
134 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
136 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
137 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
138 doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).getChildNodes();
140 DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.empty(),
141 mockedDataTreeCandidateNode);
142 verify(mockedCursor, times(1)).enter((PathArgument) isNull());
143 verify(mockedCursor, times(1)).delete(isNull());
147 public void testApplyRootedNodeToCursorWithUnsupportedModificationType() {
148 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
149 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
151 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
152 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
153 () -> DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.empty(),
154 mockedDataTreeCandidateNode));
155 assertThat(ex.getMessage(), containsString("Unsupported modification"));
159 public void testApplyRootToCursorWithSubtreeModifiedModificationType() {
160 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
161 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
163 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
165 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
166 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
167 doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).getChildNodes();
169 DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode);
170 verify(mockedCursor, times(1)).delete(isNull());
174 public void testApplyRootToCursorWithDeleteModificationType() {
175 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
176 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
178 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
179 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
180 () -> DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode));
181 assertThat(ex.getMessage(), containsString("Can not delete root"));
185 public void testApplyRootToCursorWithUnsupportedModificationType() {
186 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
187 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
189 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
190 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
191 () -> DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode));
192 assertThat(ex.getMessage(), containsString("Unsupported modification"));