blob: c261f15981a51ad15da6e6f3270b6c7e75ecb073 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.sdnip;
Jonathan Hartce430a42014-10-16 20:44:29 -070017
Sho SHIMIZU891162b2016-06-06 16:32:01 -070018import com.google.common.collect.ImmutableList;
Jonathan Harte30fcda2015-08-06 16:22:34 -070019import com.google.common.collect.Sets;
Jonathan Hartce430a42014-10-16 20:44:29 -070020import org.junit.Before;
Jonathan Hartce430a42014-10-16 20:44:29 -070021import org.junit.Test;
Jonathan Hart51372182014-12-03 21:32:34 -080022import org.onlab.packet.Ethernet;
23import org.onlab.packet.IPv4;
24import org.onlab.packet.IpAddress;
25import org.onlab.packet.IpPrefix;
26import org.onlab.packet.MacAddress;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070027import org.onlab.packet.TpPort;
Jonathan Hart6cd2f352015-01-13 17:44:45 -080028import org.onlab.packet.VlanId;
Jonathan Hart9a426f82015-09-03 15:43:13 +020029import org.onosproject.TestApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.core.ApplicationId;
Jonathan Hart4cb39882015-08-12 23:50:55 -040031import org.onosproject.incubator.net.intf.Interface;
Jonathan Hartb14221c2016-03-07 09:55:50 -080032import org.onosproject.incubator.net.intf.InterfaceListener;
Jonathan Hart4cb39882015-08-12 23:50:55 -040033import org.onosproject.incubator.net.intf.InterfaceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.net.ConnectPoint;
35import org.onosproject.net.DeviceId;
Luca Prete83bac342016-12-06 19:42:05 -080036import org.onosproject.net.EncapsulationType;
Brian O'Connorabafb502014-12-02 22:26:20 -080037import org.onosproject.net.PortNumber;
Jonathan Hart08105be2015-10-10 18:31:06 -070038import org.onosproject.net.config.NetworkConfigListener;
Jonathan Hart9a426f82015-09-03 15:43:13 +020039import org.onosproject.net.config.NetworkConfigService;
Brian O'Connorabafb502014-12-02 22:26:20 -080040import org.onosproject.net.flow.DefaultTrafficSelector;
41import org.onosproject.net.flow.DefaultTrafficTreatment;
42import org.onosproject.net.flow.TrafficSelector;
43import org.onosproject.net.flow.TrafficTreatment;
44import org.onosproject.net.host.InterfaceIpAddress;
45import org.onosproject.net.intent.AbstractIntentTest;
46import org.onosproject.net.intent.Intent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020047import org.onosproject.net.intent.Key;
Brian O'Connorabafb502014-12-02 22:26:20 -080048import org.onosproject.net.intent.PointToPointIntent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020049import org.onosproject.routing.IntentSynchronizationService;
Jonathan Hart4cb39882015-08-12 23:50:55 -040050import org.onosproject.routing.config.BgpConfig;
Luca Prete83bac342016-12-06 19:42:05 -080051import org.onosproject.sdnip.config.SdnIpConfig;
Jonathan Hartce430a42014-10-16 20:44:29 -070052
Jonathan Harte30fcda2015-08-06 16:22:34 -070053import java.util.ArrayList;
54import java.util.Collections;
55import java.util.HashMap;
Jonathan Harte30fcda2015-08-06 16:22:34 -070056import java.util.List;
57import java.util.Map;
Jonathan Harta8625482015-09-08 16:14:56 -070058import java.util.Optional;
Jonathan Hart4cb39882015-08-12 23:50:55 -040059import java.util.Set;
Jonathan Hart552e31f2015-02-06 11:11:59 -080060
Jonathan Hart08105be2015-10-10 18:31:06 -070061import static org.easymock.EasyMock.anyObject;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070062import static org.easymock.EasyMock.createMock;
63import static org.easymock.EasyMock.expect;
Jonathan Hart08105be2015-10-10 18:31:06 -070064import static org.easymock.EasyMock.expectLastCall;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070065import static org.easymock.EasyMock.replay;
66import static org.easymock.EasyMock.reset;
67import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080068import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hartce430a42014-10-16 20:44:29 -070069
70/**
Jonathan Hart51372182014-12-03 21:32:34 -080071 * Unit tests for PeerConnectivityManager.
Jonathan Hartce430a42014-10-16 20:44:29 -070072 */
Brian O'Connor520c0522014-11-23 23:50:47 -080073public class PeerConnectivityManagerTest extends AbstractIntentTest {
Jonathan Hartce430a42014-10-16 20:44:29 -070074
Jonathan Hart9a426f82015-09-03 15:43:13 +020075 private static final ApplicationId APPID = TestApplicationId.create("foo");
Thomas Vachuskab97cf282014-10-20 23:31:12 -070076
Jonathan Hart4cb39882015-08-12 23:50:55 -040077 private static final ApplicationId CONFIG_APP_ID = APPID;
78
Jonathan Hartce430a42014-10-16 20:44:29 -070079 private PeerConnectivityManager peerConnectivityManager;
Jonathan Hart9a426f82015-09-03 15:43:13 +020080 private IntentSynchronizationService intentSynchronizer;
Jonathan Hart4cb39882015-08-12 23:50:55 -040081 private InterfaceService interfaceService;
82 private NetworkConfigService networkConfigService;
Jonathan Hartce430a42014-10-16 20:44:29 -070083
Jonathan Hart4cb39882015-08-12 23:50:55 -040084 private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -070085 private Map<String, Interface> interfaces;
Jonathan Hartce430a42014-10-16 20:44:29 -070086
Jonathan Hart4cb39882015-08-12 23:50:55 -040087 private BgpConfig bgpConfig;
88
Luca Prete83bac342016-12-06 19:42:05 -080089 private SdnIpConfig sdnIpConfig;
90
Jonathan Hartce430a42014-10-16 20:44:29 -070091 private List<PointToPointIntent> intentList;
92
Jonathan Hartce430a42014-10-16 20:44:29 -070093 private final DeviceId deviceId1 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070094 DeviceId.deviceId("of:0000000000000001");
Jonathan Hartce430a42014-10-16 20:44:29 -070095 private final DeviceId deviceId2 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070096 DeviceId.deviceId("of:0000000000000002");
Luca Prete8f2a3ce2016-03-29 16:13:01 -070097 private final DeviceId deviceId3 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070098 DeviceId.deviceId("of:0000000000000003");
Jonathan Hartce430a42014-10-16 20:44:29 -070099
100 // Interfaces connected to BGP speakers
101 private final ConnectPoint s1Eth100 =
102 new ConnectPoint(deviceId1, PortNumber.portNumber(100));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700103 private final ConnectPoint s2Eth100 =
104 new ConnectPoint(deviceId2, PortNumber.portNumber(100));
105 private final ConnectPoint s3Eth100 =
106 new ConnectPoint(deviceId3, PortNumber.portNumber(100));
Jonathan Hartce430a42014-10-16 20:44:29 -0700107
108 // Interfaces connected to BGP peers
109 private final ConnectPoint s1Eth1 =
110 new ConnectPoint(deviceId1, PortNumber.portNumber(1));
111 private final ConnectPoint s2Eth1 =
112 new ConnectPoint(deviceId2, PortNumber.portNumber(1));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700113 private final ConnectPoint s3Eth1 =
114 new ConnectPoint(deviceId3, PortNumber.portNumber(1));
Jonathan Hartce430a42014-10-16 20:44:29 -0700115
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700116 private static final VlanId NO_VLAN = VlanId.NONE;
117 private static final VlanId VLAN10 = VlanId.vlanId(Short.valueOf("10"));
118 private static final VlanId VLAN20 = VlanId.vlanId(Short.valueOf("20"));
119 private static final VlanId VLAN30 = VlanId.vlanId(Short.valueOf("30"));
Jonathan Hartce430a42014-10-16 20:44:29 -0700120
121 @Before
122 public void setUp() throws Exception {
Brian O'Connor520c0522014-11-23 23:50:47 -0800123 super.setUp();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800124
Jonathan Hart4cb39882015-08-12 23:50:55 -0400125 interfaceService = createMock(InterfaceService.class);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800126 interfaceService.addListener(anyObject(InterfaceListener.class));
127 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400128 networkConfigService = createMock(NetworkConfigService.class);
Jonathan Hart08105be2015-10-10 18:31:06 -0700129 networkConfigService.addListener(anyObject(NetworkConfigListener.class));
130 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400131 bgpConfig = createMock(BgpConfig.class);
Luca Prete83bac342016-12-06 19:42:05 -0800132 sdnIpConfig = createMock(SdnIpConfig.class);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800133
Jonathan Hart4cb39882015-08-12 23:50:55 -0400134 // These will set expectations on routingConfig and interfaceService
135 bgpSpeakers = setUpBgpSpeakers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700136 interfaces = Collections.unmodifiableMap(setUpInterfaces());
Jonathan Hartce430a42014-10-16 20:44:29 -0700137
138 initPeerConnectivity();
139 intentList = setUpIntentList();
140 }
141
142 /**
143 * Sets up BGP speakers.
144 *
145 * @return configured BGP speakers as a map from speaker name to speaker
146 */
Jonathan Hart4cb39882015-08-12 23:50:55 -0400147 private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700148
Jonathan Hart4cb39882015-08-12 23:50:55 -0400149 BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700150 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700151 NO_VLAN, s1Eth100,
152 Collections.singleton(IpAddress.valueOf("192.168.10.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700153
Jonathan Hart4cb39882015-08-12 23:50:55 -0400154 BgpConfig.BgpSpeakerConfig speaker2 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700155 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700156 NO_VLAN, s1Eth100,
157 Sets.newHashSet(IpAddress.valueOf("192.168.20.1"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400158 IpAddress.valueOf("192.168.30.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700159
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700160 BgpConfig.BgpSpeakerConfig speaker3 = new BgpConfig.BgpSpeakerConfig(
161 Optional.empty(),
162 VLAN30, s3Eth100,
163 Sets.newHashSet(IpAddress.valueOf("192.168.40.1"),
164 IpAddress.valueOf("192.168.50.1")));
165
Jonathan Hart4cb39882015-08-12 23:50:55 -0400166 Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet();
167 bgpSpeakers.add(speaker1);
168 bgpSpeakers.add(speaker2);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700169 bgpSpeakers.add(speaker3);
Jonathan Hartce430a42014-10-16 20:44:29 -0700170
Jonathan Hart4cb39882015-08-12 23:50:55 -0400171 return bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -0700172 }
173
174 /**
175 * Sets up logical interfaces, which emulate the configured interfaces
Luca Prete83bac342016-12-06 19:42:05 -0800176 * in the SDN-IP application.
Jonathan Hartce430a42014-10-16 20:44:29 -0700177 *
Jonathan Hart9a426f82015-09-03 15:43:13 +0200178 * @return configured interfaces as a map from interface name to Interface
Jonathan Hartce430a42014-10-16 20:44:29 -0700179 */
180 private Map<String, Interface> setUpInterfaces() {
181
Jonathan Hart9a426f82015-09-03 15:43:13 +0200182 Map<String, Interface> configuredInterfaces = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700183
184 String interfaceSw1Eth1 = "s1-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700185 InterfaceIpAddress ia1 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700186 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700187 IpPrefix.valueOf("192.168.10.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800188 Interface intfsw1eth1 = new Interface(interfaceSw1Eth1, s1Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800189 Collections.singletonList(ia1),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800190 MacAddress.valueOf("00:00:00:00:00:01"),
191 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700192
193 configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700194
Jonathan Hartce430a42014-10-16 20:44:29 -0700195 String interfaceSw2Eth1 = "s2-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700196 InterfaceIpAddress ia2 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700197 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700198 IpPrefix.valueOf("192.168.20.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800199 Interface intfsw2eth1 = new Interface(interfaceSw2Eth1, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800200 Collections.singletonList(ia2),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800201 MacAddress.valueOf("00:00:00:00:00:02"),
202 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700203
Jonathan Hartce430a42014-10-16 20:44:29 -0700204 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
205
Jonathan Harte30fcda2015-08-06 16:22:34 -0700206 String interfaceSw2Eth1intf2 = "s2-eth1_2";
207 InterfaceIpAddress ia3 =
208 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
209 IpPrefix.valueOf("192.168.30.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800210 Interface intfsw2eth1intf2 = new Interface(interfaceSw2Eth1intf2, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800211 Collections.singletonList(ia3),
Jonathan Harte30fcda2015-08-06 16:22:34 -0700212 MacAddress.valueOf("00:00:00:00:00:03"),
213 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700214
Jonathan Harte30fcda2015-08-06 16:22:34 -0700215 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
216
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700217 String interfaceSw3Eth1 = "s3-eth1";
218 InterfaceIpAddress ia4 =
219 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
220 IpPrefix.valueOf("192.168.40.0/24"));
Sho SHIMIZU891162b2016-06-06 16:32:01 -0700221 Interface intfsw3eth1 = new Interface(Interface.NO_INTERFACE_NAME,
222 s3Eth1,
223 ImmutableList.of(ia4),
224 MacAddress.valueOf("00:00:00:00:00:04"),
225 VLAN10);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700226
227 configuredInterfaces.put(interfaceSw3Eth1, intfsw3eth1);
228
229 String interfaceSw3Eth1intf2 = "s3-eth1_2";
230 InterfaceIpAddress ia5 =
231 new InterfaceIpAddress(IpAddress.valueOf("192.168.50.101"),
232 IpPrefix.valueOf("192.168.50.0/24"));
Sho SHIMIZU891162b2016-06-06 16:32:01 -0700233 Interface intfsw3eth1intf2 = new Interface(Interface.NO_INTERFACE_NAME,
234 s3Eth1,
235 ImmutableList.of(ia5),
236 MacAddress.valueOf("00:00:00:00:00:05"),
237 VLAN20);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700238
239 configuredInterfaces.put(interfaceSw3Eth1intf2, intfsw3eth1intf2);
240
Jonathan Hart4cb39882015-08-12 23:50:55 -0400241 expect(interfaceService.getInterfacesByPort(s1Eth1))
242 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
243 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
244 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
245 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700246 .andReturn(intfsw1eth1).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700247
Jonathan Hart4cb39882015-08-12 23:50:55 -0400248 expect(interfaceService.getInterfacesByPort(s2Eth1))
249 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
250 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
251 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
252 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700253 .andReturn(intfsw2eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400254
255 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
256 .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes();
257 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700258 .andReturn(intfsw2eth1intf2).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700259
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700260 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
261 .andReturn(Collections.singleton(intfsw3eth1)).anyTimes();
262 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
263 .andReturn(intfsw3eth1).anyTimes();
264
265 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
266 .andReturn(Collections.singleton(intfsw3eth1intf2)).anyTimes();
267 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
268 .andReturn(intfsw3eth1intf2).anyTimes();
269
Jonathan Hartce430a42014-10-16 20:44:29 -0700270 // Non-existent interface used during one of the tests
Jonathan Hart4cb39882015-08-12 23:50:55 -0400271 expect(interfaceService.getInterfacesByPort(new ConnectPoint(
Jonathan Hart3d8ff282016-09-06 10:59:41 -0700272 DeviceId.deviceId("of:0000000000000100"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400273 PortNumber.portNumber(1))))
Jonathan Hartce430a42014-10-16 20:44:29 -0700274 .andReturn(null).anyTimes();
275
Jonathan Hart4cb39882015-08-12 23:50:55 -0400276 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hartce430a42014-10-16 20:44:29 -0700277 Sets.newHashSet(configuredInterfaces.values())).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700278
279 return configuredInterfaces;
280 }
281
282 /**
Jonathan Hartce430a42014-10-16 20:44:29 -0700283 * Sets up expected point to point intent list.
284 *
285 * @return point to point intent list
286 */
287 private List<PointToPointIntent> setUpIntentList() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800288 intentList = new ArrayList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700289
290 setUpBgpIntents();
291 setUpIcmpIntents();
292
293 return intentList;
Jonathan Hartce430a42014-10-16 20:44:29 -0700294 }
295
296 /**
297 * Constructs a BGP intent and put it into the intentList.
298 * <p/>
299 * The purpose of this method is too simplify the setUpBgpIntents() method,
300 * and to make the setUpBgpIntents() easy to read.
301 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700302 * @param srcVlanId ingress VlanId
303 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700304 * @param srcPrefix source IP prefix to match
305 * @param dstPrefix destination IP prefix to match
306 * @param srcTcpPort source TCP port to match
307 * @param dstTcpPort destination TCP port to match
308 * @param srcConnectPoint source connect point for PointToPointIntent
309 * @param dstConnectPoint destination connect point for PointToPointIntent
310 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700311 private void bgpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
312 String srcPrefix, String dstPrefix,
313 Short srcTcpPort, Short dstTcpPort,
314 ConnectPoint srcConnectPoint,
315 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700316
317 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
318 .matchEthType(Ethernet.TYPE_IPV4)
319 .matchIPProtocol(IPv4.PROTOCOL_TCP)
320 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
321 .matchIPDst(IpPrefix.valueOf(dstPrefix));
322
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700323 if (!srcVlanId.equals(VlanId.NONE)) {
Luca Pretee4a5e1a2016-09-07 17:01:22 -0700324 builder.matchVlanId(srcVlanId);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700325 }
326
327 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
328
329 if (!dstVlanId.equals(VlanId.NONE)) {
330 treatment.setVlanId(dstVlanId);
331 }
332
Jonathan Hartce430a42014-10-16 20:44:29 -0700333 if (srcTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700334 builder.matchTcpSrc(TpPort.tpPort(srcTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700335 }
336 if (dstTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700337 builder.matchTcpDst(TpPort.tpPort(dstTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700338 }
339
Jonathan Hart9a426f82015-09-03 15:43:13 +0200340 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
341 + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID);
342
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700343 PointToPointIntent intent = PointToPointIntent.builder()
344 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200345 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700346 .selector(builder.build())
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700347 .treatment(treatment.build())
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700348 .ingressPoint(srcConnectPoint)
349 .egressPoint(dstConnectPoint)
350 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700351
352 intentList.add(intent);
353 }
354
355 /**
356 * Sets up intents for BGP paths.
357 */
358 private void setUpBgpIntents() {
359
Jonathan Hart41349e92015-02-09 14:14:02 -0800360 Short bgpPort = 179;
Jonathan Hartce430a42014-10-16 20:44:29 -0700361
362 // Start to build intents between BGP speaker1 and BGP peer1
363 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700364 NO_VLAN, NO_VLAN,
365 "192.168.10.101/32", "192.168.10.1/32",
366 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700367 s1Eth100, s1Eth1);
368 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700369 NO_VLAN, NO_VLAN,
370 "192.168.10.101/32", "192.168.10.1/32",
371 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700372 s1Eth100, s1Eth1);
373
374 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700375 NO_VLAN, NO_VLAN,
376 "192.168.10.1/32", "192.168.10.101/32",
377 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700378 s1Eth1, s1Eth100);
379 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700380 NO_VLAN, NO_VLAN,
381 "192.168.10.1/32", "192.168.10.101/32",
382 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700383 s1Eth1, s1Eth100);
384
385 // Start to build intents between BGP speaker1 and BGP peer2
386 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700387 NO_VLAN, NO_VLAN,
388 "192.168.20.101/32", "192.168.20.1/32",
389 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700390 s1Eth100, s2Eth1);
391 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700392 NO_VLAN, NO_VLAN,
393 "192.168.20.101/32", "192.168.20.1/32",
394 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700395 s1Eth100, s2Eth1);
396
397 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700398 NO_VLAN, NO_VLAN,
399 "192.168.20.1/32", "192.168.20.101/32",
400 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700401 s2Eth1, s1Eth100);
402 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700403 NO_VLAN, NO_VLAN,
404 "192.168.20.1/32", "192.168.20.101/32",
405 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700406 s2Eth1, s1Eth100);
407
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700408 // Start to build intents between BGP speaker2 and BGP peer1
Jonathan Hartce430a42014-10-16 20:44:29 -0700409 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700410 NO_VLAN, NO_VLAN,
411 "192.168.30.101/32", "192.168.30.1/32",
412 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700413 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700414 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700415 NO_VLAN, NO_VLAN,
416 "192.168.30.101/32", "192.168.30.1/32",
417 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700418 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700419
420 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700421 NO_VLAN, NO_VLAN,
422 "192.168.30.1/32", "192.168.30.101/32",
423 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700424 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700425 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700426 NO_VLAN, NO_VLAN,
427 "192.168.30.1/32", "192.168.30.101/32",
428 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700429 s2Eth1, s1Eth100);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700430
431 // Start to build intents between BGP speaker3 and BGP peer4
432 bgpPathintentConstructor(
433 VLAN30, VLAN10,
434 "192.168.40.101/32", "192.168.40.1/32",
435 null, bgpPort,
436 s3Eth100, s3Eth1);
437 bgpPathintentConstructor(
438 VLAN30, VLAN10,
439 "192.168.40.101/32", "192.168.40.1/32",
440 bgpPort, null,
441 s3Eth100, s3Eth1);
442
443 bgpPathintentConstructor(
444 VLAN10, VLAN30,
445 "192.168.40.1/32", "192.168.40.101/32",
446 null, bgpPort,
447 s3Eth1, s3Eth100);
448 bgpPathintentConstructor(
449 VLAN10, VLAN30,
450 "192.168.40.1/32", "192.168.40.101/32",
451 bgpPort, null,
452 s3Eth1, s3Eth100);
453
454 // Start to build intents between BGP speaker3 and BGP peer5
455 bgpPathintentConstructor(
456 VLAN30, VLAN20,
457 "192.168.50.101/32", "192.168.50.1/32",
458 null, bgpPort,
459 s3Eth100, s3Eth1);
460 bgpPathintentConstructor(
461 VLAN30, VLAN20,
462 "192.168.50.101/32", "192.168.50.1/32",
463 bgpPort, null,
464 s3Eth100, s3Eth1);
465
466 bgpPathintentConstructor(
467 VLAN20, VLAN30,
468 "192.168.50.1/32", "192.168.50.101/32",
469 null, bgpPort,
470 s3Eth1, s3Eth100);
471 bgpPathintentConstructor(
472 VLAN20, VLAN30,
473 "192.168.50.1/32", "192.168.50.101/32",
474 bgpPort, null,
475 s3Eth1, s3Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700476 }
477
478 /**
479 * Constructs a BGP intent and put it into the intentList.
480 * <p/>
481 * The purpose of this method is too simplify the setUpBgpIntents() method,
482 * and to make the setUpBgpIntents() easy to read.
483 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700484 * @param srcVlanId ingress VlanId
485 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700486 * @param srcPrefix source IP prefix to match
487 * @param dstPrefix destination IP prefix to match
488 * @param srcConnectPoint source connect point for PointToPointIntent
489 * @param dstConnectPoint destination connect point for PointToPointIntent
490 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700491 private void icmpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
492 String srcPrefix, String dstPrefix,
493 ConnectPoint srcConnectPoint,
494 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700495
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700496 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
Jonathan Hartce430a42014-10-16 20:44:29 -0700497 .matchEthType(Ethernet.TYPE_IPV4)
498 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
499 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700500 .matchIPDst(IpPrefix.valueOf(dstPrefix));
501
502 if (!srcVlanId.equals(VlanId.NONE)) {
Luca Pretee4a5e1a2016-09-07 17:01:22 -0700503 builder.matchVlanId(srcVlanId);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700504 }
505
506 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
507
508 if (!dstVlanId.equals(VlanId.NONE)) {
509 treatment.setVlanId(dstVlanId);
510 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700511
Jonathan Hart9a426f82015-09-03 15:43:13 +0200512 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
513 + "-" + "icmp", APPID);
514
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700515 PointToPointIntent intent = PointToPointIntent.builder()
516 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200517 .key(key)
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700518 .selector(builder.build())
519 .treatment(treatment.build())
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700520 .ingressPoint(srcConnectPoint)
521 .egressPoint(dstConnectPoint)
522 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700523
524 intentList.add(intent);
525 }
526
527 /**
528 * Sets up intents for ICMP paths.
529 */
530 private void setUpIcmpIntents() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700531 // Start to build intents between BGP speaker1 and BGP peer1
532 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700533 NO_VLAN, NO_VLAN,
534 "192.168.10.101/32", "192.168.10.1/32",
535 s1Eth100, s1Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700536 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700537 NO_VLAN, NO_VLAN,
538 "192.168.10.1/32", "192.168.10.101/32",
539 s1Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700540
541 // Start to build intents between BGP speaker1 and BGP peer2
542 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700543 NO_VLAN, NO_VLAN,
544 "192.168.20.101/32", "192.168.20.1/32",
545 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700546 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700547 NO_VLAN, NO_VLAN,
548 "192.168.20.1/32", "192.168.20.101/32",
549 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700550
Jonathan Hartce430a42014-10-16 20:44:29 -0700551 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700552 NO_VLAN, NO_VLAN,
553 "192.168.30.101/32", "192.168.30.1/32",
554 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700555 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700556 NO_VLAN, NO_VLAN,
557 "192.168.30.1/32", "192.168.30.101/32",
558 s2Eth1, s1Eth100);
559
560 // Start to build intents between BGP speaker3 and BGP peer 4
561 icmpPathintentConstructor(
562 VLAN10, VLAN30,
563 "192.168.40.1/32", "192.168.40.101/32",
564 s3Eth1, s3Eth100);
565 icmpPathintentConstructor(
566 VLAN30, VLAN10,
567 "192.168.40.101/32", "192.168.40.1/32",
568 s3Eth100, s3Eth1);
569
570 // Start to build intents between BGP speaker3 and BGP peer 5
571 icmpPathintentConstructor(
572 VLAN20, VLAN30,
573 "192.168.50.1/32", "192.168.50.101/32",
574 s3Eth1, s3Eth100);
575 icmpPathintentConstructor(
576 VLAN30, VLAN20,
577 "192.168.50.101/32", "192.168.50.1/32",
578 s3Eth100, s3Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700579 }
580
581 /**
582 * Initializes peer connectivity testing environment.
583 */
Jonathan Hartde6e2032016-04-15 13:28:02 -0700584 private void initPeerConnectivity() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400585 expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
586 replay(bgpConfig);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200587 expect(networkConfigService.getConfig(APPID, BgpConfig.class))
588 .andReturn(bgpConfig).anyTimes();
Luca Prete83bac342016-12-06 19:42:05 -0800589
590 expect(sdnIpConfig.encap()).andReturn(EncapsulationType.NONE).anyTimes();
591 replay(sdnIpConfig);
592 expect(networkConfigService.getConfig(APPID, SdnIpConfig.class))
593 .andReturn(sdnIpConfig).anyTimes();
594
Jonathan Hart4cb39882015-08-12 23:50:55 -0400595 replay(networkConfigService);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400596 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700597
Jonathan Hart9a426f82015-09-03 15:43:13 +0200598 intentSynchronizer = createMock(IntentSynchronizationService.class);
599 replay(intentSynchronizer);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800600
601 peerConnectivityManager =
602 new PeerConnectivityManager(APPID, intentSynchronizer,
Jonathan Hart4cb39882015-08-12 23:50:55 -0400603 networkConfigService,
604 CONFIG_APP_ID,
605 interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700606 }
607
Jonathan Hartce430a42014-10-16 20:44:29 -0700608 /**
609 * Tests whether peer connectivity manager can set up correct BGP and
610 * ICMP intents according to specific configuration.
611 * <p/>
612 * Two tricky cases included in the configuration are: 2 peers on a same
613 * switch port, peer on the same switch with BGPd.
614 */
615 @Test
616 public void testConnectionSetup() {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200617 reset(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700618
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800619 // Setup the expected intents
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800620 for (Intent intent : intentList) {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200621 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hartce430a42014-10-16 20:44:29 -0700622 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200623 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700624
625 // Running the interface to be tested.
626 peerConnectivityManager.start();
627
Jonathan Hart9a426f82015-09-03 15:43:13 +0200628 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700629 }
630
631 /**
632 * Tests a corner case, when there are no interfaces in the configuration.
633 */
634 @Test
635 public void testNullInterfaces() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400636 reset(interfaceService);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800637 interfaceService.addListener(anyObject(InterfaceListener.class));
638 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400639
640 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hart9a426f82015-09-03 15:43:13 +0200641 Sets.newHashSet()).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400642 expect(interfaceService.getInterfacesByPort(s2Eth1))
643 .andReturn(Collections.emptySet()).anyTimes();
644 expect(interfaceService.getInterfacesByPort(s1Eth1))
645 .andReturn(Collections.emptySet()).anyTimes();
646 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
647 .andReturn(Collections.emptySet()).anyTimes();
648 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700649 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400650 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
651 .andReturn(Collections.emptySet()).anyTimes();
652 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700653 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400654 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
655 .andReturn(Collections.emptySet()).anyTimes();
656 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700657 .andReturn(null).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700658 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
659 .andReturn(Collections.emptySet()).anyTimes();
660 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
661 .andReturn(null).anyTimes();
662 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
663 .andReturn(Collections.emptySet()).anyTimes();
664 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
665 .andReturn(null).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700666
Jonathan Hart4cb39882015-08-12 23:50:55 -0400667 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700668
Jonathan Hart9a426f82015-09-03 15:43:13 +0200669 reset(intentSynchronizer);
670 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700671 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200672 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700673 }
674
675 /**
676 * Tests a corner case, when there is no BGP speakers in the configuration.
677 */
678 @Test
679 public void testNullBgpSpeakers() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400680 reset(bgpConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400681 expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
682 replay(bgpConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700683
Luca Prete83bac342016-12-06 19:42:05 -0800684 reset(sdnIpConfig);
685 expect(sdnIpConfig.encap()).andReturn(EncapsulationType.NONE).anyTimes();
686 replay(sdnIpConfig);
687
Jonathan Hartde6e2032016-04-15 13:28:02 -0700688 // We don't expect any intents in this case
Jonathan Hart9a426f82015-09-03 15:43:13 +0200689 reset(intentSynchronizer);
690 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700691 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200692 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700693 }
694
695 /**
696 * Tests a corner case, when there is no Interface configured for one BGP
697 * peer.
698 */
699 @Test
700 public void testNoPeerInterface() {
Jonathan Hartde6e2032016-04-15 13:28:02 -0700701 IpAddress ip = IpAddress.valueOf("1.1.1.1");
702 bgpSpeakers.clear();
703 bgpSpeakers.add(new BgpConfig.BgpSpeakerConfig(Optional.of("foo"),
704 VlanId.NONE, s1Eth100, Collections.singleton(ip)));
705 reset(interfaceService);
706 interfaceService.addListener(anyObject(InterfaceListener.class));
707 expect(interfaceService.getMatchingInterface(ip)).andReturn(null).anyTimes();
708 replay(interfaceService);
709
710 // We don't expect any intents in this case
711 reset(intentSynchronizer);
712 replay(intentSynchronizer);
713 peerConnectivityManager.start();
714 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700715 }
716
Jonathan Hartce430a42014-10-16 20:44:29 -0700717}