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.lispflowmapping.neutron;
10 import com.google.common.collect.Lists;
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;
44 public class PortDataProcessorTest {
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;
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();
61 private PortDataProcessor portDataProcessor = new PortDataProcessor(iLispNeutronServiceMock);
64 @SuppressWarnings("unchecked")
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);
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);
80 // common stubbing is called before invocation of each test
85 * Tests {@link PortDataProcessor#create} method.
88 public void createTest()
89 throws ExecutionException, InterruptedException, NoSuchMethodException,
90 IllegalAccessException, InvocationTargetException {
91 portDataProcessor.create(portMock);
93 List<FixedIps> fixedIps = portMock.getFixedIps();
95 for (FixedIps ip : fixedIps) {
96 Mockito.verify(hostInformationManager).addHostRelatedInfo(HOST_ID_1,
97 getEid(portDataProcessor, portMock, ip));
102 * Tests {@link PortDataProcessor#create} method with null host Id.
105 public void createTest_nullHostId() throws ExecutionException, InterruptedException {
106 // overriding default stubbing
107 Mockito.when(augmentationMock.getHostId()).thenReturn(null);
109 portDataProcessor.create(portMock);
111 List<FixedIps> fixedIps = portMock.getFixedIps();
113 Mockito.verifyZeroInteractions(hostInformationManager);
117 * Tests {@link PortDataProcessor#delete} method.
120 public void deleteTest() {
122 final RemoveMappingInput expectedResult = LispUtil
123 .buildRemoveMappingInput(LispAddressUtil.asIpv4PrefixEid(IPV4 + "/32"));
124 portDataProcessor.delete(portMock);
125 Mockito.verify(odlMappingserviceServiceMock).removeMapping(expectedResult);
129 * Stubbing common for all test methods.
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);
141 private static LocatorRecord getDefaultLocatorRecord() {
142 return new LocatorRecordBuilder()
143 .setRloc(new RlocBuilder().setAddress(ADDRESS).build())
147 private static MappingRecord getDefaultMappingRecord() {
148 return new MappingRecordBuilder().setLocatorRecord(Lists.newArrayList(getDefaultLocatorRecord())).build();
151 private static List<FixedIps> getDefaultListOfFixedIps() {
152 FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(new IpAddress(new Ipv4Address(IPV4))).build();
154 return Lists.newArrayList(fixedIps);
157 private static Eid getEid(PortDataProcessor portDataProcessor, Port port, FixedIps ip)
158 throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
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) {
166 } catch (IllegalAccessException e) {
168 } catch (InvocationTargetException e) {