Remove MountPointIdentifier
[yangtools.git] / data / yang-data-tree-spi / src / test / java / org / opendaylight / yangtools / yang / data / tree / spi / DataTreeCandidatesTest.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.CoreMatchers.instanceOf;
12 import static org.hamcrest.MatcherAssert.assertThat;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertSame;
15 import static org.junit.Assert.assertThrows;
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;
22
23 import java.util.List;
24 import java.util.Optional;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.opendaylight.yangtools.yang.common.QName;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
31 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 import org.opendaylight.yangtools.yang.data.tree.api.CursorAwareDataTreeModification;
33 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
34 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
35 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
36 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModificationCursor;
37 import org.opendaylight.yangtools.yang.data.tree.api.ModificationType;
38
39 @RunWith(MockitoJUnitRunner.StrictStubs.class)
40 public class DataTreeCandidatesTest {
41     private static final NodeIdentifier FOO = new NodeIdentifier(QName.create("foo", "foo"));
42
43     @Test
44     public void testNewDataTreeCandidate() {
45         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
46         final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(
47             YangInstanceIdentifier.empty(), mockedDataTreeCandidateNode);
48
49         assertThat(dataTreeCandidate, instanceOf(DefaultDataTreeCandidate.class));
50         assertSame(YangInstanceIdentifier.empty(), dataTreeCandidate.getRootPath());
51         assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
52         assertThat(dataTreeCandidate.toString(),
53             containsString("DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
54     }
55
56     @Test
57     public void testFromNormalizedNode() {
58         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
59         final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(
60             YangInstanceIdentifier.empty(), mockedNormalizedNode);
61
62         assertThat(dataTreeCandidate, instanceOf(DefaultDataTreeCandidate.class));
63         assertSame(YangInstanceIdentifier.empty(), dataTreeCandidate.getRootPath());
64         assertThat(dataTreeCandidate.getRootNode(), instanceOf(NormalizedNodeDataTreeCandidateNode.class));
65     }
66
67     @Test
68     public void testApplyToCursor() {
69         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
70         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
71
72         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
73         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
74         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
75         DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
76         verify(mockedCursor, times(1)).delete(isNull());
77     }
78
79     @Test
80     public void testApplyToCursorAwareModification() {
81         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
82         final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
83
84         doReturn(YangInstanceIdentifier.create(FOO)).when(mockedDataTreeCandidate).getRootPath();
85
86         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
87         doReturn(Optional.of(mockedCursor)).when(mockedModification).openCursor(YangInstanceIdentifier.empty());
88         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
89         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
90
91         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
92
93         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
94         verify(mockedModification, times(1)).openCursor(YangInstanceIdentifier.empty());
95         verify(mockedCursor, times(1)).delete(FOO);
96     }
97
98     @Test
99     public void testApplyToCursorAwareModificationRoot() {
100         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
101         final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
102         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
103         doReturn(YangInstanceIdentifier.empty()).when(mockedDataTreeCandidate).getRootPath();
104         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
105         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
106
107         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
108             () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
109         assertEquals("Can not delete root.", thrown.getMessage());
110     }
111
112     @Test
113     public void testApplyToModificationWithDeleteModificationType() {
114         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
115         final DataTreeModification mockedModification = mock(DataTreeModification.class);
116
117         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
118         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
119         doReturn(YangInstanceIdentifier.empty()).when(mockedDataTreeCandidate).getRootPath();
120
121         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
122
123         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
124         verify(mockedModification, times(1)).delete(YangInstanceIdentifier.empty());
125     }
126
127     @Test
128     public void testApplyToModificationWithWriteModificationType() {
129         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
130         final DataTreeModification mockedModification = mock(DataTreeModification.class);
131
132         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
133         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
134         doReturn(YangInstanceIdentifier.empty()).when(mockedDataTreeCandidate).getRootPath();
135         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
136         doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
137
138         doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
139
140         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
141         verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
142     }
143
144     @Test
145     public void testApplyToModificationWithSubtreeModifiedModificationType() {
146         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
147         final DataTreeModification mockedModification = mock(DataTreeModification.class);
148
149         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
150         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
151         doReturn(YangInstanceIdentifier.empty()).when(mockedDataTreeCandidate).getRootPath();
152
153         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
154
155         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
156         doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
157         doReturn(new NodeIdentifier(QName.create("test", "test1"))).when(mockedChildNode1).getIdentifier();
158
159         final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
160         doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
161         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
162         doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
163         doReturn(new NodeIdentifier(QName.create("test", "test2"))).when(mockedChildNode2).getIdentifier();
164
165         final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
166         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
167         final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
168         doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
169         doReturn(new NodeIdentifier(QName.create("test", "test3"))).when(mockedChildNode3).getIdentifier();
170         doReturn(new NodeIdentifier(QName.create("test", "test4"))).when(mockedChildNode3ChildNode).getIdentifier();
171         doReturn(List.of(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
172
173         final List<DataTreeCandidateNode> childNodes = List.of(mockedChildNode1, mockedChildNode2, mockedChildNode3);
174         doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
175
176         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
177         verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
178         verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
179     }
180
181     @Test
182     public void testApplyToModificationWithUnsupportedModificationType() {
183         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
184         final DataTreeModification mockedModification = mock(DataTreeModification.class);
185
186         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
187         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
188         doReturn(YangInstanceIdentifier.empty()).when(mockedDataTreeCandidate).getRootPath();
189
190         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
191
192         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
193             () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
194         assertThat(ex.getMessage(), containsString("Unsupported modification"));
195     }
196 }