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
9 package org.opendaylight.yangtools.yang.data.api.schema.tree;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertThrows;
14 import static org.junit.Assert.assertTrue;
15 import static org.junit.Assert.fail;
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 com.google.common.collect.ImmutableList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.Optional;
27 import org.junit.Test;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
30 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 public class DataTreeCandidatesTest {
35 public void testNewDataTreeCandidate() {
36 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
37 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
38 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(mockedRootPath,
39 mockedDataTreeCandidateNode);
41 assertNotNull(dataTreeCandidate);
42 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
43 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
44 assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
45 assertTrue(dataTreeCandidate.toString().contains(
46 "DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
50 public void testFromNormalizedNode() {
51 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
52 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
53 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(mockedRootPath,
54 mockedNormalizedNode);
56 assertNotNull(dataTreeCandidate);
57 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
58 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
59 assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
63 public void testApplyToCursor() {
64 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
65 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
67 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
68 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
69 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
70 DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
71 verify(mockedCursor, times(1)).delete(isNull());
75 public void testApplyToCursorAwareModification() {
76 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
77 final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
79 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
80 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
81 final YangInstanceIdentifier mockedRootPathParent = mock(YangInstanceIdentifier.class);
82 doReturn(mockedRootPathParent).when(mockedRootPath).getParent();
84 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
85 doReturn(Optional.of(mockedCursor)).when(mockedModification).openCursor(mockedRootPathParent);
86 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
87 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
89 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
91 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
92 verify(mockedRootPath, times(1)).getParent();
93 verify(mockedModification, times(1)).openCursor(mockedRootPathParent);
94 verify(mockedCursor, times(1)).delete(isNull());
98 public void testApplyToCursorAwareModificationRoot() {
99 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
100 final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
101 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
102 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
103 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
104 doReturn(null).when(mockedRootPath).getParent();
105 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
106 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
108 IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
109 () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
110 assertEquals("Can not delete root.", thrown.getMessage());
114 public void testApplyToModificationWithDeleteModificationType() {
115 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
116 final DataTreeModification mockedModification = mock(DataTreeModification.class);
118 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
119 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
120 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
121 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
123 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
125 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
126 verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
130 public void testApplyToModificationWithWriteModificationType() {
131 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
132 final DataTreeModification mockedModification = mock(DataTreeModification.class);
134 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
135 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
136 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
137 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
138 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
139 doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
141 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
143 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
144 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
148 public void testApplyToModificationWithSubtreeModifiedModificationType() {
149 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
150 final DataTreeModification mockedModification = mock(DataTreeModification.class);
152 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
153 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
154 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
155 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
157 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
159 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
160 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
161 final PathArgument mockedPathArgument1 = mock(PathArgument.class);
162 doReturn(mockedPathArgument1).when(mockedChildNode1).getIdentifier();
164 final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
165 doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
166 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
167 doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
168 final PathArgument mockedPathArgument2 = mock(PathArgument.class);
169 doReturn(mockedPathArgument2).when(mockedChildNode2).getIdentifier();
171 final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
172 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
173 final PathArgument mockedPathArgument3 = mock(PathArgument.class);
174 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
175 final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
176 doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
177 final PathArgument mockedPathArgument31 = mock(PathArgument.class);
178 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
179 doReturn(mockedPathArgument31).when(mockedChildNode3ChildNode).getIdentifier();
180 doReturn(Collections.singletonList(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
182 final Collection<DataTreeCandidateNode> childNodes = ImmutableList.of(mockedChildNode1, mockedChildNode2,
184 doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
186 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
187 verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
188 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
192 public void testApplyToModificationWithUnsupportedModificationType() {
193 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
194 final DataTreeModification mockedModification = mock(DataTreeModification.class);
196 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
197 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
198 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
199 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
201 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
204 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
205 fail("An IllegalArgumentException should have been thrown!");
206 } catch (IllegalArgumentException ex) {
207 assertTrue(ex.getMessage().contains("Unsupported modification"));