Bump upstream versions
[lispflowmapping.git] / mappingservice / neutron / src / test / java / org / opendaylight / lispflowmapping / neutron / mappingmanager / HostInformationManagerTest.java
1 /*
2  * Copyright (c) 2017 Cisco Systems, Inc.  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.mappingmanager;
9
10 import java.lang.reflect.Field;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 import org.mockito.Mockito;
16 import org.mockito.junit.MockitoJUnitRunner;
17 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
18 import org.opendaylight.lispflowmapping.neutron.LispUtil;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddMappingInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.OdlMappingserviceService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.RemoveMappingInput;
25 import org.powermock.core.classloader.annotations.PrepareForTest;
26 import org.powermock.modules.junit4.PowerMockRunner;
27 import org.powermock.modules.junit4.PowerMockRunnerDelegate;
28
29 /**
30  * Created by Shakib Ahmed on 2/7/17.
31  */
32 @RunWith(PowerMockRunner.class)
33 @PowerMockRunnerDelegate(MockitoJUnitRunner.class)
34 @PrepareForTest(HostInformationManager.class)
35 public class HostInformationManagerTest {
36
37     private final OdlMappingserviceService lfmDbService = Mockito.mock(OdlMappingserviceService.class);
38
39     private static final String HOST_ID = "compute0";
40
41     private static final Rloc SAMPLE_RLOC = Mockito.mock(Rloc.class);
42
43     private static final Eid SAMPLE_EID_1 = Mockito.mock(Eid.class);
44     private static final Eid SAMPLE_EID_2 = Mockito.mock(Eid.class);
45     private static final Eid SAMPLE_EID_3 = Mockito.mock(Eid.class);
46     private static final PortData PORT_DATA_1 = new PortData("1", SAMPLE_EID_1);
47     private static final PortData PORT_DATA_2 = new PortData("2", SAMPLE_EID_2);
48
49     private static final PortData PORT_DATA_1_1 = new PortData("1", SAMPLE_EID_3);
50
51     @Test
52     public void testScenarioRlocFirst() {
53         HostInformationManager hostInformationManager = getDefaultHostInformationManager();
54
55         addRlocData(hostInformationManager);
56
57         Mockito.verify(lfmDbService, Mockito.times(0))
58                 .addMapping(Mockito.any(AddMappingInput.class));
59
60         addPortData1(hostInformationManager);
61
62         AddMappingInput desiredMappingRecord = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_1);
63         Mockito.verify(lfmDbService).addMapping(desiredMappingRecord);
64
65         destroySingleton(hostInformationManager);
66     }
67
68     @Test
69     public void testScenarioPortDataFirst() {
70         HostInformationManager hostInformationManager = getDefaultHostInformationManager();
71
72         addPortData1(hostInformationManager);
73
74         Mockito.verify(lfmDbService, Mockito.times(0))
75                 .addMapping(Mockito.any(AddMappingInput.class));
76
77         addRlocData(hostInformationManager);
78
79         AddMappingInput desiredMappingRecord = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_1);
80         Mockito.verify(lfmDbService).addMapping(desiredMappingRecord);
81
82         destroySingleton(hostInformationManager);
83     }
84
85     @Test
86     public void testScenarioMultiplePortDataAndThenRloc() {
87         HostInformationManager hostInformationManager = getDefaultHostInformationManager();
88
89         addPortData1(hostInformationManager);
90         addPortData2(hostInformationManager);
91
92         Mockito.verify(lfmDbService, Mockito.times(0))
93                 .addMapping(Mockito.any(AddMappingInput.class));
94
95         addRlocData(hostInformationManager);
96
97         AddMappingInput desiredMappingRecord1 = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_1);
98         Mockito.verify(lfmDbService).addMapping(desiredMappingRecord1);
99
100         AddMappingInput desiredMappingRecord2 = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_2);
101         Mockito.verify(lfmDbService).addMapping(desiredMappingRecord2);
102
103         destroySingleton(hostInformationManager);
104     }
105
106     @Test
107     public void testOnlyUnprocessedPortDataIsBeingProcessed() {
108         HostInformationManager hostInformationManager = getDefaultHostInformationManager();
109
110         addPortData1(hostInformationManager);
111
112         Mockito.verify(lfmDbService, Mockito.times(0))
113                 .addMapping(Mockito.any(AddMappingInput.class));
114
115         addRlocData(hostInformationManager);
116
117         addPortData2(hostInformationManager);
118
119         Mockito.verify(lfmDbService, Mockito.times(2))
120                 .addMapping(Mockito.any(AddMappingInput.class));
121
122         AddMappingInput desiredMappingRecord1 = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_1);
123         Mockito.verify(lfmDbService).addMapping(desiredMappingRecord1);
124
125         AddMappingInput desiredMappingRecord2 = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_2);
126         Mockito.verify(lfmDbService).addMapping(desiredMappingRecord2);
127
128         destroySingleton(hostInformationManager);
129     }
130
131     @Test
132     public void testProperMappingRecordRemoval() {
133         HostInformationManager hostInformationManager = getDefaultHostInformationManager();
134
135         addPortData1(hostInformationManager);
136
137         addRlocData(hostInformationManager);
138
139         addUpdatedPortData1(hostInformationManager);
140
141         RemoveMappingInput removeMappingInput = LispUtil.buildRemoveMappingInput(PORT_DATA_1.getPortEid());
142         Mockito.verify(lfmDbService).removeMapping(removeMappingInput);
143
144         AddMappingInput addMappingInput = createAddMappingInput(SAMPLE_RLOC, SAMPLE_EID_3);
145         Mockito.verify(lfmDbService).addMapping(addMappingInput);
146
147         destroySingleton(hostInformationManager);
148     }
149
150     private void addRlocData(HostInformationManager hostInformationManager) {
151         hostInformationManager.addHostRelatedInfo(HOST_ID, SAMPLE_RLOC);
152     }
153
154     private void addPortData1(HostInformationManager hostInformationManager) {
155         hostInformationManager.addHostRelatedInfo(HOST_ID, PORT_DATA_1);
156     }
157
158     private void addPortData2(HostInformationManager hostInformationManager) {
159         hostInformationManager.addHostRelatedInfo(HOST_ID, PORT_DATA_2);
160     }
161
162     private void addUpdatedPortData1(HostInformationManager hostInformationManager) {
163         hostInformationManager.addHostRelatedInfo(HOST_ID, PORT_DATA_1_1);
164     }
165
166     private AddMappingInput createAddMappingInput(Rloc rloc, Eid eid) {
167         List<Rloc> rlocList = new ArrayList<>();
168         rlocList.add(rloc);
169         List<LocatorRecord> locatorRecordList = LispAddressUtil.asLocatorRecords(rlocList);
170
171         return LispUtil.buildAddMappingInput(eid, locatorRecordList);
172     }
173
174     private HostInformationManager getDefaultHostInformationManager() {
175         HostInformationManager hostInformationManager = HostInformationManager.getInstance();
176         hostInformationManager.setOdlMappingserviceService(lfmDbService);
177         return hostInformationManager;
178     }
179
180     private void destroySingleton(HostInformationManager hostInformationManager) {
181         try {
182             Field field = hostInformationManager.getClass().getDeclaredField("instance");
183             field.setAccessible(true);
184             field.set(hostInformationManager, null);
185         } catch (NoSuchFieldException e) {
186             assert false;
187         } catch (IllegalAccessException e) {
188             assert false;
189         }
190     }
191 }