Simon Hunt

Added host-related unit tests for model cache.

Change-Id: Iac27f62daed2c8e9114ce924c3014f35eb0ae5ce
...@@ -106,12 +106,30 @@ public class UiHost extends UiNode { ...@@ -106,12 +106,30 @@ public class UiHost extends UiNode {
106 } 106 }
107 107
108 /** 108 /**
109 - * Identifier for the edge link between this host and the device to which 109 + * Returns the identifier for the edge link between this host and
110 - * it is connected. 110 + * the device to which it is connected.
111 * 111 *
112 * @return edge link identifier 112 * @return edge link identifier
113 */ 113 */
114 public UiLinkId edgeLinkId() { 114 public UiLinkId edgeLinkId() {
115 - return null; 115 + return edgeLinkId;
116 + }
117 +
118 + /**
119 + * Returns the identifier of the device to which the host is connected.
120 + *
121 + * @return device identifier
122 + */
123 + public DeviceId locationDevice() {
124 + return locDevice;
125 + }
126 +
127 + /**
128 + * Returns the port number of the device to which the host is connected.
129 + *
130 + * @return port number
131 + */
132 + public PortNumber locationPort() {
133 + return locPort;
116 } 134 }
117 } 135 }
......
...@@ -525,47 +525,58 @@ abstract class AbstractTopoModelTest extends AbstractUiImplTest { ...@@ -525,47 +525,58 @@ abstract class AbstractTopoModelTest extends AbstractUiImplTest {
525 } 525 }
526 526
527 527
528 - private static class MockHostService extends HostServiceAdapter { 528 + /**
529 - private final Map<HostId, Host> hosts = new HashMap<>(); 529 + * Creates a default host connected at the given edge device and port. Note
530 - 530 + * that an identifying hex character ("a" - "f") should be supplied. This
531 - MockHostService() { 531 + * will be included in the MAC address of the host (and equivalent value
532 - for (Device d : ALL_DEVS) { 532 + * as last byte in IP address).
533 - // two hosts per device 533 + *
534 - createHosts(hosts, d); 534 + * @param device edge device
535 - } 535 + * @param port port number
536 - } 536 + * @param hexChar identifying hex character
537 - 537 + * @return host connected at that location
538 - private void createHosts(Map<HostId, Host> hosts, Device d) { 538 + */
539 - DeviceId deviceId = d.id(); 539 + protected static Host createHost(Device device, int port, String hexChar) {
540 - String devNum = deviceId.toString().substring(1); 540 + DeviceId deviceId = device.id();
541 - 541 + String devNum = deviceId.toString().substring(1);
542 - String ha = devNum + "a";
543 - String hb = devNum + "b";
544 542
545 - MacAddress macA = MacAddress.valueOf(HOST_MAC_PREFIX + ha); 543 + MacAddress mac = MacAddress.valueOf(HOST_MAC_PREFIX + devNum + hexChar);
546 - MacAddress macB = MacAddress.valueOf(HOST_MAC_PREFIX + hb); 544 + HostId hostId = hostId(String.format("%s/-1", mac));
547 545
548 - HostId hostA = hostId(String.format("%s/-1", macA)); 546 + int ipByte = Integer.valueOf(hexChar, 16);
549 - HostId hostB = hostId(String.format("%s/-1", macB)); 547 + if (ipByte < 10 || ipByte > 15) {
548 + throw new IllegalArgumentException("hexChar must be a-f");
549 + }
550 + HostLocation loc = new HostLocation(deviceId, portNumber(port), 0);
550 551
551 - PortNumber portA = portNumber(101); 552 + IpAddress ip = ip("10." + devNum + ".0." + ipByte);
552 - PortNumber portB = portNumber(102);
553 553
554 - HostLocation locA = new HostLocation(deviceId, portA, 0); 554 + return new DefaultHost(ProviderId.NONE, hostId, mac, VlanId.NONE,
555 - HostLocation locB = new HostLocation(deviceId, portB, 0); 555 + loc, ImmutableSet.of(ip));
556 + }
556 557
557 - IpAddress ipA = ip("10." + devNum + ".0.1"); 558 + /**
558 - IpAddress ipB = ip("10." + devNum + ".0.2"); 559 + * Creates a pair of hosts connected to the specified device.
560 + *
561 + * @param d edge device
562 + * @return pair of hosts
563 + */
564 + protected static List<Host> createHostPair(Device d) {
565 + List<Host> hosts = new ArrayList<>();
566 + hosts.add(createHost(d, 101, "a"));
567 + hosts.add(createHost(d, 102, "b"));
568 + return hosts;
569 + }
559 570
560 - Host host = new DefaultHost(ProviderId.NONE, 571 + private static class MockHostService extends HostServiceAdapter {
561 - hostA, macA, VlanId.NONE, locA, 572 + private final Map<HostId, Host> hosts = new HashMap<>();
562 - ImmutableSet.of(ipA));
563 - hosts.put(hostA, host);
564 573
565 - host = new DefaultHost(ProviderId.NONE, 574 + MockHostService() {
566 - hostB, macB, VlanId.NONE, locB, 575 + for (Device d : ALL_DEVS) {
567 - ImmutableSet.of(ipB)); 576 + for (Host h : createHostPair(d)) {
568 - hosts.put(hostB, host); 577 + hosts.put(h.id(), h);
578 + }
579 + }
569 } 580 }
570 581
571 @Override 582 @Override
......
...@@ -22,12 +22,15 @@ import org.onosproject.event.Event; ...@@ -22,12 +22,15 @@ import org.onosproject.event.Event;
22 import org.onosproject.event.EventDispatcher; 22 import org.onosproject.event.EventDispatcher;
23 import org.onosproject.net.Device; 23 import org.onosproject.net.Device;
24 import org.onosproject.net.DeviceId; 24 import org.onosproject.net.DeviceId;
25 +import org.onosproject.net.Host;
26 +import org.onosproject.net.HostId;
25 import org.onosproject.net.Link; 27 import org.onosproject.net.Link;
26 import org.onosproject.net.region.Region; 28 import org.onosproject.net.region.Region;
27 import org.onosproject.ui.impl.topo.model.UiModelEvent.Type; 29 import org.onosproject.ui.impl.topo.model.UiModelEvent.Type;
28 import org.onosproject.ui.model.topo.UiClusterMember; 30 import org.onosproject.ui.model.topo.UiClusterMember;
29 import org.onosproject.ui.model.topo.UiDevice; 31 import org.onosproject.ui.model.topo.UiDevice;
30 import org.onosproject.ui.model.topo.UiElement; 32 import org.onosproject.ui.model.topo.UiElement;
33 +import org.onosproject.ui.model.topo.UiHost;
31 import org.onosproject.ui.model.topo.UiLink; 34 import org.onosproject.ui.model.topo.UiLink;
32 import org.onosproject.ui.model.topo.UiLinkId; 35 import org.onosproject.ui.model.topo.UiLinkId;
33 import org.onosproject.ui.model.topo.UiRegion; 36 import org.onosproject.ui.model.topo.UiRegion;
...@@ -38,8 +41,10 @@ import java.util.Iterator; ...@@ -38,8 +41,10 @@ import java.util.Iterator;
38 import static org.junit.Assert.assertEquals; 41 import static org.junit.Assert.assertEquals;
39 import static org.junit.Assert.assertFalse; 42 import static org.junit.Assert.assertFalse;
40 import static org.junit.Assert.assertNotNull; 43 import static org.junit.Assert.assertNotNull;
44 +import static org.junit.Assert.assertNull;
41 import static org.junit.Assert.assertTrue; 45 import static org.junit.Assert.assertTrue;
42 import static org.onosproject.cluster.NodeId.nodeId; 46 import static org.onosproject.cluster.NodeId.nodeId;
47 +import static org.onosproject.net.PortNumber.portNumber;
43 import static org.onosproject.ui.model.topo.UiLinkId.uiLinkId; 48 import static org.onosproject.ui.model.topo.UiLinkId.uiLinkId;
44 49
45 /** 50 /**
...@@ -305,6 +310,88 @@ public class ModelCacheTest extends AbstractTopoModelTest { ...@@ -305,6 +310,88 @@ public class ModelCacheTest extends AbstractTopoModelTest {
305 assertEquals("unex # links", 0, cache.linkCount()); 310 assertEquals("unex # links", 0, cache.linkCount());
306 } 311 }
307 312
313 + private void assertHostLinkCounts(int nHosts, int nLinks) {
314 + assertEquals("unex # hosts", nHosts, cache.hostCount());
315 + assertEquals("unex # links", nLinks, cache.linkCount());
316 + }
317 +
318 + private void assertLocation(HostId hid, DeviceId expDev, int expPort) {
319 + UiHost h = cache.accessHost(hid);
320 + assertEquals("unex device", expDev, h.locationDevice());
321 + assertEquals("unex port", portNumber(expPort), h.locationPort());
322 + }
323 +
324 + @Test
325 + public void addHosts() {
326 + title("addHosts");
327 +
328 + assertHostLinkCounts(0, 0);
329 + Host hostA = createHost(DEV_1, 101, "a");
330 + Host hostB = createHost(DEV_1, 102, "b");
331 +
332 + // add a host
333 + cache.addOrUpdateHost(hostA);
334 + dispatcher.assertLast(Type.HOST_ADDED_OR_UPDATED, hostA.id().toString());
335 + dispatcher.assertEventCount(1);
336 + assertHostLinkCounts(1, 1);
337 + assertLocation(hostA.id(), DEVID_1, 101);
338 +
339 + // add a second host
340 + cache.addOrUpdateHost(hostB);
341 + dispatcher.assertLast(Type.HOST_ADDED_OR_UPDATED, hostB.id().toString());
342 + dispatcher.assertEventCount(2);
343 + assertHostLinkCounts(2, 2);
344 + assertLocation(hostB.id(), DEVID_1, 102);
345 +
346 + // update the first host
347 + cache.addOrUpdateHost(hostA);
348 + dispatcher.assertLast(Type.HOST_ADDED_OR_UPDATED, hostA.id().toString());
349 + dispatcher.assertEventCount(3);
350 + assertHostLinkCounts(2, 2);
351 + assertLocation(hostA.id(), DEVID_1, 101);
352 +
353 + print(cache.dumpString());
354 +
355 + // remove the second host
356 + cache.removeHost(hostB);
357 + dispatcher.assertLast(Type.HOST_REMOVED, hostB.id().toString());
358 + dispatcher.assertEventCount(4);
359 + assertHostLinkCounts(1, 1);
360 + assertNull("still host B?", cache.accessHost(hostB.id()));
361 +
362 + print(cache.dumpString());
363 +
364 + // first, verify where host A is currently residing
365 + assertLocation(hostA.id(), DEVID_1, 101);
366 +
367 + // now let's move hostA to a different port
368 + Host movedHost = createHost(DEV_1, 200, "a");
369 + print(hostA);
370 + print(movedHost);
371 +
372 + cache.moveHost(movedHost, hostA);
373 + dispatcher.assertLast(Type.HOST_MOVED, hostA.id().toString());
374 + dispatcher.assertEventCount(5);
375 + assertHostLinkCounts(1, 1);
376 +
377 + assertLocation(hostA.id(), DEVID_1, 200);
378 +
379 + print(cache.dumpString());
380 +
381 + // finally, let's move the host to a different device and port
382 + Host movedAgain = createHost(DEV_8, 800, "a");
383 +
384 + cache.moveHost(movedAgain, movedHost);
385 + dispatcher.assertLast(Type.HOST_MOVED, hostA.id().toString());
386 + dispatcher.assertEventCount(6);
387 + assertHostLinkCounts(1, 1);
388 +
389 + assertLocation(hostA.id(), DEVID_8, 800);
390 +
391 + print(cache.dumpString());
392 + }
393 +
394 +
308 @Test 395 @Test
309 public void load() { 396 public void load() {
310 title("load"); 397 title("load");
......