blob: 1ee61dfbb6d1d69012cbfe446581935103031864 [file] [log] [blame]
Ayaka Koshibeac8e7292014-09-16 16:08:31 -07001package org.onlab.onos.net.trivial.host.impl;
2
3import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse;
5import static org.junit.Assert.assertNull;
6import static org.junit.Assert.assertNotNull;
7import static org.junit.Assert.assertTrue;
8
9import java.util.List;
10import java.util.Set;
11
12import org.junit.After;
13import org.junit.Before;
14import org.junit.Test;
15import org.onlab.onos.event.Event;
16import org.onlab.onos.event.impl.TestEventDispatcher;
17import org.onlab.onos.net.DeviceId;
18import org.onlab.onos.net.Host;
19import org.onlab.onos.net.HostId;
20import org.onlab.onos.net.HostLocation;
21import org.onlab.onos.net.PortNumber;
22import org.onlab.onos.net.host.DefaultHostDescription;
23import org.onlab.onos.net.host.HostDescription;
24import org.onlab.onos.net.host.HostEvent;
25import org.onlab.onos.net.host.HostListener;
26import org.onlab.onos.net.host.HostProvider;
27import org.onlab.onos.net.host.HostProviderRegistry;
28import org.onlab.onos.net.host.HostProviderService;
29import org.onlab.onos.net.provider.AbstractProvider;
30import org.onlab.onos.net.provider.ProviderId;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070031import org.onlab.packet.IpAddress;
32import org.onlab.packet.MacAddress;
33import org.onlab.packet.VlanId;
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070034
35import com.google.common.collect.Lists;
36import com.google.common.collect.Sets;
37
38import static org.onlab.onos.net.host.HostEvent.Type.*;
39
40/**
41 * Test codifying the host service & host provider service contracts.
42 */
43public class SimpleHostManagerTest {
44
tom7e02cda2014-09-18 12:05:46 -070045 private static final ProviderId PID = new ProviderId("of", "foo");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070046
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070047 private static final VlanId VLAN1 = VlanId.vlanId((short) 1);
48 private static final VlanId VLAN2 = VlanId.vlanId((short) 2);
49 private static final MacAddress MAC1 = MacAddress.valueOf("00:00:11:00:00:01");
50 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070051 private static final HostId HID1 = HostId.hostId(MAC1, VLAN1);
52 private static final HostId HID2 = HostId.hostId(MAC2, VLAN1);
53
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070054 private static final IpAddress IP1 = IpAddress.valueOf("10.0.0.1");
55 private static final IpAddress IP2 = IpAddress.valueOf("10.0.0.2");
56 private static final Set<IpAddress> IPSET1 = Sets.newHashSet(IP1);
57 private static final Set<IpAddress> IPSET2 = Sets.newHashSet(IP2);
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070058
59 private static final DeviceId DID1 = DeviceId.deviceId("of:001");
60 private static final DeviceId DID2 = DeviceId.deviceId("of:002");
61 private static final PortNumber P1 = PortNumber.portNumber(100);
62 private static final PortNumber P2 = PortNumber.portNumber(200);
63 private static final HostLocation LOC1 = new HostLocation(DID1, P1, 123L);
64 private static final HostLocation LOC2 = new HostLocation(DID1, P2, 123L);
65
66 private SimpleHostManager mgr;
67
68 protected TestListener listener = new TestListener();
69 protected HostProviderRegistry registry;
70 protected TestHostProvider provider;
71 protected HostProviderService providerService;
72
73 @Before
74 public void setUp() {
75 mgr = new SimpleHostManager();
tom5bcc9462014-09-19 10:11:31 -070076 mgr.store = new SimpleHostStore();
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070077 mgr.eventDispatcher = new TestEventDispatcher();
78 registry = mgr;
79 mgr.activate();
80
81 mgr.addListener(listener);
82
83 provider = new TestHostProvider();
84 providerService = registry.register(provider);
85 assertTrue("provider should be registered",
86 registry.getProviders().contains(provider.id()));
87 }
88
89 @After
90 public void tearDown() {
91 registry.unregister(provider);
92 assertFalse("provider should not be registered",
93 registry.getProviders().contains(provider.id()));
94
95 mgr.removeListener(listener);
96 mgr.deactivate();
97 mgr.eventDispatcher = null;
98 }
99
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700100 private void detect(HostId hid, MacAddress mac, VlanId vlan,
101 HostLocation loc, Set<IpAddress> ips) {
Ayaka Koshibeac8e7292014-09-16 16:08:31 -0700102 HostDescription descr = new DefaultHostDescription(mac, vlan, loc, ips);
103 providerService.hostDetected(hid, descr);
104 assertNotNull("host should be found", mgr.getHost(hid));
105 }
106
107 private void validateEvents(Enum... types) {
108 int i = 0;
109 assertEquals("wrong events received", types.length, listener.events.size());
110 for (Event event : listener.events) {
111 assertEquals("incorrect event type", types[i], event.type());
112 i++;
113 }
114 listener.events.clear();
115 }
116
117 @Test
118 public void hostDetected() {
119 assertNull("host shouldn't be found", mgr.getHost(HID1));
120
121 // host addition
122 detect(HID1, MAC1, VLAN1, LOC1, IPSET1);
123 assertEquals("exactly one should be found", 1, mgr.getHostCount());
124 detect(HID2, MAC2, VLAN2, LOC2, IPSET1);
125 assertEquals("two hosts should be found", 2, mgr.getHostCount());
126 validateEvents(HOST_ADDED, HOST_ADDED);
127
128 // host motion
129 detect(HID1, MAC1, VLAN1, LOC2, IPSET1);
130 validateEvents(HOST_MOVED);
131 assertEquals("only two hosts should be found", 2, mgr.getHostCount());
132
133 // host update
134 detect(HID1, MAC1, VLAN1, LOC2, IPSET2);
135 validateEvents(HOST_UPDATED);
136 assertEquals("only two hosts should be found", 2, mgr.getHostCount());
137 }
138
139 @Test
140 public void hostVanished() {
141 detect(HID1, MAC1, VLAN1, LOC1, IPSET1);
142 providerService.hostVanished(HID1);
143 validateEvents(HOST_ADDED, HOST_REMOVED);
144
145 assertNull("host should have been removed", mgr.getHost(HID1));
146 }
147
148 private void validateHosts(
149 String msg, Iterable<Host> hosts, HostId ... ids) {
150 Set<HostId> hids = Sets.newHashSet(ids);
151 for (Host h : hosts) {
152 assertTrue(msg, hids.remove(h.id()));
153 }
154 assertTrue("expected hosts not fetched from store", hids.isEmpty());
155 }
156
157 @Test
158 public void getHosts() {
159 detect(HID1, MAC1, VLAN1, LOC1, IPSET1);
160 detect(HID2, MAC2, VLAN1, LOC2, IPSET2);
161
162 validateHosts("host not properly stored", mgr.getHosts(), HID1, HID2);
163 validateHosts("can't get hosts by VLAN", mgr.getHostsByVlan(VLAN1), HID1, HID2);
164 validateHosts("can't get hosts by MAC", mgr.getHostsByMac(MAC1), HID1);
165 validateHosts("can't get hosts by IP", mgr.getHostsByIp(IP1), HID1);
166 validateHosts("can't get hosts by location", mgr.getConnectedHosts(LOC1), HID1);
167 assertTrue("incorrect host location", mgr.getConnectedHosts(DID2).isEmpty());
168 }
169
170 private static class TestHostProvider extends AbstractProvider
171 implements HostProvider {
172
173 protected TestHostProvider() {
174 super(PID);
175 }
176
177 @Override
178 public ProviderId id() {
179 return PID;
180 }
181
182 @Override
183 public void triggerProbe(Host host) {
184 }
185
186 }
187
188 private static class TestListener implements HostListener {
189
190 protected List<HostEvent> events = Lists.newArrayList();
191
192 @Override
193 public void event(HostEvent event) {
194 events.add(event);
195 }
196
197 }
198}