f6a23434dc2f10c986fa5096fd824601e7c7c1fc
[mdsal.git] / dom / mdsal-dom-broker / src / test / java / org / opendaylight / mdsal / dom / broker / DOMDataTreeChangeListenerTest.java
1 /*
2  * Copyright (c) 2018 ZTE, 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.mdsal.dom.broker;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.ArgumentMatchers.any;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.timeout;
16 import static org.mockito.Mockito.times;
17 import static org.mockito.Mockito.verify;
18
19 import com.google.common.collect.Iterables;
20 import com.google.common.util.concurrent.MoreExecutors;
21 import java.util.List;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.mockito.ArgumentCaptor;
25 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
26 import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadWriteTransaction;
27 import org.opendaylight.mdsal.dom.spi.store.DOMStoreThreePhaseCommitCohort;
28 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
33 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
34 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
35
36 public class DOMDataTreeChangeListenerTest extends AbstractDatastoreTest {
37
38     private InMemoryDOMDataStore domStore;
39
40     @Before
41     public void setUp() {
42         domStore = new InMemoryDOMDataStore("Mdsal217", MoreExecutors.newDirectExecutorService());
43         domStore.onModelContextUpdated(SCHEMA_CONTEXT);
44     }
45
46     @Test
47     public void receiveOnDataInitialEventForEmptyRoot() throws Exception {
48         final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class);
49         doNothing().when(listener).onInitialData();
50
51         domStore.registerTreeChangeListener(YangInstanceIdentifier.of(), listener);
52         verify(listener, timeout(1000)).onInitialData();
53     }
54
55     @Test
56     public void receiveOnDataInitialEventForNonExistingData() throws Exception {
57         final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class);
58         final ArgumentCaptor<List> candidateCapture = ArgumentCaptor.forClass(List.class);
59         doNothing().when(listener).onInitialData();
60         doNothing().when(listener).onDataTreeChanged(any());
61
62         domStore.registerTreeChangeListener(TestModel.TEST_PATH, listener);
63         verify(listener, times(1)).onInitialData();
64
65         final NormalizedNode testNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME);
66         DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
67         assertNotNull(writeTx);
68         writeTx.write(TestModel.TEST_PATH, testNode);
69         DOMStoreThreePhaseCommitCohort cohort = writeTx.ready();
70         cohort.preCommit().get();
71         cohort.commit().get();
72
73         verify(listener, timeout(1000)).onDataTreeChanged(candidateCapture.capture());
74         final DataTreeCandidate candidate = (DataTreeCandidate) Iterables.getOnlyElement(candidateCapture.getValue());
75         assertEquals(TestModel.TEST_PATH, candidate.getRootPath());
76     }
77
78     @Test
79     public void receiveOnDataTreeChangedEventForPreExistingEmptyData() throws Exception {
80         final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class);
81         final ArgumentCaptor<List> candidateCapture = ArgumentCaptor.forClass(List.class);
82         doNothing().when(listener).onDataTreeChanged(any());
83
84         final NormalizedNode testNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME);
85
86         DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
87         assertNotNull(writeTx);
88         writeTx.write(TestModel.TEST_PATH, testNode);
89         DOMStoreThreePhaseCommitCohort cohort = writeTx.ready();
90         cohort.preCommit().get();
91         cohort.commit().get();
92
93         domStore.registerTreeChangeListener(TestModel.TEST_PATH, listener);
94
95         verify(listener, timeout(1000)).onDataTreeChanged(candidateCapture.capture());
96         final DataTreeCandidate candidate = (DataTreeCandidate) Iterables.getOnlyElement(candidateCapture.getValue());
97         assertEquals(TestModel.TEST_PATH, candidate.getRootPath());
98     }
99
100     @Test
101     public void receiveOnDataTreeChangeEventForPreExistingData() throws Exception {
102         final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class);
103         final ArgumentCaptor<List> candidateCapture = ArgumentCaptor.forClass(List.class);
104         doNothing().when(listener).onDataTreeChanged(any());
105
106         final ContainerNode testNode = Builders.containerBuilder()
107                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
108                 .addChild(ImmutableNodes.mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
109                         .addChild(ImmutableNodes.mapEntry(TestModel.OUTER_LIST_QNAME,
110                                 TestModel.ID_QNAME, 1)).build()).build();
111         DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
112         assertNotNull(writeTx);
113         writeTx.write(TestModel.TEST_PATH, testNode);
114         DOMStoreThreePhaseCommitCohort cohort = writeTx.ready();
115         cohort.preCommit().get();
116         cohort.commit().get();
117
118         domStore.registerTreeChangeListener(TestModel.TEST_PATH, listener);
119
120         verify(listener, timeout(1000)).onDataTreeChanged(candidateCapture.capture());
121         final DataTreeCandidate firstItem = (DataTreeCandidate) candidateCapture.getValue().iterator().next();
122         assertEquals(TestModel.TEST_PATH, firstItem.getRootPath());
123     }
124 }