blob: 2ecf7f59a17a41cf63cb44362e8fe2a73702c7d4 [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");
68 HostId dst = hid("dst");
69 fakeTopoMgr.paths.add(createPath("src", "middle", "edge"));
70 fakeHostMgr.hosts.put(dst, host("dst", "edge"));
71 Set<Path> paths = service.getPaths(src, dst);
72 validatePaths(paths, 1, 3, src, dst);
73 }
74
75 @Test
76 public void edgeToInfra() {
77 HostId src = hid("src");
78 DeviceId dst = did("dst");
79 fakeTopoMgr.paths.add(createPath("edge", "middle", "dst"));
80 fakeHostMgr.hosts.put(src, host("src", "edge"));
81 Set<Path> paths = service.getPaths(src, dst);
82 validatePaths(paths, 1, 3, src, dst);
83 }
84
85 @Test
86 public void edgeToEdge() {
87 HostId src = hid("src");
88 HostId dst = hid("dst");
89 fakeTopoMgr.paths.add(createPath("srcEdge", "middle", "dstEdge"));
90 fakeHostMgr.hosts.put(src, host("src", "srcEdge"));
91 fakeHostMgr.hosts.put(dst, host("dst", "dstEdge"));
92 Set<Path> paths = service.getPaths(src, dst);
93 validatePaths(paths, 1, 4, src, dst);
94 }
95
96 @Test
97 public void edgeToEdgeDirect() {
98 HostId src = hid("src");
99 HostId dst = hid("dst");
100 fakeHostMgr.hosts.put(src, host("src", "edge"));
101 fakeHostMgr.hosts.put(dst, host("dst", "edge"));
102 Set<Path> paths = service.getPaths(src, dst);
103 validatePaths(paths, 1, 2, src, dst);
104 }
105
106 @Test
107 public void noEdge() {
108 Set<Path> paths = service.getPaths(hid("src"), hid("dst"));
109 assertTrue("there should be no paths", paths.isEmpty());
110 }
111
112 // Makes sure the set of paths meets basic expectations.
113 private void validatePaths(Set<Path> paths, int count, int length,
114 ElementId src, ElementId dst) {
115 assertEquals("incorrect path count", count, paths.size());
116 for (Path path : paths) {
117 assertEquals("incorrect length", length, path.links().size());
118 assertEquals("incorrect source", src, path.src().elementId());
119 assertEquals("incorrect destination", dst, path.dst().elementId());
120 }
121 }
122
123 // Fake entity to give out paths.
124 private class FakeTopoMgr extends TopologyServiceAdapter implements TopologyService {
125 Set<Path> paths = new HashSet<>();
126
127 @Override
128 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
129 return paths;
130 }
131
132 @Override
133 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
134 return paths;
135 }
136 }
137
138 // Fake entity to give out hosts.
139 private class FakeHostMgr extends HostServiceAdapter implements HostService {
140 private Map<HostId, Host> hosts = new HashMap<>();
141
142 @Override
143 public Host getHost(HostId hostId) {
144 return hosts.get(hostId);
145 }
146 }
147
148}