f486edd04cf920835525fe4241e2084ea96f614d
[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.base.Optional;
22 import com.google.common.collect.Lists;
23 import java.util.Collection;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
27 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
28
29 public class DataTreeCandidatesTest {
30
31     @Test
32     public void testNewDataTreeCandidate() {
33         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
34         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
35         final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.newDataTreeCandidate(mockedRootPath,
36                 mockedDataTreeCandidateNode);
37
38         assertNotNull(dataTreeCandidate);
39         assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
40         assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
41         assertEquals(mockedDataTreeCandidateNode, dataTreeCandidate.getRootNode());
42         assertTrue(dataTreeCandidate.toString().contains(
43                 "DefaultDataTreeCandidate{rootPath=/, rootNode=Mock for DataTreeCandidateNode, hashCode: "));
44     }
45
46     @Test
47     public void testFromNormalizedNode() {
48         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
49         final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
50         final DataTreeCandidate dataTreeCandidate = DataTreeCandidates.fromNormalizedNode(mockedRootPath,
51                 mockedNormalizedNode);
52
53         assertNotNull(dataTreeCandidate);
54         assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
55         assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
56         assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
57     }
58
59     @Test
60     public void testApplyToCursor() {
61         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
62         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
63
64         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
65         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
66         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
67         DataTreeCandidates.applyToCursor(mockedCursor, mockedDataTreeCandidate);
68         verify(mockedCursor, times(1)).delete(any(PathArgument.class));
69     }
70
71     @Test
72     public void testApplyToCursorAwareModification() {
73         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
74         final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
75
76         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
77         doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
78         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
79         doReturn(mockedCursor).when(mockedModification).createCursor(any(YangInstanceIdentifier.class));
80         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
81         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
82
83         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
84
85         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
86         verify(mockedModification, times(1)).createCursor(any(YangInstanceIdentifier.class));
87         verify(mockedCursor, times(1)).delete(any(PathArgument.class));
88
89         doReturn(Boolean.TRUE).when(mockedRootPath).isEmpty();
90         try {
91             DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
92             fail("An IllegalArgumentException should have been thrown!");
93         } catch (IllegalArgumentException ex) {
94             assertTrue(ex.getMessage().contains("Can not delete root"));
95         }
96     }
97
98     @Test
99     public void testApplyToModificationWithDeleteModificationType() {
100         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
101         final DataTreeModification mockedModification = mock(DataTreeModification.class);
102
103         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
104         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
105         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
106         doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
107
108         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
109
110         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
111         verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
112     }
113
114     @Test
115     public void testApplyToModificationWithWriteModificationType() {
116         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
117         final DataTreeModification mockedModification = mock(DataTreeModification.class);
118
119         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
120         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
121         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
122         doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
123         final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
124         doReturn(Optional.of(mockedNormalizedNode)).when(mockedDataTreeCandidateNode).getDataAfter();
125
126         doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
127
128         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
129         verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
130     }
131
132     @Test
133     public void testApplyToModificationWithSubtreeModifiedModificationType() {
134         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
135         final DataTreeModification mockedModification = mock(DataTreeModification.class);
136
137         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
138         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
139         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
140         doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
141
142         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
143
144         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
145         doReturn(ModificationType.DELETE).when(mockedChildNode1).getModificationType();
146         final PathArgument mockedPathArgument1 = mock(PathArgument.class);
147         doReturn(mockedPathArgument1).when(mockedChildNode1).getIdentifier();
148
149         final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
150         doReturn(ModificationType.WRITE).when(mockedChildNode2).getModificationType();
151         final NormalizedNode<?, ?> mockedNormalizedNode = mock(NormalizedNode.class);
152         doReturn(Optional.of(mockedNormalizedNode)).when(mockedChildNode2).getDataAfter();
153         final PathArgument mockedPathArgument2 = mock(PathArgument.class);
154         doReturn(mockedPathArgument2).when(mockedChildNode2).getIdentifier();
155
156         final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
157         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).getModificationType();
158         final PathArgument mockedPathArgument3 = mock(PathArgument.class);
159         doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
160         final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
161         doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).getModificationType();
162         final PathArgument mockedPathArgument31 = mock(PathArgument.class);
163         doReturn(mockedPathArgument3).when(mockedChildNode3).getIdentifier();
164         doReturn(mockedPathArgument31).when(mockedChildNode3ChildNode).getIdentifier();
165         doReturn(Lists.newArrayList(mockedChildNode3ChildNode)).when(mockedChildNode3).getChildNodes();
166
167         final Collection<DataTreeCandidateNode> childNodes = Lists.newArrayList(mockedChildNode1, mockedChildNode2,
168                 mockedChildNode3);
169         doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
170
171         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
172         verify(mockedModification, times(2)).delete(any(YangInstanceIdentifier.class));
173         verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
174     }
175
176     @Test
177     public void testApplyToModificationWithUnsupportedModificationType() {
178         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
179         final DataTreeModification mockedModification = mock(DataTreeModification.class);
180
181         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
182         doReturn(mockedDataTreeCandidateNode).when(mockedDataTreeCandidate).getRootNode();
183         final YangInstanceIdentifier mockedRootPath = mock(YangInstanceIdentifier.class);
184         doReturn(mockedRootPath).when(mockedDataTreeCandidate).getRootPath();
185
186         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
187
188         try {
189             DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
190             fail("An IllegalArgumentException should have been thrown!");
191         } catch (IllegalArgumentException ex) {
192             assertTrue(ex.getMessage().contains("Unsupported modification"));
193         }
194     }
195 }