2 * Copyright (c) 2016 Cisco and/or its affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package io.fd.honeycomb.data.impl;
19 import static org.junit.Assert.fail;
20 import static org.mockito.Matchers.any;
21 import static org.mockito.Matchers.eq;
22 import static org.mockito.Mockito.atLeastOnce;
23 import static org.mockito.Mockito.inOrder;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.verifyNoMoreInteractions;
27 import static org.mockito.Mockito.when;
29 import com.google.common.collect.Lists;
30 import com.google.common.collect.Sets;
31 import io.fd.honeycomb.data.DataModification;
32 import io.fd.honeycomb.translate.impl.write.registry.FlatWriterRegistryBuilder;
33 import io.fd.honeycomb.translate.util.YangDAG;
34 import io.fd.honeycomb.translate.write.WriteContext;
35 import io.fd.honeycomb.translate.write.WriteFailedException;
36 import io.fd.honeycomb.translate.write.Writer;
37 import io.fd.honeycomb.translate.write.registry.WriterRegistry;
38 import java.util.ArrayList;
39 import java.util.Arrays;
40 import java.util.Collections;
41 import java.util.List;
43 import org.junit.Test;
44 import org.mockito.InOrder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.ComplexAugment;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.ComplexAugmentBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.ContainerWithChoice;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.ContainerWithChoiceBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.ContainerWithList;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.ContainerWithListBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.SimpleAugment;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.SimpleAugmentBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.SimpleContainer;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.SimpleContainerBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.choice.Choice;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.choice.choice.c3.C3;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.choice.choice.c3.C3Builder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.ListInContainer;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.ListInContainerBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.ListInContainerKey;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.list.in.container.ContainerInList;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.list.in.container.ContainerInListBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.list.in.container.container.in.list.NestedList;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.list.in.container.container.in.list.NestedListBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.list.list.in.container.container.in.list.NestedListKey;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.simple.container.ComplexAugmentContainer;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.simple.container.ComplexAugmentContainerBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.some.attributes.ContainerFromGrouping;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.some.attributes.ContainerFromGroupingBuilder;
70 import org.opendaylight.yangtools.yang.binding.DataObject;
71 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
72 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
73 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
74 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
75 import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
76 import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
77 import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
78 import io.fd.honeycomb.test.model.Ids;
81 * Testing honeycomb writes from data tree up to mocked writers.
83 public class HoneycombWriteInfraTest extends AbstractInfraTest {
85 private TipProducingDataTree dataTree;
86 private WriterRegistry writerRegistry;
88 Writer<SimpleContainer> simpleContainerWriter = mockWriter(Ids.SIMPLE_CONTAINER_ID);
89 Writer<ComplexAugment> complexAugmentWriter = mockWriter(Ids.COMPLEX_AUGMENT_ID);
90 Writer<ComplexAugmentContainer> complexAugmentContainerWriter = mockWriter(Ids.COMPLEX_AUGMENT_CONTAINER_ID);
91 Writer<SimpleAugment> simpleAugmentWriter = mockWriter(Ids.SIMPLE_AUGMENT_ID);
93 Writer<ContainerWithList> containerWithListWriter = mockWriter(Ids.CONTAINER_WITH_LIST_ID);
94 Writer<ListInContainer> listInContainerWriter = mockWriter(Ids.LIST_IN_CONTAINER_ID);
95 Writer<ContainerInList> containerInListWriter = mockWriter(Ids.CONTAINER_IN_LIST_ID);
96 Writer<NestedList> nestedListWriter = mockWriter(Ids.NESTED_LIST_ID);
98 Writer<ContainerWithChoice> containerWithChoiceWriter = mockWriter(Ids.CONTAINER_WITH_CHOICE_ID);
99 Writer<ContainerFromGrouping> containerFromGroupingWriter = mockWriter(Ids.CONTAINER_FROM_GROUPING_ID);
100 Writer<C3> c3Writer = mockWriter(Ids.C3_ID);
103 private static <D extends DataObject> Writer<D> mockWriter(final InstanceIdentifier<D> id) {
104 final Writer<D> mock = (Writer<D>) mock(Writer.class);
105 when(mock.getManagedDataObjectType()).thenReturn(id);
112 initWriterRegistry();
115 private void initDataTree() {
116 dataTree = InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
117 dataTree.setSchemaContext(schemaContext);
120 private void initWriterRegistry() {
121 writerRegistry = new FlatWriterRegistryBuilder(new YangDAG())
122 .add(complexAugmentWriter) // unordered
123 .add(nestedListWriter) // 6
124 .addAfter(listInContainerWriter, Ids.NESTED_LIST_ID) // 7
125 .addAfter(containerInListWriter, Ids.LIST_IN_CONTAINER_ID) // 8
126 .addAfter(containerWithListWriter, Ids.CONTAINER_IN_LIST_ID) // 9
127 .addBefore(containerFromGroupingWriter, Ids.NESTED_LIST_ID) // 5
128 .addBefore(containerWithChoiceWriter, Ids.CONTAINER_FROM_GROUPING_ID) // 4
129 .addBefore(simpleContainerWriter, Ids.CONTAINER_WITH_CHOICE_ID) // 3
130 .addBefore(c3Writer, Ids.SIMPLE_CONTAINER_ID) // 2
131 .addBefore(simpleAugmentWriter, Ids.SIMPLE_CONTAINER_ID) // 2
132 .addBefore(complexAugmentContainerWriter, Sets.newHashSet(Ids.C3_ID, Ids.SIMPLE_AUGMENT_ID)) // 1
137 public void testWriteEmptyNonPresenceContainer() throws Exception {
138 final ModifiableDataTreeDelegator modifiableDataTreeDelegator =
139 new ModifiableDataTreeDelegator(serializer, dataTree, schemaContext, writerRegistry, contextBroker);
141 final DataModification dataModification = modifiableDataTreeDelegator.newModification();
142 final SimpleContainer data = new SimpleContainerBuilder()
145 final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
146 serializer.toNormalizedNode(Ids.SIMPLE_CONTAINER_ID, data);
147 dataModification.write(normalizedNode.getKey(), normalizedNode.getValue());
149 dataModification.commit();
151 verify(simpleContainerWriter).getManagedDataObjectType();
152 verifyNoMoreInteractions(simpleContainerWriter);
156 public void testWriteEverything() throws Exception {
157 final ModifiableDataTreeDelegator modifiableDataTreeDelegator =
158 new ModifiableDataTreeDelegator(serializer, dataTree, schemaContext, writerRegistry, contextBroker);
160 final DataModification dataModification = modifiableDataTreeDelegator.newModification();
161 // Now write everything we can
162 writeSimpleContainer(dataModification);
163 writeContainerWithChoice(dataModification);
164 writeContainerWithList(dataModification);
165 dataModification.commit();
167 final Writer<?>[] orderedWriters = getOrderedWriters();
168 final InOrder inOrder = inOrder(orderedWriters);
169 verifyOrderedWrites(orderedWriters, inOrder);
172 private void verifyOrderedWrites(final Writer<?>[] orderedWriters, final InOrder inOrder)
173 throws WriteFailedException {
174 // Modifications are not produced for nodes that do not contain any actual leaves (except when choice is a child)
176 // verify(complexAugmentWriter).update(eq(COMPLEX_AUGMENT_ID), eq(null), eq(getComplexAugment()), any(WriteContext.class));
178 inOrder.verify(complexAugmentContainerWriter)
179 .processModification(eq(Ids.COMPLEX_AUGMENT_CONTAINER_ID), eq(null), eq(getComplexAugmentContainer()), any(WriteContext.class));
181 inOrder.verify(c3Writer)
182 .processModification(eq(Ids.C3_ID), eq(null), eq(getC3()), any(WriteContext.class));
184 verify(simpleAugmentWriter)
185 .processModification(eq(Ids.SIMPLE_AUGMENT_ID), eq(null), eq(getSimpleAugment()), any(WriteContext.class));
187 inOrder.verify(simpleContainerWriter)
188 .processModification(eq(Ids.SIMPLE_CONTAINER_ID), eq(null), eq(getSimpleContainer()), any(WriteContext.class));
190 inOrder.verify(containerWithChoiceWriter)
191 .processModification(eq(Ids.CONTAINER_WITH_CHOICE_ID), eq(null), eq(getContainerWithChoiceWithComplexCase()), any(WriteContext.class));
193 inOrder.verify(containerFromGroupingWriter)
194 .processModification(eq(Ids.CONTAINER_FROM_GROUPING_ID), eq(null), eq(getContainerFromGrouping()), any(WriteContext.class));
196 final KeyedInstanceIdentifier<ListInContainer, ListInContainerKey> keyedListInContainer1 =
197 Ids.CONTAINER_WITH_LIST_ID.child(ListInContainer.class, new ListInContainerKey((long) 1));
198 final KeyedInstanceIdentifier<NestedList, NestedListKey> keyedNestedList1 =
199 keyedListInContainer1.child(ContainerInList.class).child(NestedList.class, new NestedListKey("1"));
200 final KeyedInstanceIdentifier<ListInContainer, ListInContainerKey> keyedListInContainer2 =
201 Ids.CONTAINER_WITH_LIST_ID.child(ListInContainer.class, new ListInContainerKey((long) 2));
202 final KeyedInstanceIdentifier<NestedList, NestedListKey> keyedNestedList2 =
203 keyedListInContainer2.child(ContainerInList.class).child(NestedList.class, new NestedListKey("2"));
206 inOrder.verify(nestedListWriter)
207 .processModification(eq(keyedNestedList1), eq(null), eq(getSingleNestedList("1")), any(WriteContext.class));
208 verify(nestedListWriter)
209 .processModification(eq(keyedNestedList2), eq(null), eq(getSingleNestedList("2")), any(WriteContext.class));
212 inOrder.verify(listInContainerWriter)
213 .processModification(eq(keyedListInContainer1), eq(null), eq(getSingleListInContainer((long)1)), any(WriteContext.class));
214 verify(listInContainerWriter)
215 .processModification(eq(keyedListInContainer2), eq(null), eq(getSingleListInContainer((long)2)), any(WriteContext.class));
218 inOrder.verify(containerInListWriter)
219 .processModification(eq(keyedListInContainer1.child(ContainerInList.class)), eq(null), eq(getContainerInList("1")), any(WriteContext.class));
220 verify(containerInListWriter)
221 .processModification(eq(keyedListInContainer2.child(ContainerInList.class)), eq(null), eq(getContainerInList("2")), any(WriteContext.class));
223 // 9 - Ignored because the container has no leaves, only complex child nodes
224 // inOrder.verify(containerWithListWriter)
225 // .update(eq(CONTAINER_WITH_LIST_ID), eq(null), eq(getContainerWithList()), any(WriteContext.class));
227 for (Writer<?> orderedWriter : orderedWriters) {
228 verify(orderedWriter).getManagedDataObjectType();
229 verifyNoMoreInteractions(orderedWriter);
233 private Writer<?>[] getOrderedWriters() {
234 return new Writer<?>[]{complexAugmentWriter, // Unordered
235 complexAugmentContainerWriter, // 1
237 simpleAugmentWriter, // 2
238 simpleContainerWriter, // 3
239 containerWithChoiceWriter, // 4
240 containerFromGroupingWriter, // 5
241 nestedListWriter, // 6
242 listInContainerWriter, // 7
243 containerInListWriter, // 8
244 containerWithListWriter};
248 public void testDeletes() throws Exception {
249 final ModifiableDataTreeDelegator modifiableDataTreeDelegator =
250 new ModifiableDataTreeDelegator(serializer, dataTree, schemaContext, writerRegistry, contextBroker);
252 DataModification dataModification = modifiableDataTreeDelegator.newModification();
253 // Now write everything we can
254 writeSimpleContainer(dataModification);
255 writeContainerWithChoice(dataModification);
256 writeContainerWithList(dataModification);
257 dataModification.commit();
258 // Verify writes to be able to verifyNoMore interactions at the end
259 verifyOrderedWrites(getOrderedWriters(), inOrder(getOrderedWriters()));
261 dataModification = modifiableDataTreeDelegator.newModification();
262 deleteSimpleContainer(dataModification);
263 deleteContainerWithChoice(dataModification);
264 deleteContainerWithList(dataModification);
265 dataModification.commit();
267 final Writer<?>[] orderedWriters = getOrderedWriters();
268 Collections.reverse(Arrays.asList(orderedWriters));
269 final InOrder inOrder = inOrder(orderedWriters);
271 final KeyedInstanceIdentifier<ListInContainer, ListInContainerKey> keyedListInContainer1 =
272 Ids.CONTAINER_WITH_LIST_ID.child(ListInContainer.class, new ListInContainerKey((long) 1));
273 final KeyedInstanceIdentifier<NestedList, NestedListKey> keyedNestedList1 =
274 keyedListInContainer1.child(ContainerInList.class).child(NestedList.class, new NestedListKey("1"));
275 final KeyedInstanceIdentifier<ListInContainer, ListInContainerKey> keyedListInContainer2 =
276 Ids.CONTAINER_WITH_LIST_ID.child(ListInContainer.class, new ListInContainerKey((long) 2));
277 final KeyedInstanceIdentifier<NestedList, NestedListKey> keyedNestedList2 =
278 keyedListInContainer2.child(ContainerInList.class).child(NestedList.class, new NestedListKey("2"));
280 // Deletes are handled in reverse order
282 inOrder.verify(containerInListWriter)
283 .processModification(eq(keyedListInContainer1.child(ContainerInList.class)), eq(getContainerInList("1")), eq(null), any(WriteContext.class));
284 verify(containerInListWriter)
285 .processModification(eq(keyedListInContainer2.child(ContainerInList.class)), eq(getContainerInList("2")), eq(null), any(WriteContext.class));
288 inOrder.verify(listInContainerWriter)
289 .processModification(eq(keyedListInContainer1), eq(getSingleListInContainer((long)1)), eq(null), any(WriteContext.class));
290 verify(listInContainerWriter)
291 .processModification(eq(keyedListInContainer2), eq(getSingleListInContainer((long)2)), eq(null), any(WriteContext.class));
294 inOrder.verify(nestedListWriter)
295 .processModification(eq(keyedNestedList1), eq(getSingleNestedList("1")), eq(null), any(WriteContext.class));
296 verify(nestedListWriter)
297 .processModification(eq(keyedNestedList2), eq(getSingleNestedList("2")), eq(null), any(WriteContext.class));
299 inOrder.verify(containerFromGroupingWriter)
300 .processModification(eq(Ids.CONTAINER_FROM_GROUPING_ID), eq(getContainerFromGrouping()), eq(null), any(WriteContext.class));
302 inOrder.verify(containerWithChoiceWriter)
303 .processModification(eq(Ids.CONTAINER_WITH_CHOICE_ID), eq(getContainerWithChoiceWithComplexCase()), eq(null), any(WriteContext.class));
305 inOrder.verify(simpleContainerWriter)
306 .processModification(eq(Ids.SIMPLE_CONTAINER_ID), eq(getSimpleContainer()), eq(null), any(WriteContext.class));
308 verify(simpleAugmentWriter)
309 .processModification(eq(Ids.SIMPLE_AUGMENT_ID), eq(getSimpleAugment()), eq(null), any(WriteContext.class));
311 inOrder.verify(c3Writer)
312 .processModification(eq(Ids.C3_ID), eq(getC3()), eq(null), any(WriteContext.class));
314 inOrder.verify(complexAugmentContainerWriter)
315 .processModification(eq(Ids.COMPLEX_AUGMENT_CONTAINER_ID), eq(getComplexAugmentContainer()), eq(null), any(WriteContext.class));
317 for (Writer<?> orderedWriter : orderedWriters) {
318 verify(orderedWriter).getManagedDataObjectType();
319 verifyNoMoreInteractions(orderedWriter);
323 private void writeContainerWithList(final DataModification dataModification) {
324 final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
325 serializer.toNormalizedNode(Ids.CONTAINER_WITH_LIST_ID, getContainerWithList());
326 dataModification.write(normalizedNode.getKey(), normalizedNode.getValue());
329 private void deleteContainerWithList(final DataModification dataModification) {
330 dataModification.delete(serializer.toYangInstanceIdentifier(Ids.CONTAINER_WITH_LIST_ID));
333 private ContainerWithList getContainerWithList() {
334 return new ContainerWithListBuilder()
335 .setListInContainer(getListInContainer((long)1, (long)2))
339 private List<ListInContainer> getListInContainer(final Long... keys) {
340 final ArrayList<ListInContainer> objects = Lists.newArrayList();
341 for (Long key : keys) {
342 objects.add(getSingleListInContainer(key));
347 private ListInContainer getSingleListInContainer(final Long key) {
348 return new ListInContainerBuilder()
350 .setContainerInList(getContainerInList(Long.toString(key)))
354 private ContainerInList getContainerInList(String... nestedKeys) {
355 return new ContainerInListBuilder()
357 .setNestedList(getNestedList(nestedKeys))
361 private List<NestedList> getNestedList(String... keys) {
362 final ArrayList<NestedList> nestedList = new ArrayList<>();
363 for (String key : keys) {
364 nestedList.add(getSingleNestedList(key));
369 private NestedList getSingleNestedList(final String key) {
370 return new NestedListBuilder()
376 private void writeContainerWithChoice(final DataModification dataModification) {
377 writeContainerWithChoice(dataModification, getContainerWithChoiceWithComplexCase());
381 private void deleteContainerWithChoice(final DataModification dataModification) {
382 dataModification.delete(serializer.toYangInstanceIdentifier(Ids.CONTAINER_WITH_CHOICE_ID));
385 private void writeContainerWithChoice(final DataModification dataModification,
386 final ContainerWithChoice containerWithChoice) {
387 final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
388 serializer.toNormalizedNode(Ids.CONTAINER_WITH_CHOICE_ID, containerWithChoice);
389 dataModification.write(normalizedNode.getKey(), normalizedNode.getValue());
392 private ContainerWithChoice getContainerWithChoiceWithComplexCase() {
393 return new ContainerWithChoiceBuilder()
394 .setLeafFromGrouping("fromG")
396 .setContainerFromGrouping(getContainerFromGrouping())
397 .setChoice(getComplexCase())
401 private Choice getComplexCase() {
402 return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hc.test.rev150105.container.with.choice.choice.C3Builder()
408 return new C3Builder()
413 private void writeContainerFromGrouping(final DataModification dataModification) {
414 final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
415 serializer.toNormalizedNode(Ids.CONTAINER_FROM_GROUPING_ID, getContainerFromGrouping());
416 dataModification.write(normalizedNode.getKey(), normalizedNode.getValue());
419 private ContainerFromGrouping getContainerFromGrouping() {
420 return new ContainerFromGroupingBuilder()
421 .setLeafInContainerFromGrouping(111)
426 private void writeSimpleContainer(final DataModification dataModification) {
427 final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
428 serializer.toNormalizedNode(Ids.SIMPLE_CONTAINER_ID, getSimpleContainer());
429 dataModification.write(normalizedNode.getKey(), normalizedNode.getValue());
432 private void deleteSimpleContainer(final DataModification dataModification) {
433 final YangInstanceIdentifier yangId =
434 serializer.toYangInstanceIdentifier(Ids.SIMPLE_CONTAINER_ID);
435 dataModification.delete(yangId);
438 private SimpleContainer getSimpleContainer() {
439 return new SimpleContainerBuilder()
440 .setSimpleContainerName("n")
441 .addAugmentation(SimpleAugment.class, getSimpleAugment())
442 .addAugmentation(ComplexAugment.class, getComplexAugment())
446 private ComplexAugment getComplexAugment() {
447 return new ComplexAugmentBuilder()
448 .setComplexAugmentContainer(getComplexAugmentContainer())
452 private ComplexAugmentContainer getComplexAugmentContainer() {
453 return new ComplexAugmentContainerBuilder().setSomeLeaf("s").build();
456 private SimpleAugment getSimpleAugment() {
457 return new SimpleAugmentBuilder().setSimpleAugmentLeaf("a").build();
461 public void testWriteAndDeleteInTx() throws Exception {
462 final ModifiableDataTreeDelegator modifiableDataTreeDelegator =
463 new ModifiableDataTreeDelegator(serializer, dataTree, schemaContext, writerRegistry, contextBroker);
465 final DataModification dataModification = modifiableDataTreeDelegator.newModification();
466 // Now write everything we can
467 writeSimpleContainer(dataModification);
468 deleteSimpleContainer(dataModification);
469 dataModification.commit();
471 verify(simpleContainerWriter).getManagedDataObjectType();
473 verifyNoMoreInteractions(simpleContainerWriter);
477 public void testSubtreeWriter() throws Exception {
478 writerRegistry = new FlatWriterRegistryBuilder(new YangDAG())
479 // Handles also container from grouping
480 .subtreeAdd(Sets.newHashSet(Ids.CONTAINER_FROM_GROUPING_ID), containerWithChoiceWriter)
483 final ModifiableDataTreeDelegator modifiableDataTreeDelegator =
484 new ModifiableDataTreeDelegator(serializer, dataTree, schemaContext, writerRegistry, contextBroker);
486 final ContainerWithChoice containerWithChoice =
487 new ContainerWithChoiceBuilder().setContainerFromGrouping(getContainerFromGrouping()).build();
489 // Test write subtree node
490 DataModification dataModification = modifiableDataTreeDelegator.newModification();
491 writeContainerFromGrouping(dataModification);
492 dataModification.commit();
494 verify(containerWithChoiceWriter, atLeastOnce()).getManagedDataObjectType();
495 verify(containerWithChoiceWriter)
496 .processModification(eq(Ids.CONTAINER_WITH_CHOICE_ID), eq(null), eq(containerWithChoice), any(WriteContext.class));
497 verifyNoMoreInteractions(containerWithChoiceWriter);
499 // Test delete sub-node
500 dataModification = modifiableDataTreeDelegator.newModification();
501 final ContainerWithChoice containerWithChoiceEmpty = new ContainerWithChoiceBuilder().build();
502 deleteContainerFromGrouping(dataModification);
503 dataModification.commit();
505 verify(containerWithChoiceWriter, atLeastOnce()).getManagedDataObjectType();
506 verify(containerWithChoiceWriter)
507 .processModification(eq(Ids.CONTAINER_WITH_CHOICE_ID), eq(containerWithChoice), eq(containerWithChoiceEmpty), any(WriteContext.class));
508 verifyNoMoreInteractions(containerWithChoiceWriter);
510 // Test write with subtree node that's not handled by subtree writer
511 dataModification = modifiableDataTreeDelegator.newModification();
512 writeContainerWithChoice(dataModification);
514 dataModification.commit();
515 fail("Missing writer for C3 should occur");
516 } catch (IllegalArgumentException e) {
521 private void deleteContainerFromGrouping(final DataModification dataModification) {
522 dataModification.delete(serializer.toYangInstanceIdentifier(Ids.CONTAINER_FROM_GROUPING_ID));