Merge "Fixed IDs of contracts for EIG"
[groupbasedpolicy.git] / neutron-vpp-mapper / src / test / java / org / opendaylight / groupbasedpolicy / neutron / vpp / mapper / processors / NeutronListenerTest.java
1 /*\r
2  * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;\r
10 \r
11 import static org.junit.Assert.assertEquals;\r
12 import static org.junit.Assert.assertNotNull;\r
13 import static org.junit.Assert.assertNull;\r
14 import static org.mockito.Matchers.any;\r
15 import static org.mockito.Matchers.eq;\r
16 import static org.mockito.Mockito.verify;\r
17 \r
18 import java.util.Collection;\r
19 \r
20 import org.junit.Before;\r
21 import org.junit.Test;\r
22 import org.mockito.Mockito;\r
23 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
24 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;\r
25 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;\r
26 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;\r
27 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;\r
28 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;\r
29 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
30 import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;\r
31 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
32 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;\r
33 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.MacAddressType;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.GbpByNeutronMappings;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.BaseEndpointsByPorts;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPort;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPortBuilder;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;\r
48 import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
50 \r
51 public class NeutronListenerTest extends AbstractDataBrokerTest implements DataTreeChangeListener<VppEndpoint> {\r
52 \r
53     private DataBroker dataBroker;\r
54     private Integer eventCount;\r
55     private static final LogicalDatastoreType CONFIG = LogicalDatastoreType.CONFIGURATION;\r
56     private static final LogicalDatastoreType OPER = LogicalDatastoreType.OPERATIONAL;\r
57 \r
58     private final Port port = new PortBuilder().setUuid(new Uuid("00000000-1111-2222-3333-444444444444")).build();\r
59     private final BaseEndpointByPort bebp = new BaseEndpointByPortBuilder().setContextId(\r
60             new ContextId("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"))\r
61         .setAddress("00:11:11:11:11:11")\r
62         .setPortId(new UniqueId("00000000-1111-2222-3333-444444444444"))\r
63         .setContextType(MappingUtils.L2_BRDIGE_DOMAIN)\r
64         .setAddressType(MacAddressType.class)\r
65         .build();\r
66 \r
67     @Before\r
68     public void init() {\r
69         dataBroker = getDataBroker();\r
70     }\r
71 \r
72     @Test\r
73     public void constructorTest() {\r
74         dataBroker = Mockito.spy(dataBroker);\r
75         NeutronListener neutronListener = new NeutronListener(dataBroker);\r
76         verify(dataBroker).registerDataTreeChangeListener(\r
77                 eq(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,\r
78                         InstanceIdentifier.builder(Neutron.class)\r
79                             .build())), any(NeutronListener.class));\r
80         verify(dataBroker).registerDataTreeChangeListener(\r
81                 eq(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,\r
82                         InstanceIdentifier.builder(Mappings.class)\r
83                         .child(GbpByNeutronMappings.class)\r
84                         .child(BaseEndpointsByPorts.class)\r
85                         .child(BaseEndpointByPort.class)\r
86                         .build())), any(BaseEndpointByPortListener.class));\r
87         neutronListener.close();\r
88     }\r
89 \r
90     @Test\r
91     public void createAndDeleteTest() throws Exception {\r
92         eventCount = 0;\r
93         ListenerRegistration<NeutronListenerTest> registerDataTreeChangeListener = registerVppEpListener();\r
94         NeutronListener neutronListener = new NeutronListener(dataBroker);\r
95         WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();\r
96         wTx.put(CONFIG, TestUtils.createPortIid(port.getKey()), port);\r
97         wTx.put(OPER, TestUtils.createBaseEpByPortIid(port.getUuid()), bebp);\r
98         wTx.submit().get();\r
99         wTx = dataBroker.newWriteOnlyTransaction();\r
100         wTx.delete(CONFIG, TestUtils.createPortIid(port.getKey()));\r
101         wTx.delete(OPER, TestUtils.createBaseEpByPortIid(port.getUuid()));\r
102         DataStoreHelper.submitToDs(wTx);\r
103         // manual delay for max 5s\r
104         for (int i = 0; i < 50; i++) {\r
105             if (eventCount >= 2) {\r
106                 break;\r
107             }\r
108             Thread.sleep(100);\r
109         }\r
110         assertEquals(Integer.valueOf(2), eventCount);\r
111         registerDataTreeChangeListener.close();\r
112         neutronListener.close();\r
113     }\r
114 \r
115     @Override\r
116     public void onDataTreeChanged(Collection<DataTreeModification<VppEndpoint>> changes) {\r
117         for (DataTreeModification<VppEndpoint> change : changes) {\r
118             DataObjectModification<VppEndpoint> vppEpChange = change.getRootNode();\r
119             ModificationType modType = vppEpChange.getModificationType();\r
120             if (modType.equals(ModificationType.WRITE)) {\r
121                 assertNull(vppEpChange.getDataBefore());\r
122                 assertNotNull(vppEpChange.getDataAfter());\r
123                 eventCount++;\r
124             } else if (modType.equals(ModificationType.DELETE)) {\r
125                 assertNotNull(vppEpChange.getDataBefore());\r
126                 assertNull(vppEpChange.getDataAfter());\r
127                 eventCount++;\r
128             }\r
129         }\r
130     }\r
131 \r
132     private ListenerRegistration<NeutronListenerTest> registerVppEpListener() {\r
133         return dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,\r
134                 InstanceIdentifier.builder(Config.class).child(VppEndpoint.class).build()), this);\r
135     }\r
136 }\r