1 package org.opendaylight.groupbasedpolicy.sf;
3 import java.util.Collection;
6 import org.junit.Assert;
7 import org.junit.Before;
9 import org.mockito.Mockito;
10 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
11 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
12 import org.opendaylight.groupbasedpolicy.api.PolicyValidatorRegistry;
13 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
14 import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;
15 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
16 import org.opendaylight.groupbasedpolicy.test.GbpDataBrokerTest;
17 import org.opendaylight.groupbasedpolicy.util.IidFactory;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definition.Parameter;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinitionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinition;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinitionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
28 import com.google.common.base.MoreObjects;
29 import com.google.common.base.Optional;
30 import com.google.common.collect.ImmutableList;
32 public class SupportedClassifierDefinitionListenerTest extends GbpDataBrokerTest {
34 private SupportedClassifierDefinitionListener listener;
35 private PolicyValidatorRegistry policyValidatorRegistry;
39 policyValidatorRegistry = Mockito.mock(PolicyValidatorRegistry.class);
40 listener = new SupportedClassifierDefinitionListener(getDataBroker(), policyValidatorRegistry);
44 public void testSetParentValidators_newValidatorHasParent_parentValidatorExists() {
45 RendererName rendererFoo = new RendererName("Foo");
46 SupportedClassifierDefinition supportedIpProtoPort = new SupportedClassifierDefinitionBuilder()
47 .setClassifierDefinitionId(IpProtoClassifierDefinition.ID).build();
48 ClassifierInstanceValidator rendererFooIpProtoParentValidator =
49 new ClassifierInstanceValidator(supportedIpProtoPort, rendererFoo);
50 listener.validatorByRendererAndCd.put(rendererFoo, IpProtoClassifierDefinition.ID,
51 rendererFooIpProtoParentValidator);
52 SupportedClassifierDefinition supportedL4SrcPort =
53 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
54 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
56 ClassifierInstanceValidator rendererFooL4SrcPortNewValidator =
57 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo);
58 listener.validatorByRendererAndCd.put(rendererFoo, L4ClassifierDefinition.ID, rendererFooL4SrcPortNewValidator);
59 listener.setParentValidators(rendererFooL4SrcPortNewValidator, false);
60 Assert.assertEquals(rendererFooIpProtoParentValidator, rendererFooL4SrcPortNewValidator.getParentValidator());
62 listener.setParentValidators(rendererFooL4SrcPortNewValidator, true);
63 Assert.assertNull(rendererFooIpProtoParentValidator.getParentValidator());
67 public void testSetParentValidators_newValidatorHasParent_parentValidatorNotExists() {
68 RendererName rendererFoo = new RendererName("Foo");
69 SupportedClassifierDefinition supportedL4SrcPort =
70 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
71 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
73 ClassifierInstanceValidator rendererFooL4SrcPortNewValidator =
74 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo);
75 listener.validatorByRendererAndCd.put(rendererFoo, L4ClassifierDefinition.ID, rendererFooL4SrcPortNewValidator);
77 listener.setParentValidators(rendererFooL4SrcPortNewValidator, false);
78 Assert.assertNull(rendererFooL4SrcPortNewValidator.getParentValidator());
80 SupportedClassifierDefinition supportedIpProtoPort = new SupportedClassifierDefinitionBuilder()
81 .setClassifierDefinitionId(IpProtoClassifierDefinition.ID).build();
82 ClassifierInstanceValidator rendererFooIpProtoParentValidator =
83 new ClassifierInstanceValidator(supportedIpProtoPort, rendererFoo);
84 listener.validatorByRendererAndCd.put(rendererFoo, IpProtoClassifierDefinition.ID,
85 rendererFooIpProtoParentValidator);
87 listener.setParentValidators(rendererFooL4SrcPortNewValidator, false);
88 Assert.assertEquals(rendererFooIpProtoParentValidator, rendererFooL4SrcPortNewValidator.getParentValidator());
90 listener.setParentValidators(rendererFooL4SrcPortNewValidator, true);
91 Assert.assertNull(rendererFooIpProtoParentValidator.getParentValidator());
95 public void testGetValidatorsWithParentCdForRenderer() {
96 List<SupportedParameterValues> srcPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
97 .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)).build());
98 SupportedClassifierDefinition supportedL4SrcPort =
99 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
100 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
101 .setSupportedParameterValues(srcPortParam)
103 RendererName rendererFoo = new RendererName("Foo");
104 ClassifierInstanceValidator rendererFooL4SrcPortValidator =
105 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo);
106 listener.validatorByRendererAndCd.put(rendererFoo, supportedL4SrcPort.getClassifierDefinitionId(),
107 rendererFooL4SrcPortValidator);
108 List<SupportedParameterValues> dstPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
109 .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build());
110 SupportedClassifierDefinition supportedL4DstPort =
111 new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(L4ClassifierDefinition.ID)
112 .setParentClassifierDefinitionId(IpProtoClassifierDefinition.ID)
113 .setSupportedParameterValues(dstPortParam)
115 RendererName rendererBar = new RendererName("Bar");
116 ClassifierInstanceValidator rendererBarL4DstPortValidator =
117 new ClassifierInstanceValidator(supportedL4DstPort, rendererBar);
118 listener.validatorByRendererAndCd.put(rendererBar, supportedL4DstPort.getClassifierDefinitionId(),
119 rendererBarL4DstPortValidator);
121 Collection<ClassifierInstanceValidator> validatorsWithParentIpProtoCdForRendererFoo =
122 listener.getValidatorsWithParentCdForRenderer(IpProtoClassifierDefinition.ID, rendererFoo);
123 Assert.assertNotNull(validatorsWithParentIpProtoCdForRendererFoo);
124 Assert.assertEquals(validatorsWithParentIpProtoCdForRendererFoo.size(), 1);
125 Assert.assertTrue(validatorsWithParentIpProtoCdForRendererFoo.contains(rendererFooL4SrcPortValidator));
129 public void testGetAllSupportedParams() {
130 List<SupportedParameterValues> srcPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
131 .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)).build());
132 SupportedClassifierDefinition supportedL4SrcPort = new SupportedClassifierDefinitionBuilder()
133 .setClassifierDefinitionId(L4ClassifierDefinition.ID).setSupportedParameterValues(srcPortParam).build();
134 RendererName rendererFoo = new RendererName("Foo");
135 listener.validatorByRendererAndCd.put(rendererFoo, supportedL4SrcPort.getClassifierDefinitionId(),
136 new ClassifierInstanceValidator(supportedL4SrcPort, rendererFoo));
137 List<SupportedParameterValues> dstPortParam = ImmutableList.of(new SupportedParameterValuesBuilder()
138 .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build());
139 SupportedClassifierDefinition supportedL4DstPort = new SupportedClassifierDefinitionBuilder()
140 .setClassifierDefinitionId(L4ClassifierDefinition.ID).setSupportedParameterValues(dstPortParam).build();
141 RendererName rendererBar = new RendererName("Bar");
142 listener.validatorByRendererAndCd.put(rendererBar, supportedL4DstPort.getClassifierDefinitionId(),
143 new ClassifierInstanceValidator(supportedL4DstPort, rendererBar));
145 List<ParameterName> allSupportedParams = listener.getAllSupportedParams(L4ClassifierDefinition.ID);
146 Assert.assertTrue(allSupportedParams.contains(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)));
147 Assert.assertTrue(allSupportedParams.contains(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)));
151 public void testCreateClassifierDefinitionWithUnionOfParams_allSupportedParams() {
152 List<ParameterName> supportedParams =
153 ImmutableList.of(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
154 ClassifierDefinition classifierDefinitionWithUnionOfParams = listener
155 .createClassifierDefinitionWithUnionOfParams(EtherTypeClassifierDefinition.DEFINITION, supportedParams);
156 assertEquals(EtherTypeClassifierDefinition.DEFINITION, classifierDefinitionWithUnionOfParams);
160 public void testCreateClassifierDefinitionWithUnionOfParams_emptySupportedParams() {
161 List<ParameterName> supportedParams = ImmutableList.of();
162 ClassifierDefinition classifierDefinitionWithUnionOfParams = listener
163 .createClassifierDefinitionWithUnionOfParams(EtherTypeClassifierDefinition.DEFINITION, supportedParams);
164 Assert.assertNull(classifierDefinitionWithUnionOfParams);
168 public void testCreateClassifierDefinitionWithUnionOfParams_someSupportedParams() {
169 ImmutableList<ParameterName> supportedParams =
170 ImmutableList.of(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM),
171 new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM));
172 ClassifierDefinition classifierDefinitionWithUnionOfParams = listener
173 .createClassifierDefinitionWithUnionOfParams(L4ClassifierDefinition.DEFINITION, supportedParams);
174 ClassifierDefinition expectedCd = new ClassifierDefinitionBuilder(L4ClassifierDefinition.DEFINITION)
175 .setParameter(ImmutableList.<Parameter>of(
176 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
177 L4ClassifierDefinition.DST_PORT_PARAM),
178 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
179 L4ClassifierDefinition.DST_PORT_RANGE_PARAM)))
181 assertEquals(expectedCd, classifierDefinitionWithUnionOfParams);
185 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsInConfDs_withSupportedParams() throws Exception {
186 WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
187 wTx.put(LogicalDatastoreType.CONFIGURATION,
188 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
189 EtherTypeClassifierDefinition.DEFINITION, true);
191 List<ParameterName> supportedParams =
192 ImmutableList.of(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
194 listener.putOrRemoveClassifierDefinitionInOperDs(EtherTypeClassifierDefinition.ID, supportedParams);
195 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
196 .read(LogicalDatastoreType.OPERATIONAL,
197 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID))
199 Assert.assertTrue(potentialCd.isPresent());
200 assertEquals(EtherTypeClassifierDefinition.DEFINITION, potentialCd.get());
204 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsNotInConfDs_withSupportedParams() throws Exception {
205 List<ParameterName> supportedParams =
206 ImmutableList.of(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
208 listener.putOrRemoveClassifierDefinitionInOperDs(EtherTypeClassifierDefinition.ID, supportedParams);
209 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
210 .read(LogicalDatastoreType.OPERATIONAL,
211 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID))
213 Assert.assertFalse(potentialCd.isPresent());
217 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsInConfDs_emptySupportedParams() throws Exception {
218 WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
219 wTx.put(LogicalDatastoreType.CONFIGURATION,
220 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
221 EtherTypeClassifierDefinition.DEFINITION, true);
222 wTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
223 EtherTypeClassifierDefinition.DEFINITION, true);
225 List<ParameterName> supportedParams = ImmutableList.of();
227 listener.putOrRemoveClassifierDefinitionInOperDs(EtherTypeClassifierDefinition.ID, supportedParams);
228 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
229 .read(LogicalDatastoreType.OPERATIONAL,
230 IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID))
232 Assert.assertFalse(potentialCd.isPresent());
236 public void testPutOrRemoveClassifierDefinitionInOperDs_cdIsInConfDs_changedSupportedParams() throws Exception {
237 WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
238 wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID),
239 L4ClassifierDefinition.DEFINITION, true);
240 wTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID),
241 L4ClassifierDefinition.DEFINITION, true);
243 ImmutableList<ParameterName> supportedParams =
244 ImmutableList.of(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM),
245 new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM));
247 listener.putOrRemoveClassifierDefinitionInOperDs(L4ClassifierDefinition.ID, supportedParams);
248 Optional<ClassifierDefinition> potentialCd = getDataBroker().newReadOnlyTransaction()
249 .read(LogicalDatastoreType.OPERATIONAL, IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID))
251 ClassifierDefinition expectedCd = new ClassifierDefinitionBuilder(L4ClassifierDefinition.DEFINITION)
252 .setParameter(ImmutableList.<Parameter>of(
253 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
254 L4ClassifierDefinition.DST_PORT_PARAM),
255 getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
256 L4ClassifierDefinition.DST_PORT_RANGE_PARAM)))
258 Assert.assertTrue(potentialCd.isPresent());
259 assertEquals(expectedCd, potentialCd.get());
262 private void assertEquals(ClassifierDefinition expectedCd, ClassifierDefinition actualCd) {
263 Assert.assertEquals(expectedCd.getId(), actualCd.getId());
264 Assert.assertEquals(expectedCd.getName(), actualCd.getName());
265 Assert.assertEquals(expectedCd.getDescription(), actualCd.getDescription());
266 Assert.assertEquals(expectedCd.getFallbackBehavior(), actualCd.getFallbackBehavior());
267 List<Parameter> expectedParams = getNonNullList(expectedCd.getParameter());
268 List<Parameter> actualParams = getNonNullList(actualCd.getParameter());
269 Assert.assertTrue(expectedParams.containsAll(actualParams) && actualParams.containsAll(expectedParams));
272 private <T> List<T> getNonNullList(List<T> list) {
273 return MoreObjects.firstNonNull(list, ImmutableList.<T>of());
277 // public void testCreateClassifierDefinitionWithUnionOfParams_allParamsSupportedByRenderer()
278 // throws Exception {
279 // WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
280 // wTx.put(LogicalDatastoreType.CONFIGURATION,
281 // IidFactory.classifierDefinitionIid(EtherTypeClassifierDefinition.ID),
282 // EtherTypeClassifierDefinition.DEFINITION, true);
283 // wTx.submit().get();
285 // SupportedClassifierDefinition supportedClassifierDefinition = new
286 // SupportedClassifierDefinitionBuilder()
287 // .setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
288 // .setSupportedParameterValues(
289 // ImmutableList.<SupportedParameterValues>of(new SupportedParameterValuesBuilder()
290 // .setParameterName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM)).build()))
292 // Renderer renderer = createRenderer("renderer1");
293 // registerSupportedClassifierDefByRenderer(supportedClassifierDefinition, renderer);
295 // ClassifierDefinition newCd = listener.createClassifierDefinitionWithUnionOfParams(
296 // EtherTypeClassifierDefinition.ID, getDataBroker().newReadOnlyTransaction());
297 // Assert.assertEquals(EtherTypeClassifierDefinition.DEFINITION, newCd);
301 // public void testCreateClassifierDefinitionWithUnionOfParams_someParamsSupportedByRenderer()
302 // throws Exception {
303 // WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
304 // wTx.put(LogicalDatastoreType.CONFIGURATION,
305 // IidFactory.classifierDefinitionIid(L4ClassifierDefinition.ID),
306 // L4ClassifierDefinition.DEFINITION, true);
307 // wTx.submit().get();
309 // SupportedClassifierDefinition supportedClassifierDefinition = new
310 // SupportedClassifierDefinitionBuilder()
311 // .setClassifierDefinitionId(L4ClassifierDefinition.ID)
312 // .setSupportedParameterValues(
313 // ImmutableList.<SupportedParameterValues>of(new SupportedParameterValuesBuilder()
314 // .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build()))
316 // Renderer renderer = createRenderer("renderer1");
317 // registerSupportedClassifierDefByRenderer(supportedClassifierDefinition, renderer);
319 // ClassifierDefinition newCd =
320 // listener.createClassifierDefinitionWithUnionOfParams(L4ClassifierDefinition.ID,
321 // getDataBroker().newReadOnlyTransaction());
322 // ClassifierDefinition expectedCd = new
323 // ClassifierDefinitionBuilder(L4ClassifierDefinition.DEFINITION)
324 // .setParameter(ImmutableList.<Parameter>of(getParameterFromDefinition(L4ClassifierDefinition.DEFINITION,
325 // L4ClassifierDefinition.DST_PORT_PARAM)))
327 // Assert.assertEquals(expectedCd, newCd);
330 // private Renderer createRenderer(String rendererName) {
331 // return new RendererBuilder().setName(new RendererName(rendererName)).build();
334 private Parameter getParameterFromDefinition(ClassifierDefinition cd, String parameter) {
335 for (Parameter param : cd.getParameter()) {
336 if (param.getName().getValue().equals(parameter)) {
340 throw new IllegalArgumentException("Parameter " + parameter + " is not located in " + cd);
343 // private void registerSupportedClassifierDefByRenderer(SupportedClassifierDefinition
344 // supportedClassifierDefinition,
345 // Renderer renderer) {
346 // InstanceIdentifier<SupportedClassifierDefinition> scdIid =
347 // InstanceIdentifier.builder(Renderers.class)
348 // .child(Renderer.class, renderer.getKey())
349 // .child(Capabilities.class)
350 // .child(SupportedClassifierDefinition.class, supportedClassifierDefinition.getKey())
352 // listener.ciValidatorBySupportedCdKey.put(new SupportedCdKey(scdIid, null),
353 // new ClassifierInstanceValidator(supportedClassifierDefinition));
354 // listener.supportedCdIidByCdId.put(supportedClassifierDefinition.getClassifierDefinitionId(),