Rename DOMDataTreeChangeService
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / BindingDOMTransactionChainAdapterTest.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.mdsal.binding.dom.adapter;
9
10 import static java.util.Objects.requireNonNull;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.Mockito.doCallRealMethod;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.verify;
17
18 import java.util.Collection;
19 import java.util.List;
20 import java.util.function.Function;
21 import org.junit.Before;
22 import org.junit.Rule;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.junit.runners.Parameterized;
26 import org.junit.runners.Parameterized.Parameters;
27 import org.mockito.Mock;
28 import org.mockito.junit.MockitoJUnit;
29 import org.mockito.junit.MockitoRule;
30 import org.mockito.quality.Strictness;
31 import org.opendaylight.mdsal.binding.api.DataBroker;
32 import org.opendaylight.mdsal.binding.api.TransactionChain;
33 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
34 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
35 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
36 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
37 import org.opendaylight.mdsal.dom.api.DOMService;
38 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
39 import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker;
40
41 @RunWith(Parameterized.class)
42 public class BindingDOMTransactionChainAdapterTest {
43     public enum TransactionChainType implements Function<DataBroker, TransactionChain> {
44         NORMAL {
45             @Override
46             public TransactionChain apply(final DataBroker broker) {
47                 return broker.createTransactionChain();
48             }
49
50             @Override
51             void mockRead(final DOMTransactionChain chain) {
52                 doReturn(mock(DOMDataTreeReadTransaction.class)).when(chain).newReadOnlyTransaction();
53             }
54
55             @Override
56             void mockWrite(final DOMTransactionChain chain) {
57                 doReturn(mock(DOMDataTreeWriteTransaction.class)).when(chain).newWriteOnlyTransaction();
58             }
59
60         },
61         MERGING {
62             @Override
63             public TransactionChain apply(final DataBroker broker) {
64                 return broker.createMergingTransactionChain();
65             }
66
67             @Override
68             void mockRead(final DOMTransactionChain chain) {
69                 mockReadWrite(chain);
70             }
71
72             @Override
73             void mockWrite(final DOMTransactionChain chain) {
74                 mockReadWrite(chain);
75             }
76         };
77
78         abstract void mockRead(DOMTransactionChain chain);
79
80         abstract void mockWrite(DOMTransactionChain chain);
81     }
82
83     @Rule
84     public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
85
86     @Parameters
87     public static Collection<Object[]> parameters() {
88         return List.of(new Object[] { TransactionChainType.NORMAL }, new Object[] { TransactionChainType.MERGING });
89     }
90
91     private final TransactionChainType type;
92
93     @Mock
94     private PingPongMergingDOMDataBroker domService;
95     @Mock
96     private DOMTransactionChain transactionChain;
97     @Mock
98     private BindingDOMCodecServices mockCodecRegistry;
99
100     private BindingDOMTransactionChainAdapter bindingDOMTransactionChainAdapter;
101
102     public BindingDOMTransactionChainAdapterTest(final TransactionChainType type) {
103         this.type = requireNonNull(type);
104     }
105
106     @Before
107     public void setUp() {
108         doReturn(transactionChain).when(domService).createTransactionChain();
109         if (type == TransactionChainType.MERGING) {
110             doCallRealMethod().when(domService).createMergingTransactionChain();
111         }
112
113
114         BindingDOMAdapterLoader bindingDOMAdapterLoader = new BindingDOMAdapterLoader(
115                 new ConstantAdapterContext(mockCodecRegistry)) {
116             @Override
117             protected DOMService<?, ?> getDelegate(final Class<? extends DOMService<?, ?>> reqDeleg) {
118                 return domService;
119             }
120         };
121
122         BindingDOMDataBrokerAdapter bindingDOMDataBrokerAdapter =
123                 (BindingDOMDataBrokerAdapter) bindingDOMAdapterLoader.load(DataBroker.class).orElseThrow();
124         bindingDOMTransactionChainAdapter =
125             (BindingDOMTransactionChainAdapter) type.apply(bindingDOMDataBrokerAdapter);
126         assertNotNull(bindingDOMTransactionChainAdapter.getDelegate());
127
128     }
129
130     static void mockReadWrite(final DOMTransactionChain chain) {
131         doReturn(mock(DOMDataTreeReadWriteTransaction.class)).when(chain).newReadWriteTransaction();
132     }
133
134     @Test
135     public void closeTest() {
136         doNothing().when(transactionChain).close();
137         bindingDOMTransactionChainAdapter.close();
138         verify(transactionChain).close();
139     }
140
141     @Test
142     public void readTransactionTest() throws Exception {
143         type.mockRead(transactionChain);
144         assertNotNull(bindingDOMTransactionChainAdapter.newReadOnlyTransaction());
145     }
146
147     @Test
148     public void writeTransactionTest() throws Exception {
149         type.mockWrite(transactionChain);
150         assertNotNull(bindingDOMTransactionChainAdapter.newWriteOnlyTransaction());
151     }
152
153     @Test
154     public void readWriteTransactionTest() throws Exception {
155         mockReadWrite(transactionChain);
156         assertNotNull(bindingDOMTransactionChainAdapter.newReadWriteTransaction());
157     }
158 }