Do not pretty-print body class
[yangtools.git] / data / 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 package org.opendaylight.yangtools.yang.data.api.schema.tree;
9
10 import static org.hamcrest.CoreMatchers.containsString;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertThrows;
15 import static org.junit.Assert.assertTrue;
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 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;
31
32 public class DataTreeCandidatesTest {
33
34     @Test
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);
40
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: "));
47     }
48
49     @Test
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);
55
56         assertNotNull(dataTreeCandidate);
57         assertTrue(dataTreeCandidate instanceof DefaultDataTreeCandidate);
58         assertEquals(mockedRootPath, dataTreeCandidate.getRootPath());
59         assertTrue(dataTreeCandidate.getRootNode() instanceof NormalizedNodeDataTreeCandidateNode);
60     }
61
62     @Test
63     public void testApplyToCursor() {
64         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
65         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
66
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());
72     }
73
74     @Test
75     public void testApplyToCursorAwareModification() {
76         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
77         final CursorAwareDataTreeModification mockedModification = mock(CursorAwareDataTreeModification.class);
78
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();
83
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();
88
89         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
90
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());
95     }
96
97     @Test
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();
107
108         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
109             () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
110         assertEquals("Can not delete root.", thrown.getMessage());
111     }
112
113     @Test
114     public void testApplyToModificationWithDeleteModificationType() {
115         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
116         final DataTreeModification mockedModification = mock(DataTreeModification.class);
117
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();
122
123         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).getModificationType();
124
125         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
126         verify(mockedModification, times(1)).delete(any(YangInstanceIdentifier.class));
127     }
128
129     @Test
130     public void testApplyToModificationWithWriteModificationType() {
131         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
132         final DataTreeModification mockedModification = mock(DataTreeModification.class);
133
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();
140
141         doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).getModificationType();
142
143         DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate);
144         verify(mockedModification, times(1)).write(any(YangInstanceIdentifier.class), any(NormalizedNode.class));
145     }
146
147     @Test
148     public void testApplyToModificationWithSubtreeModifiedModificationType() {
149         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
150         final DataTreeModification mockedModification = mock(DataTreeModification.class);
151
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();
156
157         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).getModificationType();
158
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();
163
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();
170
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();
181
182         final Collection<DataTreeCandidateNode> childNodes = ImmutableList.of(mockedChildNode1, mockedChildNode2,
183                 mockedChildNode3);
184         doReturn(childNodes).when(mockedDataTreeCandidateNode).getChildNodes();
185
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));
189     }
190
191     @Test
192     public void testApplyToModificationWithUnsupportedModificationType() {
193         final DataTreeCandidate mockedDataTreeCandidate = mock(DataTreeCandidate.class);
194         final DataTreeModification mockedModification = mock(DataTreeModification.class);
195
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();
200
201         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).getModificationType();
202
203         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
204             () -> DataTreeCandidates.applyToModification(mockedModification, mockedDataTreeCandidate));
205         assertThat(ex.getMessage(), containsString("Unsupported modification"));
206     }
207 }