blob: df211fb8e6840be8993f976b83862b3ea9c9bbc8 [file] [log] [blame]
Jonathan Hartb4758a92014-09-24 10:46:45 -07001package org.onlab.onos.net.host.impl;
2
3import static org.easymock.EasyMock.createMock;
4import static org.easymock.EasyMock.expect;
5import static org.easymock.EasyMock.expectLastCall;
6import static org.easymock.EasyMock.replay;
7import static org.easymock.EasyMock.verify;
Jonathan Hartdc09a3b2014-10-27 11:34:26 -07008import static org.junit.Assert.assertEquals;
Jonathan Hartb4758a92014-09-24 10:46:45 -07009import static org.junit.Assert.assertTrue;
10
11import java.util.ArrayList;
12import java.util.Arrays;
13import java.util.Collections;
14import java.util.List;
15import java.util.Set;
16
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070017import org.junit.After;
Jonathan Hartb4758a92014-09-24 10:46:45 -070018import org.junit.Test;
19import org.onlab.onos.net.ConnectPoint;
20import org.onlab.onos.net.Device;
21import org.onlab.onos.net.DeviceId;
22import org.onlab.onos.net.Host;
23import org.onlab.onos.net.MastershipRole;
24import org.onlab.onos.net.Port;
25import org.onlab.onos.net.PortNumber;
26import org.onlab.onos.net.device.DeviceListener;
27import org.onlab.onos.net.device.DeviceService;
28import org.onlab.onos.net.flow.instructions.Instruction;
29import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction;
30import org.onlab.onos.net.host.HostProvider;
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -070031import org.onlab.onos.net.host.InterfaceIpAddress;
Jonathan Hartb4758a92014-09-24 10:46:45 -070032import org.onlab.onos.net.host.PortAddresses;
33import org.onlab.onos.net.packet.OutboundPacket;
34import org.onlab.onos.net.packet.PacketProcessor;
35import org.onlab.onos.net.packet.PacketService;
36import org.onlab.onos.net.provider.ProviderId;
37import org.onlab.packet.ARP;
38import org.onlab.packet.Ethernet;
39import org.onlab.packet.IpAddress;
40import org.onlab.packet.IpPrefix;
41import org.onlab.packet.MacAddress;
42
43import com.google.common.collect.HashMultimap;
44import com.google.common.collect.Lists;
45import com.google.common.collect.Multimap;
46
47public class HostMonitorTest {
48
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -070049 private static final IpAddress TARGET_IP_ADDR =
50 IpAddress.valueOf("10.0.0.1");
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -070051 private static final IpAddress SOURCE_ADDR =
52 IpAddress.valueOf("10.0.0.99");
53 private static final InterfaceIpAddress IA1 =
54 new InterfaceIpAddress(SOURCE_ADDR, IpPrefix.valueOf("10.0.0.0/24"));
Jonathan Hartb4758a92014-09-24 10:46:45 -070055 private MacAddress sourceMac = MacAddress.valueOf(1L);
56
57 private HostMonitor hostMonitor;
58
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070059 @After
60 public void shutdown() {
61 hostMonitor.shutdown();
62 }
63
Jonathan Hartb4758a92014-09-24 10:46:45 -070064 @Test
65 public void testMonitorHostExists() throws Exception {
66 ProviderId id = new ProviderId("fake://", "id");
67
68 Host host = createMock(Host.class);
69 expect(host.providerId()).andReturn(id);
70 replay(host);
71
72 HostManager hostManager = createMock(HostManager.class);
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -070073 expect(hostManager.getHostsByIp(TARGET_IP_ADDR))
Jonathan Hartb4758a92014-09-24 10:46:45 -070074 .andReturn(Collections.singleton(host));
75 replay(hostManager);
76
77 HostProvider hostProvider = createMock(HostProvider.class);
78 expect(hostProvider.id()).andReturn(id).anyTimes();
79 hostProvider.triggerProbe(host);
80 expectLastCall().once();
81 replay(hostProvider);
82
83 hostMonitor = new HostMonitor(null, null, hostManager);
84
85 hostMonitor.registerHostProvider(hostProvider);
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -070086 hostMonitor.addMonitoringFor(TARGET_IP_ADDR);
Jonathan Hartb4758a92014-09-24 10:46:45 -070087
88 hostMonitor.run(null);
89
90 verify(hostProvider);
91 }
92
93 @Test
Jonathan Hartb4758a92014-09-24 10:46:45 -070094 public void testMonitorHostDoesNotExist() throws Exception {
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070095
Jonathan Hartb4758a92014-09-24 10:46:45 -070096 HostManager hostManager = createMock(HostManager.class);
97
98 DeviceId devId = DeviceId.deviceId("fake");
99
100 Device device = createMock(Device.class);
101 expect(device.id()).andReturn(devId).anyTimes();
102 replay(device);
103
104 PortNumber portNum = PortNumber.portNumber(1L);
105
106 Port port = createMock(Port.class);
107 expect(port.number()).andReturn(portNum).anyTimes();
108 replay(port);
109
110 TestDeviceService deviceService = new TestDeviceService();
111 deviceService.addDevice(device, Collections.singleton(port));
112
113 ConnectPoint cp = new ConnectPoint(devId, portNum);
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700114 PortAddresses pa =
115 new PortAddresses(cp, Collections.singleton(IA1), sourceMac);
Jonathan Hartb4758a92014-09-24 10:46:45 -0700116
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700117 expect(hostManager.getHostsByIp(TARGET_IP_ADDR))
Jonathan Hartb4758a92014-09-24 10:46:45 -0700118 .andReturn(Collections.<Host>emptySet()).anyTimes();
119 expect(hostManager.getAddressBindingsForPort(cp))
120 .andReturn(pa).anyTimes();
121 replay(hostManager);
122
123 TestPacketService packetService = new TestPacketService();
124
125
126 // Run the test
127 hostMonitor = new HostMonitor(deviceService, packetService, hostManager);
128
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700129 hostMonitor.addMonitoringFor(TARGET_IP_ADDR);
Jonathan Hartb4758a92014-09-24 10:46:45 -0700130 hostMonitor.run(null);
131
132
133 // Check that a packet was sent to our PacketService and that it has
134 // the properties we expect
Jonathan Hartdc09a3b2014-10-27 11:34:26 -0700135 assertEquals(1, packetService.packets.size());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700136 OutboundPacket packet = packetService.packets.get(0);
137
138 // Check the output port is correct
Jonathan Hartdc09a3b2014-10-27 11:34:26 -0700139 assertEquals(1, packet.treatment().instructions().size());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700140 Instruction instruction = packet.treatment().instructions().get(0);
141 assertTrue(instruction instanceof OutputInstruction);
142 OutputInstruction oi = (OutputInstruction) instruction;
143 assertTrue(oi.port().equals(portNum));
144
145 // Check the output packet is correct (well the important bits anyway)
146 Ethernet eth = new Ethernet();
147 eth.deserialize(packet.data().array(), 0, packet.data().array().length);
148 ARP arp = (ARP) eth.getPayload();
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700149 assertTrue(Arrays.equals(arp.getSenderProtocolAddress(),
150 SOURCE_ADDR.toOctets()));
Jonathan Hartb4758a92014-09-24 10:46:45 -0700151 assertTrue(Arrays.equals(arp.getSenderHardwareAddress(), sourceMac.toBytes()));
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700152 assertTrue(Arrays.equals(arp.getTargetProtocolAddress(),
153 TARGET_IP_ADDR.toOctets()));
Jonathan Hartb4758a92014-09-24 10:46:45 -0700154 }
155
156 class TestPacketService implements PacketService {
157
158 List<OutboundPacket> packets = new ArrayList<>();
159
160 @Override
161 public void addProcessor(PacketProcessor processor, int priority) {
162 }
163
164 @Override
165 public void removeProcessor(PacketProcessor processor) {
166 }
167
168 @Override
169 public void emit(OutboundPacket packet) {
170 packets.add(packet);
171 }
172 }
173
174 class TestDeviceService implements DeviceService {
175
176 List<Device> devices = Lists.newArrayList();
177 Multimap<DeviceId, Port> devicePorts = HashMultimap.create();
178
179 void addDevice(Device device, Set<Port> ports) {
180 devices.add(device);
181 for (Port p : ports) {
182 devicePorts.put(device.id(), p);
183 }
184 }
185
186 @Override
187 public int getDeviceCount() {
188 return 0;
189 }
190
191 @Override
192 public Iterable<Device> getDevices() {
193 return devices;
194 }
195
196 @Override
197 public Device getDevice(DeviceId deviceId) {
198 return null;
199 }
200
201 @Override
202 public MastershipRole getRole(DeviceId deviceId) {
203 return null;
204 }
205
206 @Override
207 public List<Port> getPorts(DeviceId deviceId) {
208 List<Port> ports = Lists.newArrayList();
209 for (Port p : devicePorts.get(deviceId)) {
210 ports.add(p);
211 }
212 return ports;
213 }
214
215 @Override
216 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
217 return null;
218 }
219
220 @Override
221 public boolean isAvailable(DeviceId deviceId) {
222 return false;
223 }
224
225 @Override
226 public void addListener(DeviceListener listener) {
227 }
228
229 @Override
230 public void removeListener(DeviceListener listener) {
231 }
232 }
233}