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
8 package org.opendaylight.groupbasedpolicy.sf;
10 import java.util.Collection;
11 import java.util.List;
13 import org.junit.Assert;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.mockito.Mockito;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.groupbasedpolicy.api.PolicyValidatorRegistry;
20 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
21 import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;
22 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
23 import org.opendaylight.groupbasedpolicy.test.GbpDataBrokerTest;
24 import org.opendaylight.groupbasedpolicy.util.IidFactory;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definition.Parameter;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinitionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinition;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinitionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
35 import com.google.common.base.MoreObjects;
36 import com.google.common.base.Optional;
37 import com.google.common.collect.ImmutableList;
39 public class SupportedClassifierDefinitionListenerTest extends GbpDataBrokerTest {
41 private SupportedClassifierDefinitionListener listener;
42 private PolicyValidatorRegistry policyValidatorRegistry;
46 policyValidatorRegistry = Mockito.mock(PolicyValidatorRegistry.class);
47 listener = new SupportedClassifierDefinitionListener(getDataBroker(), policyValidatorRegistry);
51 public void testSetParentValidators_newValidatorHasParent_parentValidatorExists() {
52 RendererName rendererFoo = new RendererName("Foo");
53 SupportedClassifierDefinition supportedIpProtoPort = new SupportedClassifierDefinitionBuilder()
54 .setClassifierDefinitionId(IpProtoClassifierDefinition.ID).build();
55 ClassifierInstanceValidator rendererFooIpProtoParentValidator =
56 new ClassifierInstanceValidator(supportedIpProtoPort, rendererFoo);
57 listener.validatorByRendererAndCd.put(rendererFoo, IpProtoClassifierDefinition.ID,
58 rendererFooIpProtoParentValidator);
59 SupportedClassifierDefinition supportedL4SrcPort =
60 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
61 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
63 ClassifierInstanceValidator rendererFooL4SrcPortNewValidator =
64 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo);
65 listener.validatorByRendererAndCd.put(rendererFoo, L4ClassifierDefinition.ID, rendererFooL4SrcPortNewValidator);
66 listener.setParentValidators(rendererFooL4SrcPortNewValidator, false);
67 Assert.assertEquals(rendererFooIpProtoParentValidator, rendererFooL4SrcPortNewValidator.getParentValidator());
69 listener.setParentValidators(rendererFooL4SrcPortNewValidator, true);
70 Assert.assertNull(rendererFooIpProtoParentValidator.getParentValidator());
74 public void testSetParentValidators_newValidatorHasParent_parentValidatorNotExists() {
75 RendererName rendererFoo = new RendererName("Foo");
76 SupportedClassifierDefinition supportedL4SrcPort =
77 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
78 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
80 ClassifierInstanceValidator rendererFooL4SrcPortNewValidator =
81 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo);
82 listener.validatorByRendererAndCd.put(rendererFoo, L4ClassifierDefinition.ID, rendererFooL4SrcPortNewValidator);
84 listener.setParentValidators(rendererFooL4SrcPortNewValidator, false);
85 Assert.assertNull(rendererFooL4SrcPortNewValidator.getParentValidator());
87 SupportedClassifierDefinition supportedIpProtoPort = new SupportedClassifierDefinitionBuilder()
88 .setClassifierDefinitionId(IpProtoClassifierDefinition.ID).build();
89 ClassifierInstanceValidator rendererFooIpProtoParentValidator =
90 new ClassifierInstanceValidator(supportedIpProtoPort, rendererFoo);
91 listener.validatorByRendererAndCd.put(rendererFoo, IpProtoClassifierDefinition.ID,
92 rendererFooIpProtoParentValidator);
94 listener.setParentValidators(rendererFooL4SrcPortNewValidator, false);
95 Assert.assertEquals(rendererFooIpProtoParentValidator, rendererFooL4SrcPortNewValidator.getParentValidator());
97 listener.setParentValidators(rendererFooL4SrcPortNewValidator, true);
98 Assert.assertNull(rendererFooIpProtoParentValidator.getParentValidator());
102 public void testGetValidatorsWithParentCdForRenderer() {
103 List<SupportedParameterValues> srcPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
104 .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)).build());
105 SupportedClassifierDefinition supportedL4SrcPort =
106 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
107 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
108 .setSupportedParameterValues(srcPortParam)
110 RendererName rendererFoo = new RendererName("Foo");
111 ClassifierInstanceValidator rendererFooL4SrcPortValidator =
112 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo);
113 listener.validatorByRendererAndCd.put(rendererFoo, supportedL4SrcPort.getClassifierDefinitionId(),
114 rendererFooL4SrcPortValidator);
115 List<SupportedParameterValues> dstPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
116 .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build());
117 SupportedClassifierDefinition supportedL4DstPort =
118 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
119 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
120 .setSupportedParameterValues(dstPortParam)
122 RendererName rendererBar = new RendererName("Bar");
123 ClassifierInstanceValidator rendererBarL4DstPortValidator =
124 new ClassifierInstanceValidator(supportedL4DstPort, rendererBar);
125 listener.validatorByRendererAndCd.put(rendererBar, supportedL4DstPort.getClassifierDefinitionId(),
126 rendererBarL4DstPortValidator);
128 Collection<ClassifierInstanceValidator> validatorsWithParentIpProtoCdForRendererFoo =
129 listener.getValidatorsWithParentCdForRenderer(IpProtoClassifierDefinition.ID, rendererFoo);
130 Assert.assertNotNull(validatorsWithParentIpProtoCdForRendererFoo);
131 Assert.assertEquals(validatorsWithParentIpProtoCdForRendererFoo.size(), 1);
132 Assert.assertTrue(validatorsWithParentIpProtoCdForRendererFoo.contains(rendererFooL4SrcPortValidator));
136 public void testGetAllSupportedParams() {
137 List<SupportedParameterValues> srcPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
138 .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)).build());
139 SupportedClassifierDefinition supportedL4SrcPort = new SupportedClassifierDefinitionBuilder()
140 .setClassifierDefinitionId(L4ClassifierDefinition.ID).setSupportedParameterValues(srcPortParam).build();
141 RendererName rendererFoo = new RendererName("Foo");
142 listener.validatorByRendererAndCd.put(rendererFoo, supportedL4SrcPort.getClassifierDefinitionId(),
143 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo));
144 List<SupportedParameterValues> dstPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
145 .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build());
146 SupportedClassifierDefinition supportedL4DstPort = new SupportedClassifierDefinitionBuilder()
147 .setClassifierDefinitionId(L4ClassifierDefinition.ID).setSupportedParameterValues(dstPortParam).build();
148 RendererName rendererBar = new RendererName("Bar");
149 listener.validatorByRendererAndCd.put(rendererBar, supportedL4DstPort.getClassifierDefinitionId(),
150 new ClassifierInstanceValidator(supportedL4DstPort, rendererBar));
152 List<ParameterName> allSupportedParams = listener.getAllSupportedParams(L4ClassifierDefinition.ID);
153 Assert.assertTrue(allSupportedParams.contains(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)));
154 Assert.assertTrue(allSupportedParams.contains(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)));
158 public void testCreateClassifierDefinitionWithUnionOfParams_allSupportedParams() {
159 List<ParameterName> supportedParams =
160 ImmutableList.of(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
161 ClassifierDefinition classifierDefinitionWithUnionOfParams = listener
162 .createClassifierDefinitionWithUnionOfParams(EtherTypeClassifierDefinition.DEFINITION, supportedParams);
163 assertEquals(EtherTypeClassifierDefinition.DEFINITION, classifierDefinitionWithUnionOfParams);
167 public void testCreateClassifierDefinitionWithUnionOfParams_emptySupportedParams() {
168 List<ParameterName> supportedParams = ImmutableList.of();
169 ClassifierDefinition classifierDefinitionWithUnionOfParams = listener
170 .createClassifierDefinitionWithUnionOfParams(EtherTypeClassifierDefinition.DEFINITION, supportedParams);
171 Assert.assertNull(classifierDefinitionWithUnionOfParams);
175 public void testCreateClassifierDefinitionWithUnionOfParams_someSupportedParams() {
176 ImmutableList<ParameterName> supportedParams =
177 ImmutableList.of(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM),
178 new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM));
179 ClassifierDefinition classifierDefinitionWithUnionOfParams = listener
180 .createClassifierDefinitionWithUnionOfParams(L4ClassifierDefinition.DEFINITION, supportedParams);
181 ClassifierDefinition expectedCd = new ClassifierDefinitionBuilder(L4ClassifierDefinition.DEFINITION)
182 .setParameter(ImmutableList.<Parameter>of(
183 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
184 L4ClassifierDefinition.DST_PORT_PARAM),
185 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
186 L4ClassifierDefinition.DST_PORT_RANGE_PARAM)))
188 assertEquals(expectedCd, classifierDefinitionWithUnionOfParams);
192 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsInConfDs_withSupportedParams() throws Exception {
193 WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
194 wTx.put(LogicalDatastoreType.CONFIGURATION,
195 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
196 EtherTypeClassifierDefinition.DEFINITION, true);
198 List<ParameterName> supportedParams =
199 ImmutableList.of(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
201 listener.putOrRemoveClassifierDefinitionInOperDs(EtherTypeClassifierDefinition.ID, supportedParams);
202 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
203 .read(LogicalDatastoreType.OPERATIONAL,
204 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID))
206 Assert.assertTrue(potentialCd.isPresent());
207 assertEquals(EtherTypeClassifierDefinition.DEFINITION, potentialCd.get());
211 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsNotInConfDs_withSupportedParams() throws Exception {
212 List<ParameterName> supportedParams =
213 ImmutableList.of(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
215 listener.putOrRemoveClassifierDefinitionInOperDs(EtherTypeClassifierDefinition.ID, supportedParams);
216 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
217 .read(LogicalDatastoreType.OPERATIONAL,
218 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID))
220 Assert.assertFalse(potentialCd.isPresent());
224 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsInConfDs_emptySupportedParams() throws Exception {
225 WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
226 wTx.put(LogicalDatastoreType.CONFIGURATION,
227 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
228 EtherTypeClassifierDefinition.DEFINITION, true);
229 wTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
230 EtherTypeClassifierDefinition.DEFINITION, true);
232 List<ParameterName> supportedParams = ImmutableList.of();
234 listener.putOrRemoveClassifierDefinitionInOperDs(EtherTypeClassifierDefinition.ID, supportedParams);
235 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
236 .read(LogicalDatastoreType.OPERATIONAL,
237 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID))
239 Assert.assertFalse(potentialCd.isPresent());
243 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsInConfDs_changedSupportedParams() throws Exception {
244 WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
245 wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID),
246 L4ClassifierDefinition.DEFINITION, true);
247 wTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID),
248 L4ClassifierDefinition.DEFINITION, true);
250 ImmutableList<ParameterName> supportedParams =
251 ImmutableList.of(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM),
252 new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM));
254 listener.putOrRemoveClassifierDefinitionInOperDs(L4ClassifierDefinition.ID, supportedParams);
255 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
256 .read(LogicalDatastoreType.OPERATIONAL, IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID))
258 ClassifierDefinition expectedCd = new ClassifierDefinitionBuilder(L4ClassifierDefinition.DEFINITION)
259 .setParameter(ImmutableList.<Parameter>of(
260 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
261 L4ClassifierDefinition.DST_PORT_PARAM),
262 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
263 L4ClassifierDefinition.DST_PORT_RANGE_PARAM)))
265 Assert.assertTrue(potentialCd.isPresent());
266 assertEquals(expectedCd, potentialCd.get());
269 private void assertEquals(ClassifierDefinition expectedCd, ClassifierDefinition actualCd) {
270 Assert.assertEquals(expectedCd.getId(), actualCd.getId());
271 Assert.assertEquals(expectedCd.getName(), actualCd.getName());
272 Assert.assertEquals(expectedCd.getDescription(), actualCd.getDescription());
273 Assert.assertEquals(expectedCd.getFallbackBehavior(), actualCd.getFallbackBehavior());
274 List<Parameter> expectedParams = getNonNullList(expectedCd.getParameter());
275 List<Parameter> actualParams = getNonNullList(actualCd.getParameter());
276 Assert.assertTrue(expectedParams.containsAll(actualParams) && actualParams.containsAll(expectedParams));
279 private <T> List<T> getNonNullList(List<T> list) {
280 return MoreObjects.firstNonNull(list, ImmutableList.<T>of());
284 // public void testCreateClassifierDefinitionWithUnionOfParams_allParamsSupportedByRenderer()
285 // throws Exception {
286 // WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
287 // wTx.put(LogicalDatastoreType.CONFIGURATION,
288 // IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
289 // EtherTypeClassifierDefinition.DEFINITION, true);
290 // wTx.submit().get();
292 // SupportedClassifierDefinition supportedClassifierDefinition = new
293 // SupportedClassifierDefinitionBuilder()
294 // .setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
295 // .setSupportedParameterValues(
296 // ImmutableList.<SupportedParameterValues>of(new SupportedParameterValuesBuilder()
297 // .setParameterName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM)).build()))
299 // Renderer renderer = createRenderer("renderer1");
300 // registerSupportedClassifierDefByRenderer(supportedClassifierDefinition, renderer);
302 // ClassifierDefinition newCd = listener.createClassifierDefinitionWithUnionOfParams(
303 // EtherTypeClassifierDefinition.ID, getDataBroker().newReadOnlyTransaction());
304 // Assert.assertEquals(EtherTypeClassifierDefinition.DEFINITION, newCd);
308 // public void testCreateClassifierDefinitionWithUnionOfParams_someParamsSupportedByRenderer()
309 // throws Exception {
310 // WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
311 // wTx.put(LogicalDatastoreType.CONFIGURATION,
312 // IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID),
313 // L4ClassifierDefinition.DEFINITION, true);
314 // wTx.submit().get();
316 // SupportedClassifierDefinition supportedClassifierDefinition = new
317 // SupportedClassifierDefinitionBuilder()
318 // .setClassifierDefinitionId(L4ClassifierDefinition.ID)
319 // .setSupportedParameterValues(
320 // ImmutableList.<SupportedParameterValues>of(new SupportedParameterValuesBuilder()
321 // .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build()))
323 // Renderer renderer = createRenderer("renderer1");
324 // registerSupportedClassifierDefByRenderer(supportedClassifierDefinition, renderer);
326 // ClassifierDefinition newCd =
327 // listener.createClassifierDefinitionWithUnionOfParams(L4ClassifierDefinition.ID,
328 // getDataBroker().newReadOnlyTransaction());
329 // ClassifierDefinition expectedCd = new
330 // ClassifierDefinitionBuilder(L4ClassifierDefinition.DEFINITION)
331 // .setParameter(ImmutableList.<Parameter>of(getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
332 // L4ClassifierDefinition.DST_PORT_PARAM)))
334 // Assert.assertEquals(expectedCd, newCd);
337 // private Renderer createRenderer(String rendererName) {
338 // return new RendererBuilder().setName(new RendererName(rendererName)).build();
341 private Parameter getParameterFromDefinition(ClassifierDefinition cd, String parameter) {
342 for (Parameter param : cd.getParameter()) {
343 if (param.getName().getValue().equals(parameter)) {
347 throw new IllegalArgumentException("Parameter " + parameter + " is not located in " + cd);
350 // private void registerSupportedClassifierDefByRenderer(SupportedClassifierDefinition
351 // supportedClassifierDefinition,
352 // Renderer renderer) {
353 // InstanceIdentifier<SupportedClassifierDefinition> scdIid =
354 // InstanceIdentifier.builder(Renderers.class)
355 // .child(Renderer.class, renderer.getKey())
356 // .child(Capabilities.class)
357 // .child(SupportedClassifierDefinition.class, supportedClassifierDefinition.getKey())
359 // listener.ciValidatorBySupportedCdKey.put(new SupportedCdKey(scdIid, null),
360 // new ClassifierInstanceValidator(supportedClassifierDefinition));
361 // listener.supportedCdIidByCdId.put(supportedClassifierDefinition.getClassifierDefinitionId(),