Seal YangInstanceIdentifier
[yangtools.git] / data / yang-data-tree-spi / src / test / java / org / opendaylight / yangtools / yang / data / tree / spi / DataTreeCandidateNodesTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.tree.spi;
9
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;
20
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;
32
33 @RunWith(MockitoJUnitRunner.StrictStubs.class)
34 public class DataTreeCandidateNodesTest {
35     @Test
36     public void testFromNormalizedNode() {
37         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
38         final DataTreeCandidateNode dataTreeCandidateNode = DataTreeCandidateNodes.written(mockedNormalizedNode);
39         assertNotNull(dataTreeCandidateNode);
40     }
41
42     @Test
43     public void testApplyToCursorWithWriteModificationType() {
44         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
45         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
46
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));
52     }
53
54     @Test
55     public void testApplyToCursorWithDeleteModificationType() {
56         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
57         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
58
59         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
60         DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
61         verify(mockedCursor, times(1)).delete(isNull());
62     }
63
64     @Test
65     public void testApplyToCursorWithSubtreeModifiedModificationType() {
66         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
67         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
68
69         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
70
71         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
72         doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
73
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();
78
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();
84
85         doReturn(List.of(mockedChildNode1, mockedChildNode2, mockedChildNode3))
86             .when(mockedDataTreeCandidateNode).getChildNodes();
87
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));
92     }
93
94     @Test
95     public void testApplyToCursorWithUnsupportedModificationType() {
96         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
97         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
98
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"));
103     }
104
105     @Test
106     public void testApplyRootedNodeToCursorWithWriteModificationType() {
107         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
108         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
109
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));
116     }
117
118     @Test
119     public void testApplyRootedNodeToCursorWithDeleteModificationType() {
120         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
121         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
122
123         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
124         DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.empty(),
125             mockedDataTreeCandidateNode);
126         verify(mockedCursor, times(1)).delete(isNull());
127     }
128
129     @Test
130     public void testApplyRootedNodeToCursorWithSubtreeModifiedModificationType() {
131         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
132         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
133
134         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
135
136         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
137         doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
138         doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).getChildNodes();
139
140         DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.empty(),
141             mockedDataTreeCandidateNode);
142         verify(mockedCursor, times(1)).enter((PathArgument) isNull());
143         verify(mockedCursor, times(1)).delete(isNull());
144     }
145
146     @Test
147     public void testApplyRootedNodeToCursorWithUnsupportedModificationType() {
148         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
149         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
150
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"));
156     }
157
158     @Test
159     public void testApplyRootToCursorWithSubtreeModifiedModificationType() {
160         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
161         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
162
163         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
164
165         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
166         doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
167         doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).getChildNodes();
168
169         DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode);
170         verify(mockedCursor, times(1)).delete(isNull());
171     }
172
173     @Test
174     public void testApplyRootToCursorWithDeleteModificationType() {
175         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
176         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
177
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"));
182     }
183
184     @Test
185     public void testApplyRootToCursorWithUnsupportedModificationType() {
186         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
187         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
188
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"));
193     }
194 }