2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer;
11 import java.util.Collections;
12 import java.util.HashSet;
14 import com.google.common.base.Optional;
15 import com.google.common.util.concurrent.Futures;
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.junit.runner.RunWith;
20 import org.mockito.Matchers;
21 import org.mockito.Mock;
22 import org.mockito.Mockito;
23 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
24 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
25 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
26 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
27 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.ServiceChainingUtil;
28 import org.opendaylight.yang.gen.v1.urn.ios.rev160308.ClassNameType;
29 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap;
30 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMapBuilder;
31 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ServiceChain;
32 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ServiceChainBuilder;
33 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.Class;
34 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.ClassBuilder;
35 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.ServicePathBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfName;
37 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfNameBuilder;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.powermock.api.mockito.PowerMockito;
41 import org.powermock.core.classloader.annotations.PrepareForTest;
42 import org.powermock.modules.junit4.PowerMockRunner;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
47 * Test for {@link PolicyWriterUtil}.
49 @RunWith(PowerMockRunner.class)
50 @PrepareForTest({PolicyWriterUtil.class, NetconfTransactionCreator.class, ServiceChainingUtil.class})
51 public class PolicyWriterUtilTest {
53 private static final Logger LOG = LoggerFactory.getLogger(PolicyWriterUtilTest.class);
55 private static final NodeId NODE_ID = new NodeId("unit-node-id-1");
56 private static final String POLICY_MAP_NAME = "unit-policy-map-name-1";
58 private DataBroker dataBroker;
60 private WriteTransaction wTx;
61 private java.util.Optional<WriteTransaction> wTxOptional;
63 private ReadOnlyTransaction rTx;
64 private java.util.Optional<ReadOnlyTransaction> rTxOptional;
67 public void setUp() throws Exception {
68 wTxOptional = java.util.Optional.of(wTx);
69 rTxOptional = java.util.Optional.of(rTx);
73 public void testWriteClassMaps() throws Exception {
74 LOG.debug("scenario: pass through with null classMapEntries collection");
75 Assert.assertTrue(PolicyWriterUtil.writeClassMaps(null, NODE_ID, dataBroker));
77 LOG.debug("scenario: pass through with empty classMapEntries collection");
78 final Set<ClassMap> classMapEntries = new HashSet<>();
79 Assert.assertTrue(PolicyWriterUtil.writeClassMaps(classMapEntries, NODE_ID, dataBroker));
81 LOG.debug("scenario: fail with one entry, no writeOnlyTransaction");
82 classMapEntries.add(new ClassMapBuilder().setName("unit-classMapEntry-name").build());
83 Assert.assertFalse(PolicyWriterUtil.writeClassMaps(classMapEntries, NODE_ID, dataBroker));
85 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, no readOnlyTransaction");
86 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
87 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
88 Assert.assertFalse(PolicyWriterUtil.writeClassMaps(classMapEntries, NODE_ID, dataBroker));
90 LOG.debug("scenario: succeed with one entry, available writeOnlyTransaction, available readOnlyTransaction");
91 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfReadOnlyTransaction")).toReturn(rTxOptional);
92 Mockito.when(rTx.read(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Matchers.<InstanceIdentifier<ClassMap>>any()))
93 .thenReturn(Futures.immediateCheckedFuture(Optional.of(
94 new ClassMapBuilder().setName("asd").build())));
95 Assert.assertTrue(PolicyWriterUtil.writeClassMaps(classMapEntries, NODE_ID, dataBroker));
97 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, available readOnlyTransaction, check->null");
98 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(null);
99 Assert.assertFalse(PolicyWriterUtil.writeClassMaps(classMapEntries, NODE_ID, dataBroker));
103 public void testRemoveClassMaps() throws Exception {
104 LOG.debug("scenario: pass through with null classMapEntries collection");
105 Assert.assertTrue(PolicyWriterUtil.removeClassMaps(null, NODE_ID, dataBroker));
107 LOG.debug("scenario: pass through with empty classMapEntries collection");
108 final Set<ClassMap> classMapEntries = new HashSet<>();
109 Assert.assertTrue(PolicyWriterUtil.removeClassMaps(classMapEntries, NODE_ID, dataBroker));
111 LOG.debug("scenario: fail with one entry, no writeOnlyTransaction");
112 classMapEntries.add(new ClassMapBuilder().setName("unit-classMapEntry-name").build());
113 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(new ClassBuilder().build());
114 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction"))
115 .toReturn(java.util.Optional.empty());
116 Assert.assertFalse(PolicyWriterUtil.removeClassMaps(classMapEntries, NODE_ID, dataBroker));
118 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, no readOnlyTransaction");
119 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
120 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
121 Assert.assertFalse(PolicyWriterUtil.removeClassMaps(classMapEntries, NODE_ID, dataBroker));
123 LOG.debug("scenario: succeed with one entry, available writeOnlyTransaction, available readOnlyTransaction");
124 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfReadOnlyTransaction")).toReturn(rTxOptional);
125 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(null);
126 Mockito.when(rTx.read(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Matchers.<InstanceIdentifier<ClassMap>>any()))
127 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
128 Assert.assertTrue(PolicyWriterUtil.removeClassMaps(classMapEntries, NODE_ID, dataBroker));
130 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, available readOnlyTransaction, check->false");
131 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(new ClassBuilder().build());
132 Assert.assertFalse(PolicyWriterUtil.removeClassMaps(classMapEntries, NODE_ID, dataBroker));
136 public void testWritePolicyMap() throws Exception {
137 final Set<Class> classEntries = new HashSet<>();
139 LOG.debug("scenario: fail with one entry, no writeOnlyTransaction");
140 classEntries.add(new ClassBuilder().setName(new ClassNameType("unit-classEntry-name")).build());
141 Assert.assertFalse(PolicyWriterUtil.writePolicyMap(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
143 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, no readOnlyTransaction");
144 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
145 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
146 Assert.assertFalse(PolicyWriterUtil.writePolicyMap(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
148 LOG.debug("scenario: fail with null classEntries collection");
150 PolicyWriterUtil.writePolicyMap(POLICY_MAP_NAME, null, NODE_ID, dataBroker);
151 Assert.fail("expected NPE caused by classEntries parameter");
152 } catch (Exception e) {
156 LOG.debug("scenario: fail with empty classEntries collection");
157 Assert.assertFalse(PolicyWriterUtil.writePolicyMap(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
159 LOG.debug("scenario: succeed with one entry, available writeOnlyTransaction, available readOnlyTransaction");
160 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfReadOnlyTransaction")).toReturn(rTxOptional);
161 Mockito.when(rTx.read(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Matchers.<InstanceIdentifier<ClassMap>>any()))
162 .thenReturn(Futures.immediateCheckedFuture(Optional.of(
163 new ClassMapBuilder().setName("asd").build())));
164 Assert.assertTrue(PolicyWriterUtil.writePolicyMap(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
166 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, available readOnlyTransaction, check->null");
167 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(null);
168 Assert.assertFalse(PolicyWriterUtil.writePolicyMap(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
172 public void testRemovePolicyMapEntries() throws Exception {
173 LOG.debug("scenario: pass through with null classEntries collection");
174 Assert.assertTrue(PolicyWriterUtil.removePolicyMapEntries(POLICY_MAP_NAME, null, NODE_ID, dataBroker));
176 LOG.debug("scenario: pass through with empty classEntries collection");
177 final Set<Class> classEntries = new HashSet<>();
178 Assert.assertTrue(PolicyWriterUtil.removePolicyMapEntries(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
180 LOG.debug("scenario: fail with one entry, no writeOnlyTransaction");
181 classEntries.add(new ClassBuilder().setName(new ClassNameType("unit-classMapEntry-name")).build());
182 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(new ClassBuilder().build());
183 Assert.assertFalse(PolicyWriterUtil.removePolicyMapEntries(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
185 LOG.debug("scenario: fail with one entry, available writeOnlyTransaction, no readOnlyTransaction");
186 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
187 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
188 Assert.assertTrue(PolicyWriterUtil.removePolicyMapEntries(POLICY_MAP_NAME, classEntries, NODE_ID, dataBroker));
192 public void testWriteInterface() throws Exception {
193 LOG.debug("scenario: fail with no writeOnlyTransaction");
194 final String interfaceName = "unit-interface-1";
195 Assert.assertFalse(PolicyWriterUtil.writeInterface(POLICY_MAP_NAME, interfaceName, NODE_ID, dataBroker));
197 LOG.debug("scenario: fail - available writeOnlyTransaction, no submit future");
198 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
199 Assert.assertFalse(PolicyWriterUtil.writeInterface(POLICY_MAP_NAME, interfaceName, NODE_ID, dataBroker));
201 LOG.debug("scenario: succeed - available writeOnlyTransaction, available future");
202 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
203 Assert.assertTrue(PolicyWriterUtil.writeInterface(POLICY_MAP_NAME, interfaceName, NODE_ID, dataBroker));
207 public void testWriteRemote() throws Exception {
208 LOG.debug("scenario: succeed with null List<ServiceFfName>");
209 Assert.assertTrue(PolicyWriterUtil.writeRemote(null, NODE_ID, dataBroker));
211 LOG.debug("scenario: succeed with empty List<ServiceFfName>");
212 Assert.assertTrue(PolicyWriterUtil.writeRemote(Collections.emptySet(), NODE_ID, dataBroker));
214 LOG.debug("scenario: fail with no writeOnlyTransaction");
215 final Set<ServiceFfName> remotes = Collections.singleton(new ServiceFfNameBuilder().build());
216 Assert.assertFalse(PolicyWriterUtil.writeRemote(remotes, NODE_ID, dataBroker));
218 LOG.debug("scenario: fail - available writeOnlyTransaction, no submit future");
219 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
220 Assert.assertFalse(PolicyWriterUtil.writeRemote(remotes, NODE_ID, dataBroker));
222 LOG.debug("scenario: succeed - available writeOnlyTransaction, available future");
223 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
224 Assert.assertTrue(PolicyWriterUtil.writeRemote(remotes, NODE_ID, dataBroker));
228 public void testWriteServicePaths() throws Exception {
229 LOG.debug("scenario: succeed with empty List<remote>");
230 Assert.assertTrue(PolicyWriterUtil.writeServicePaths(Collections.emptySet(), NODE_ID, dataBroker));
232 LOG.debug("scenario: fail with no writeOnlyTransaction");
233 final Set<ServiceChain> serviceChains = Collections.singleton(new ServiceChainBuilder()
234 .setServicePath(Collections.singletonList(new ServicePathBuilder()
235 .setServicePathId(42L)
238 Assert.assertFalse(PolicyWriterUtil.writeServicePaths(serviceChains, NODE_ID, dataBroker));
240 LOG.debug("scenario: fail - available writeOnlyTransaction, no submit future");
241 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
242 Assert.assertFalse(PolicyWriterUtil.writeServicePaths(serviceChains, NODE_ID, dataBroker));
244 LOG.debug("scenario: succeed - available writeOnlyTransaction, available future");
245 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
246 Assert.assertTrue(PolicyWriterUtil.writeServicePaths(serviceChains, NODE_ID, dataBroker));
250 public void testRemoveServicePaths() throws Exception {
251 LOG.debug("scenario: succeed with service path present null");
252 Assert.assertTrue(PolicyWriterUtil.removeServicePaths(null, NODE_ID, dataBroker));
254 LOG.debug("scenario: succeed with no service path present");
255 Assert.assertTrue(PolicyWriterUtil.removeServicePaths(Collections.emptySet(), NODE_ID, dataBroker));
257 LOG.debug("scenario: fail with service path present, no writeOnlyTransaction");
258 PowerMockito.stub(PowerMockito.method(PolicyWriterUtil.class, "netconfRead")).toReturn(new ClassBuilder().build());
259 final Set<ServiceChain> serviceChains = Collections.singleton(new ServiceChainBuilder()
260 .setServicePath(Collections.singletonList(new ServicePathBuilder()
261 .setServicePathId(42L)
264 Assert.assertFalse(PolicyWriterUtil.removeServicePaths(serviceChains, NODE_ID, dataBroker));
266 LOG.debug("scenario: fail with service path present, available writeOnlyTransaction, no submit future");
267 PowerMockito.stub(PowerMockito.method(NetconfTransactionCreator.class, "netconfWriteOnlyTransaction")).toReturn(wTxOptional);
268 Assert.assertFalse(PolicyWriterUtil.removeServicePaths(serviceChains, NODE_ID, dataBroker));
270 LOG.debug("scenario: fail with service path present, available writeOnlyTransaction, available future");
271 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
272 Assert.assertTrue(PolicyWriterUtil.removeServicePaths(serviceChains, NODE_ID, dataBroker));