blob: 7fc6b8c8c2c75471e902b0db932f21c2bbed566b [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;
31import org.onlab.onos.net.host.PortAddresses;
32import org.onlab.onos.net.packet.OutboundPacket;
33import org.onlab.onos.net.packet.PacketProcessor;
34import org.onlab.onos.net.packet.PacketService;
35import org.onlab.onos.net.provider.ProviderId;
36import org.onlab.packet.ARP;
37import org.onlab.packet.Ethernet;
38import org.onlab.packet.IpAddress;
39import org.onlab.packet.IpPrefix;
40import org.onlab.packet.MacAddress;
41
42import com.google.common.collect.HashMultimap;
43import com.google.common.collect.Lists;
44import com.google.common.collect.Multimap;
45
46public class HostMonitorTest {
47
48 private IpAddress targetIpAddress = IpAddress.valueOf("10.0.0.1");
49 private IpPrefix targetIpPrefix = IpPrefix.valueOf(targetIpAddress.toOctets());
50
51 private IpPrefix sourcePrefix = IpPrefix.valueOf("10.0.0.99/24");
52 private MacAddress sourceMac = MacAddress.valueOf(1L);
53
54 private HostMonitor hostMonitor;
55
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070056 @After
57 public void shutdown() {
58 hostMonitor.shutdown();
59 }
60
Jonathan Hartb4758a92014-09-24 10:46:45 -070061 @Test
62 public void testMonitorHostExists() throws Exception {
63 ProviderId id = new ProviderId("fake://", "id");
64
65 Host host = createMock(Host.class);
66 expect(host.providerId()).andReturn(id);
67 replay(host);
68
69 HostManager hostManager = createMock(HostManager.class);
70 expect(hostManager.getHostsByIp(targetIpPrefix))
71 .andReturn(Collections.singleton(host));
72 replay(hostManager);
73
74 HostProvider hostProvider = createMock(HostProvider.class);
75 expect(hostProvider.id()).andReturn(id).anyTimes();
76 hostProvider.triggerProbe(host);
77 expectLastCall().once();
78 replay(hostProvider);
79
80 hostMonitor = new HostMonitor(null, null, hostManager);
81
82 hostMonitor.registerHostProvider(hostProvider);
83 hostMonitor.addMonitoringFor(targetIpAddress);
84
85 hostMonitor.run(null);
86
87 verify(hostProvider);
88 }
89
90 @Test
Jonathan Hartb4758a92014-09-24 10:46:45 -070091 public void testMonitorHostDoesNotExist() throws Exception {
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070092
Jonathan Hartb4758a92014-09-24 10:46:45 -070093 HostManager hostManager = createMock(HostManager.class);
94
95 DeviceId devId = DeviceId.deviceId("fake");
96
97 Device device = createMock(Device.class);
98 expect(device.id()).andReturn(devId).anyTimes();
99 replay(device);
100
101 PortNumber portNum = PortNumber.portNumber(1L);
102
103 Port port = createMock(Port.class);
104 expect(port.number()).andReturn(portNum).anyTimes();
105 replay(port);
106
107 TestDeviceService deviceService = new TestDeviceService();
108 deviceService.addDevice(device, Collections.singleton(port));
109
110 ConnectPoint cp = new ConnectPoint(devId, portNum);
111 PortAddresses pa = new PortAddresses(cp, Collections.singleton(sourcePrefix),
112 sourceMac);
113
114 expect(hostManager.getHostsByIp(targetIpPrefix))
115 .andReturn(Collections.<Host>emptySet()).anyTimes();
116 expect(hostManager.getAddressBindingsForPort(cp))
117 .andReturn(pa).anyTimes();
118 replay(hostManager);
119
120 TestPacketService packetService = new TestPacketService();
121
122
123 // Run the test
124 hostMonitor = new HostMonitor(deviceService, packetService, hostManager);
125
126 hostMonitor.addMonitoringFor(targetIpAddress);
127 hostMonitor.run(null);
128
129
130 // Check that a packet was sent to our PacketService and that it has
131 // the properties we expect
Jonathan Hartdc09a3b2014-10-27 11:34:26 -0700132 assertEquals(1, packetService.packets.size());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700133 OutboundPacket packet = packetService.packets.get(0);
134
135 // Check the output port is correct
Jonathan Hartdc09a3b2014-10-27 11:34:26 -0700136 assertEquals(1, packet.treatment().instructions().size());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700137 Instruction instruction = packet.treatment().instructions().get(0);
138 assertTrue(instruction instanceof OutputInstruction);
139 OutputInstruction oi = (OutputInstruction) instruction;
140 assertTrue(oi.port().equals(portNum));
141
142 // Check the output packet is correct (well the important bits anyway)
143 Ethernet eth = new Ethernet();
144 eth.deserialize(packet.data().array(), 0, packet.data().array().length);
145 ARP arp = (ARP) eth.getPayload();
146 assertTrue(Arrays.equals(arp.getSenderProtocolAddress(), sourcePrefix.toOctets()));
147 assertTrue(Arrays.equals(arp.getSenderHardwareAddress(), sourceMac.toBytes()));
148 assertTrue(Arrays.equals(arp.getTargetProtocolAddress(), targetIpPrefix.toOctets()));
149 }
150
151 class TestPacketService implements PacketService {
152
153 List<OutboundPacket> packets = new ArrayList<>();
154
155 @Override
156 public void addProcessor(PacketProcessor processor, int priority) {
157 }
158
159 @Override
160 public void removeProcessor(PacketProcessor processor) {
161 }
162
163 @Override
164 public void emit(OutboundPacket packet) {
165 packets.add(packet);
166 }
167 }
168
169 class TestDeviceService implements DeviceService {
170
171 List<Device> devices = Lists.newArrayList();
172 Multimap<DeviceId, Port> devicePorts = HashMultimap.create();
173
174 void addDevice(Device device, Set<Port> ports) {
175 devices.add(device);
176 for (Port p : ports) {
177 devicePorts.put(device.id(), p);
178 }
179 }
180
181 @Override
182 public int getDeviceCount() {
183 return 0;
184 }
185
186 @Override
187 public Iterable<Device> getDevices() {
188 return devices;
189 }
190
191 @Override
192 public Device getDevice(DeviceId deviceId) {
193 return null;
194 }
195
196 @Override
197 public MastershipRole getRole(DeviceId deviceId) {
198 return null;
199 }
200
201 @Override
202 public List<Port> getPorts(DeviceId deviceId) {
203 List<Port> ports = Lists.newArrayList();
204 for (Port p : devicePorts.get(deviceId)) {
205 ports.add(p);
206 }
207 return ports;
208 }
209
210 @Override
211 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
212 return null;
213 }
214
215 @Override
216 public boolean isAvailable(DeviceId deviceId) {
217 return false;
218 }
219
220 @Override
221 public void addListener(DeviceListener listener) {
222 }
223
224 @Override
225 public void removeListener(DeviceListener listener) {
226 }
227 }
228}