1062a497840a9655add6fa0366b160df51d84165
[yangtools.git] / yang / yang-data-api / src / test / java / org / opendaylight / yangtools / yang / data / api / schema / tree / 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
9 package org.opendaylight.yangtools.yang.data.api.schema.tree;
10
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;
20
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;
29
30 public class DataTreeCandidatesTest {
31
32     @Test
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);
38
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: "));
45     }
46
47     @Test
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);
53
54         assertNotNull(dataTreeCandidate);
55         assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
56         assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
57         assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
58     }
59
60     @Test
61     public void testApplyToCursor() {
62         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
63         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
64
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));
70     }
71
72     @Test
73     public void testApplyToCursorAwareModification() {
74         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
75         final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
76
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();
83
84         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
85
86         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
87         verify(mockedModification, times(1)).createCursor(any(YangInstanceIdentifier.class));
88         verify(mockedCursor, times(1)).delete(any(PathArgument.class));
89
90         doReturn(Boolean.TRUE).when(mockedRootPath).isEmpty();
91         try {
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"));
96         }
97     }
98
99     @Test
100     public void testApplyToModificationWithDeleteModificationType() {
101         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
102         final DataTreeModification mockedModification = mock(DataTreeModification.class);
103
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();
108
109         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
110
111         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
112         verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
113     }
114
115     @Test
116     public void testApplyToModificationWithWriteModificationType() {
117         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
118         final DataTreeModification mockedModification = mock(DataTreeModification.class);
119
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();
126
127         doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
128
129         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
130         verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
131     }
132
133     @Test
134     public void testApplyToModificationWithSubtreeModifiedModificationType() {
135         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
136         final DataTreeModification mockedModification = mock(DataTreeModification.class);
137
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();
142
143         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
144
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();
149
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();
156
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();
167
168         final Collection<DataTreeCandidateNode> childNodes = ImmutableList.of(mockedChildNode1, mockedChildNode2,
169                 mockedChildNode3);
170         doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
171
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));
175     }
176
177     @Test
178     public void testApplyToModificationWithUnsupportedModificationType() {
179         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
180         final DataTreeModification mockedModification = mock(DataTreeModification.class);
181
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();
186
187         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
188
189         try {
190             DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
191             fail("An IllegalArgumentException should have been thrown!");
192         } catch (IllegalArgumentException ex) {
193             assertTrue(ex.getMessage().contains("Unsupported modification"));
194         }
195     }
196 }