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.assertTrue;
14 import static org.junit.Assert.fail;
15 import static org.mockito.Matchers.any;
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 com.google.common.collect.ImmutableList;
22 import java.util.Collection;
23 import java.util.Collections;
24 import java.util.Optional;
25 import org.junit.Test;
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;
30 public class DataTreeCandidatesTest {
33 public void testNewDataTreeCandidate() {
34 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
35 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
36 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(mockedRootPath,
37 mockedDataTreeCandidateNode);
39 assertNotNull(dataTreeCandidate);
40 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
41 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
42 assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
43 assertTrue(dataTreeCandidate.toString().contains(
44 "DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
48 public void testFromNormalizedNode() {
49 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
50 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
51 final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(mockedRootPath,
52 mockedNormalizedNode);
54 assertNotNull(dataTreeCandidate);
55 assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
56 assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
57 assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
61 public void testApplyToCursor() {
62 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
63 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
65 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
66 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
67 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
68 DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
69 verify(mockedCursor, times(1)).delete(any(PathArgument.class));
73 public void testApplyToCursorAwareModification() {
74 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
75 final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
77 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
78 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
79 final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
80 doReturn(mockedCursor).when(mockedModification).createCursor(any(YangInstanceIdentifier.class));
81 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
82 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
84 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
86 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
87 verify(mockedModification, times(1)).createCursor(any(YangInstanceIdentifier.class));
88 verify(mockedCursor, times(1)).delete(any(PathArgument.class));
90 doReturn(Boolean.TRUE).when(mockedRootPath).isEmpty();
92 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
93 fail("An IllegalArgumentException should have been thrown!");
94 } catch (IllegalArgumentException ex) {
95 assertTrue(ex.getMessage().contains("Can not delete root"));
100 public void testApplyToModificationWithDeleteModificationType() {
101 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
102 final DataTreeModification mockedModification = mock(DataTreeModification.class);
104 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
105 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
106 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
107 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
109 doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
111 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
112 verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
116 public void testApplyToModificationWithWriteModificationType() {
117 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
118 final DataTreeModification mockedModification = mock(DataTreeModification.class);
120 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
121 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
122 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
123 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
124 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
125 doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
127 doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
129 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
130 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
134 public void testApplyToModificationWithSubtreeModifiedModificationType() {
135 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
136 final DataTreeModification mockedModification = mock(DataTreeModification.class);
138 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
139 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
140 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
141 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
143 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
145 final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
146 doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
147 final PathArgument mockedPathArgument1 = mock(PathArgument.class);
148 doReturn(mockedPathArgument1).when(mockedChildNode1).getIdentifier();
150 final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
151 doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
152 final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
153 doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
154 final PathArgument mockedPathArgument2 = mock(PathArgument.class);
155 doReturn(mockedPathArgument2).when(mockedChildNode2).getIdentifier();
157 final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
158 doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
159 final PathArgument mockedPathArgument3 = mock(PathArgument.class);
160 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
161 final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
162 doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
163 final PathArgument mockedPathArgument31 = mock(PathArgument.class);
164 doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
165 doReturn(mockedPathArgument31).when(mockedChildNode3ChildNode).getIdentifier();
166 doReturn(Collections.singletonList(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
168 final Collection<DataTreeCandidateNode> childNodes = ImmutableList.of(mockedChildNode1, mockedChildNode2,
170 doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
172 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
173 verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
174 verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
178 public void testApplyToModificationWithUnsupportedModificationType() {
179 final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
180 final DataTreeModification mockedModification = mock(DataTreeModification.class);
182 final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
183 doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
184 final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
185 doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
187 doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
190 DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
191 fail("An IllegalArgumentException should have been thrown!");
192 } catch (IllegalArgumentException ex) {
193 assertTrue(ex.getMessage().contains("Unsupported modification"));