blob: c22f9851395fe6970294687aab29cd4923d68506 [file] [log] [blame]
tomca90c462014-09-22 11:40:58 -07001package org.onlab.onos.net.topology.impl;
2
3import org.junit.After;
4import org.junit.Before;
5import org.junit.Test;
6import org.onlab.onos.net.DeviceId;
7import org.onlab.onos.net.ElementId;
8import org.onlab.onos.net.Host;
9import org.onlab.onos.net.HostId;
10import org.onlab.onos.net.Path;
11import org.onlab.onos.net.host.HostService;
12import org.onlab.onos.net.host.HostServiceAdapter;
13import org.onlab.onos.net.provider.ProviderId;
14import org.onlab.onos.net.topology.LinkWeight;
15import org.onlab.onos.net.topology.PathService;
16import org.onlab.onos.net.topology.Topology;
17import org.onlab.onos.net.topology.TopologyService;
18import org.onlab.onos.net.topology.TopologyServiceAdapter;
19
20import java.util.HashMap;
21import java.util.HashSet;
22import java.util.Map;
23import java.util.Set;
24
25import static org.junit.Assert.assertEquals;
26import static org.junit.Assert.assertTrue;
27import static org.onlab.onos.net.NetTestTools.*;
28
29/**
30 * Test of the path selection subsystem.
31 */
32public class PathManagerTest {
33
34 private static final ProviderId PID = new ProviderId("of", "foo");
35
36 private PathManager mgr;
37 private PathService service;
38
39 private FakeTopoMgr fakeTopoMgr = new FakeTopoMgr();
40 private FakeHostMgr fakeHostMgr = new FakeHostMgr();
41
42 @Before
43 public void setUp() {
44 mgr = new PathManager();
45 service = mgr;
46 mgr.topologyService = fakeTopoMgr;
47 mgr.hostService = fakeHostMgr;
48 mgr.activate();
49 }
50
51 @After
52 public void tearDown() {
53 mgr.deactivate();
54 }
55
56 @Test
57 public void infraToInfra() {
58 DeviceId src = did("src");
59 DeviceId dst = did("dst");
60 fakeTopoMgr.paths.add(createPath("src", "middle", "dst"));
61 Set<Path> paths = service.getPaths(src, dst);
62 validatePaths(paths, 1, 2, src, dst);
63 }
64
65 @Test
66 public void infraToEdge() {
67 DeviceId src = did("src");
tom545708e2014-10-09 17:10:02 -070068 HostId dst = hid("12:34:56:78:90:ab/1");
tomca90c462014-09-22 11:40:58 -070069 fakeTopoMgr.paths.add(createPath("src", "middle", "edge"));
tom545708e2014-10-09 17:10:02 -070070 fakeHostMgr.hosts.put(dst, host("12:34:56:78:90:ab/1", "edge"));
tomca90c462014-09-22 11:40:58 -070071 Set<Path> paths = service.getPaths(src, dst);
72 validatePaths(paths, 1, 3, src, dst);
73 }
74
75 @Test
76 public void edgeToInfra() {
tom545708e2014-10-09 17:10:02 -070077 HostId src = hid("12:34:56:78:90:ab/1");
tomca90c462014-09-22 11:40:58 -070078 DeviceId dst = did("dst");
79 fakeTopoMgr.paths.add(createPath("edge", "middle", "dst"));
tom545708e2014-10-09 17:10:02 -070080 fakeHostMgr.hosts.put(src, host("12:34:56:78:90:ab/1", "edge"));
tomca90c462014-09-22 11:40:58 -070081 Set<Path> paths = service.getPaths(src, dst);
82 validatePaths(paths, 1, 3, src, dst);
83 }
84
85 @Test
86 public void edgeToEdge() {
tom545708e2014-10-09 17:10:02 -070087 HostId src = hid("12:34:56:78:90:ab/1");
88 HostId dst = hid("12:34:56:78:90:ef/1");
tomca90c462014-09-22 11:40:58 -070089 fakeTopoMgr.paths.add(createPath("srcEdge", "middle", "dstEdge"));
tom545708e2014-10-09 17:10:02 -070090 fakeHostMgr.hosts.put(src, host("12:34:56:78:90:ab/1", "srcEdge"));
91 fakeHostMgr.hosts.put(dst, host("12:34:56:78:90:ef/1", "dstEdge"));
tomca90c462014-09-22 11:40:58 -070092 Set<Path> paths = service.getPaths(src, dst);
93 validatePaths(paths, 1, 4, src, dst);
94 }
95
96 @Test
97 public void edgeToEdgeDirect() {
tom545708e2014-10-09 17:10:02 -070098 HostId src = hid("12:34:56:78:90:ab/1");
99 HostId dst = hid("12:34:56:78:90:ef/1");
100 fakeHostMgr.hosts.put(src, host("12:34:56:78:90:ab/1", "edge"));
101 fakeHostMgr.hosts.put(dst, host("12:34:56:78:90:ef/1", "edge"));
tomca90c462014-09-22 11:40:58 -0700102 Set<Path> paths = service.getPaths(src, dst);
103 validatePaths(paths, 1, 2, src, dst);
104 }
105
106 @Test
107 public void noEdge() {
tom545708e2014-10-09 17:10:02 -0700108 Set<Path> paths = service.getPaths(hid("12:34:56:78:90:ab/1"),
109 hid("12:34:56:78:90:ef/1"));
tomca90c462014-09-22 11:40:58 -0700110 assertTrue("there should be no paths", paths.isEmpty());
111 }
112
113 // Makes sure the set of paths meets basic expectations.
114 private void validatePaths(Set<Path> paths, int count, int length,
115 ElementId src, ElementId dst) {
116 assertEquals("incorrect path count", count, paths.size());
117 for (Path path : paths) {
118 assertEquals("incorrect length", length, path.links().size());
119 assertEquals("incorrect source", src, path.src().elementId());
120 assertEquals("incorrect destination", dst, path.dst().elementId());
121 }
122 }
123
124 // Fake entity to give out paths.
125 private class FakeTopoMgr extends TopologyServiceAdapter implements TopologyService {
126 Set<Path> paths = new HashSet<>();
127
128 @Override
129 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
130 return paths;
131 }
132
133 @Override
134 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
135 return paths;
136 }
137 }
138
139 // Fake entity to give out hosts.
140 private class FakeHostMgr extends HostServiceAdapter implements HostService {
141 private Map<HostId, Host> hosts = new HashMap<>();
142
143 @Override
144 public Host getHost(HostId hostId) {
145 return hosts.get(hostId);
146 }
147 }
148
149}