blob: b226fff56602cc465a09772602a974dc16e0326e [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 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 */
alshabib4a179dc2014-10-17 17:17:01 -070016package org.onlab.onos.provider.host.impl;
17
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertNotNull;
20import static org.junit.Assert.assertNull;
21
22import java.nio.ByteBuffer;
23import java.util.Set;
24
25import org.junit.After;
26import org.junit.Before;
27import org.junit.Test;
28import org.onlab.onos.net.ConnectPoint;
29import org.onlab.onos.net.DeviceId;
30import org.onlab.onos.net.HostId;
31import org.onlab.onos.net.PortNumber;
32import org.onlab.onos.net.flow.TrafficTreatment;
33import org.onlab.onos.net.host.HostDescription;
34import org.onlab.onos.net.host.HostProvider;
35import org.onlab.onos.net.host.HostProviderRegistry;
36import org.onlab.onos.net.host.HostProviderService;
37import org.onlab.onos.net.packet.DefaultInboundPacket;
38import org.onlab.onos.net.packet.InboundPacket;
39import org.onlab.onos.net.packet.OutboundPacket;
40import org.onlab.onos.net.packet.PacketContext;
41import org.onlab.onos.net.packet.PacketProcessor;
42import org.onlab.onos.net.packet.PacketService;
43import org.onlab.onos.net.provider.AbstractProviderService;
44import org.onlab.onos.net.provider.ProviderId;
45import org.onlab.onos.net.topology.Topology;
46
47import org.onlab.onos.net.topology.TopologyServiceAdapter;
48import org.onlab.packet.ARP;
49import org.onlab.packet.Ethernet;
50import org.onlab.packet.MacAddress;
51import org.onlab.packet.VlanId;
52
53public class HostLocationProviderTest {
54
55 private static final Integer INPORT = 10;
56 private static final String DEV1 = "of:1";
57 private static final String DEV2 = "of:2";
58 private static final String DEV3 = "of:3";
59
60 private static final VlanId VLAN = VlanId.vlanId();
61 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
62 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
63 private static final byte[] IP = new byte[]{10, 0, 0, 1};
64
65 private final HostLocationProvider provider = new HostLocationProvider();
66 private final TestHostRegistry hostService = new TestHostRegistry();
67 private final TestTopologyService topoService = new TestTopologyService();
68 private final TestPacketService packetService = new TestPacketService();
69
70 private PacketProcessor testProcessor;
71 private TestHostProviderService providerService;
72
73 @Before
74 public void setUp() {
75 provider.providerRegistry = hostService;
76 provider.topologyService = topoService;
77 provider.pktService = packetService;
78
79 provider.activate();
80
81 }
82
83 @Test
84 public void basics() {
85 assertNotNull("registration expected", providerService);
86 assertEquals("incorrect provider", provider, providerService.provider());
87 }
88
89 @Test
90 public void events() {
91 // new host
92
93
94 testProcessor.process(new TestPacketContext(DEV1));
95 assertNotNull("new host expected", providerService.added);
96 assertNull("host motion unexpected", providerService.moved);
97
98 // the host moved to new switch
99 testProcessor.process(new TestPacketContext(DEV2));
100 assertNotNull("host motion expected", providerService.moved);
101
102 // the host was misheard on a spine
103 testProcessor.process(new TestPacketContext(DEV3));
104 assertNull("host misheard on spine switch", providerService.spine);
105 }
106
107 @After
108 public void tearDown() {
109 provider.deactivate();
110 provider.providerRegistry = null;
111
112 }
113
114 private class TestHostRegistry implements HostProviderRegistry {
115
116 @Override
117 public HostProviderService register(HostProvider provider) {
118 providerService = new TestHostProviderService(provider);
119 return providerService;
120 }
121
122 @Override
123 public void unregister(HostProvider provider) {
124 }
125
126 @Override
127 public Set<ProviderId> getProviders() {
128 return null;
129 }
130
131 }
132
133 private class TestHostProviderService
134 extends AbstractProviderService<HostProvider>
135 implements HostProviderService {
136
137 DeviceId added = null;
138 DeviceId moved = null;
139 DeviceId spine = null;
140
141 protected TestHostProviderService(HostProvider provider) {
142 super(provider);
143 }
144
145 @Override
146 public void hostDetected(HostId hostId, HostDescription hostDescription) {
147 DeviceId descr = hostDescription.location().deviceId();
148 if (added == null) {
149 added = descr;
150 } else if ((moved == null) && !descr.equals(added)) {
151 moved = descr;
152 } else {
153 spine = descr;
154 }
155 }
156
157 @Override
158 public void hostVanished(HostId hostId) {
159 }
160
161 }
162
163 private class TestPacketService implements PacketService {
164
165 @Override
166 public void addProcessor(PacketProcessor processor, int priority) {
167 testProcessor = processor;
168 }
169
170 @Override
171 public void removeProcessor(PacketProcessor processor) {
172
173 }
174
175 @Override
176 public void emit(OutboundPacket packet) {
177
178 }
179 }
180
181
182 private class TestTopologyService extends TopologyServiceAdapter {
183 @Override
184 public boolean isInfrastructure(Topology topology,
185 ConnectPoint connectPoint) {
186 //simulate DPID3 as an infrastructure switch
187 if ((connectPoint.deviceId()).equals(DeviceId.deviceId(DEV3))) {
188 return true;
189 }
190 return false;
191 }
192 }
193
194 private class TestPacketContext implements PacketContext {
195
196 private final String deviceId;
197
198 public TestPacketContext(String deviceId) {
199 this.deviceId = deviceId;
200 }
201
202 @Override
203 public long time() {
204 return 0;
205 }
206
207 @Override
208 public InboundPacket inPacket() {
209 ARP arp = new ARP();
210 arp.setSenderProtocolAddress(IP)
211 .setSenderHardwareAddress(MAC.toBytes())
212 .setTargetHardwareAddress(BCMAC.toBytes())
213 .setTargetProtocolAddress(IP);
214
215 Ethernet eth = new Ethernet();
216 eth.setEtherType(Ethernet.TYPE_ARP)
217 .setVlanID(VLAN.toShort())
218 .setSourceMACAddress(MAC.toBytes())
219 .setDestinationMACAddress(BCMAC.getAddress())
220 .setPayload(arp);
221 ConnectPoint receivedFrom = new ConnectPoint(DeviceId.deviceId(deviceId),
222 PortNumber.portNumber(INPORT));
223 return new DefaultInboundPacket(receivedFrom, eth,
224 ByteBuffer.wrap(eth.serialize()));
225 }
226
227 @Override
228 public OutboundPacket outPacket() {
229 return null;
230 }
231
232 @Override
233 public TrafficTreatment.Builder treatmentBuilder() {
234 return null;
235 }
236
237 @Override
238 public void send() {
239
240 }
241
242 @Override
243 public boolean block() {
244 return false;
245 }
246
247 @Override
248 public boolean isHandled() {
249 return false;
250 }
251 }
252}