Magnesium platform upgrade
[lispflowmapping.git] / mappingservice / neutron / src / test / java / org / opendaylight / lispflowmapping / neutron / PortDataProcessorTest.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.lispflowmapping.neutron;
9
10 import com.google.common.collect.Lists;
11
12 import java.lang.reflect.Field;
13 import java.lang.reflect.InvocationTargetException;
14 import java.lang.reflect.Method;
15 import java.util.List;
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.Future;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.mockito.Mockito;
21 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
22 import org.opendaylight.lispflowmapping.neutron.mappingmanager.HostInformationManager;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.GetMappingOutput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.OdlMappingserviceService;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.RemoveMappingInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
42 import org.opendaylight.yangtools.yang.common.RpcResult;
43
44 public class PortDataProcessorTest {
45
46     private static ILispNeutronService iLispNeutronServiceMock = Mockito.mock(ILispNeutronService.class);
47     private static HostInformationManager hostInformationManager = Mockito.mock(HostInformationManager.class);
48     private OdlMappingserviceService odlMappingserviceServiceMock;
49     private Port portMock;
50     private PortBindingExtension augmentationMock;
51     private Future<RpcResult<GetMappingOutput>> future;
52     private RpcResult<GetMappingOutput> rpcResult;
53
54     private static final String PORT_UUID_1 = "a9607d99-0afa-41cc-8f2f-8d62b6e9bc1c";
55     private static final String HOST_ID_1 = "host-id1";
56     private static final String TENANT_1 = "92070479-5900-498b-84e3-893a04f55709";
57     private static final String IPV4 = "192.168.0.1";
58     private static final Address ADDRESS = new DistinguishedNameBuilder()
59             .setDistinguishedName(new DistinguishedNameType(HOST_ID_1)).build();
60
61     private PortDataProcessor portDataProcessor = new PortDataProcessor(iLispNeutronServiceMock);
62
63     @Before
64     @SuppressWarnings("unchecked")
65     public void init() {
66         portMock = Mockito.mock(Port.class);
67         odlMappingserviceServiceMock = Mockito.mock(OdlMappingserviceService.class);
68         augmentationMock = Mockito.mock(PortBindingExtension.class);
69         future = Mockito.mock(Future.class);
70         rpcResult = Mockito.mock(RpcResult.class);
71
72         try {
73             Field field = portDataProcessor.getClass().getDeclaredField("hostInformationManager");
74             field.setAccessible(true);
75             field.set(portDataProcessor, hostInformationManager);
76         } catch (NoSuchFieldException | IllegalAccessException e) {
77             throw new RuntimeException("Unable to set hostInformationManager", e);
78         }
79
80         // common stubbing is called before invocation of each test
81         commonStubbing();
82     }
83
84     /**
85      * Tests {@link PortDataProcessor#create} method.
86      */
87     @Test
88     public void createTest()
89             throws ExecutionException, InterruptedException, NoSuchMethodException,
90                    IllegalAccessException, InvocationTargetException {
91         portDataProcessor.create(portMock);
92
93         List<FixedIps> fixedIps = portMock.getFixedIps();
94
95         for (FixedIps ip : fixedIps) {
96             Mockito.verify(hostInformationManager).addHostRelatedInfo(HOST_ID_1,
97                     getEid(portDataProcessor, portMock, ip));
98         }
99     }
100
101     /**
102      * Tests {@link PortDataProcessor#create} method with null host Id.
103      */
104     @Test
105     public void createTest_nullHostId() throws ExecutionException, InterruptedException {
106         // overriding default stubbing
107         Mockito.when(augmentationMock.getHostId()).thenReturn(null);
108
109         portDataProcessor.create(portMock);
110
111         List<FixedIps> fixedIps = portMock.getFixedIps();
112
113         Mockito.verifyZeroInteractions(hostInformationManager);
114     }
115
116     /**
117      * Tests {@link PortDataProcessor#delete} method.
118      */
119     @Test
120     public void deleteTest() {
121         // expected result
122         final RemoveMappingInput expectedResult = LispUtil
123                 .buildRemoveMappingInput(LispAddressUtil.asIpv4PrefixEid(IPV4 + "/32"));
124         portDataProcessor.delete(portMock);
125         Mockito.verify(odlMappingserviceServiceMock).removeMapping(expectedResult);
126     }
127
128     /**
129      * Stubbing common for all test methods.
130      */
131     public void commonStubbing() {
132         Mockito.when(portMock.augmentation(PortBindingExtension.class)).thenReturn(augmentationMock);
133         Mockito.when(iLispNeutronServiceMock.getMappingDbService()).thenReturn(odlMappingserviceServiceMock);
134         Mockito.when(portMock.getUuid()).thenReturn(new Uuid(PORT_UUID_1));
135         Mockito.when(portMock.getFixedIps()).thenReturn(getDefaultListOfFixedIps());
136         Mockito.when(portMock.getTenantId()).thenReturn(new Uuid(TENANT_1));
137         Mockito.when(augmentationMock.getHostId()).thenReturn(HOST_ID_1);
138         Mockito.when(hostInformationManager.getInstanceId(TENANT_1)).thenReturn(1L);
139     }
140
141     private static LocatorRecord getDefaultLocatorRecord() {
142         return new LocatorRecordBuilder()
143                 .setRloc(new RlocBuilder().setAddress(ADDRESS).build())
144                 .build();
145     }
146
147     private static MappingRecord getDefaultMappingRecord() {
148         return new MappingRecordBuilder().setLocatorRecord(Lists.newArrayList(getDefaultLocatorRecord())).build();
149     }
150
151     private static List<FixedIps> getDefaultListOfFixedIps() {
152         FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(new IpAddress(new Ipv4Address(IPV4))).build();
153
154         return Lists.newArrayList(fixedIps);
155     }
156
157     private static Eid getEid(PortDataProcessor portDataProcessor, Port port, FixedIps ip)
158             throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
159         try {
160             Method method = (portDataProcessor.getClass())
161                                 .getDeclaredMethod("getEid", Port.class, FixedIps.class);
162             method.setAccessible(true);
163             return (Eid) method.invoke(portDataProcessor, port, ip);
164         } catch (NoSuchMethodException e) {
165             throw e;
166         } catch (IllegalAccessException e) {
167             throw e;
168         } catch (InvocationTargetException e) {
169             throw e;
170         }
171     }
172 }