blob: 18e640205ca6f3fd4b045a0108ffb8e536e49e0c [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.topology.impl;
tomca90c462014-09-22 11:40:58 -070017
18import org.junit.After;
19import org.junit.Before;
20import org.junit.Test;
Claudine Chiu45920dd2016-07-28 19:19:46 +000021import org.onlab.junit.TestUtils;
Brian O'Connorabafb502014-12-02 22:26:20 -080022import org.onosproject.net.DeviceId;
23import org.onosproject.net.ElementId;
24import org.onosproject.net.Host;
25import org.onosproject.net.HostId;
26import org.onosproject.net.Path;
Brian O'Connorabafb502014-12-02 22:26:20 -080027import org.onosproject.net.host.HostServiceAdapter;
28import org.onosproject.net.provider.ProviderId;
29import org.onosproject.net.topology.LinkWeight;
30import org.onosproject.net.topology.PathService;
31import org.onosproject.net.topology.Topology;
Brian O'Connorabafb502014-12-02 22:26:20 -080032import org.onosproject.net.topology.TopologyServiceAdapter;
tomca90c462014-09-22 11:40:58 -070033
34import java.util.HashMap;
35import java.util.HashSet;
36import java.util.Map;
37import java.util.Set;
38
39import static org.junit.Assert.assertEquals;
40import static org.junit.Assert.assertTrue;
Brian O'Connorabafb502014-12-02 22:26:20 -080041import static org.onosproject.net.NetTestTools.*;
tomca90c462014-09-22 11:40:58 -070042
43/**
44 * Test of the path selection subsystem.
45 */
46public class PathManagerTest {
47
48 private static final ProviderId PID = new ProviderId("of", "foo");
49
50 private PathManager mgr;
51 private PathService service;
52
53 private FakeTopoMgr fakeTopoMgr = new FakeTopoMgr();
54 private FakeHostMgr fakeHostMgr = new FakeHostMgr();
55
56 @Before
Claudine Chiu45920dd2016-07-28 19:19:46 +000057 public void setUp() throws Exception {
tomca90c462014-09-22 11:40:58 -070058 mgr = new PathManager();
59 service = mgr;
Claudine Chiu45920dd2016-07-28 19:19:46 +000060 TestUtils.setField(mgr, "topologyService", fakeTopoMgr);
61 TestUtils.setField(mgr, "hostService", fakeHostMgr);
tomca90c462014-09-22 11:40:58 -070062 mgr.activate();
63 }
64
65 @After
66 public void tearDown() {
67 mgr.deactivate();
68 }
69
70 @Test
71 public void infraToInfra() {
72 DeviceId src = did("src");
73 DeviceId dst = did("dst");
74 fakeTopoMgr.paths.add(createPath("src", "middle", "dst"));
75 Set<Path> paths = service.getPaths(src, dst);
76 validatePaths(paths, 1, 2, src, dst);
77 }
78
79 @Test
80 public void infraToEdge() {
81 DeviceId src = did("src");
tom545708e2014-10-09 17:10:02 -070082 HostId dst = hid("12:34:56:78:90:ab/1");
tomca90c462014-09-22 11:40:58 -070083 fakeTopoMgr.paths.add(createPath("src", "middle", "edge"));
tom545708e2014-10-09 17:10:02 -070084 fakeHostMgr.hosts.put(dst, host("12:34:56:78:90:ab/1", "edge"));
tomca90c462014-09-22 11:40:58 -070085 Set<Path> paths = service.getPaths(src, dst);
86 validatePaths(paths, 1, 3, src, dst);
87 }
88
89 @Test
90 public void edgeToInfra() {
tom545708e2014-10-09 17:10:02 -070091 HostId src = hid("12:34:56:78:90:ab/1");
tomca90c462014-09-22 11:40:58 -070092 DeviceId dst = did("dst");
93 fakeTopoMgr.paths.add(createPath("edge", "middle", "dst"));
tom545708e2014-10-09 17:10:02 -070094 fakeHostMgr.hosts.put(src, host("12:34:56:78:90:ab/1", "edge"));
tomca90c462014-09-22 11:40:58 -070095 Set<Path> paths = service.getPaths(src, dst);
96 validatePaths(paths, 1, 3, src, dst);
97 }
98
99 @Test
100 public void edgeToEdge() {
tom545708e2014-10-09 17:10:02 -0700101 HostId src = hid("12:34:56:78:90:ab/1");
102 HostId dst = hid("12:34:56:78:90:ef/1");
tomca90c462014-09-22 11:40:58 -0700103 fakeTopoMgr.paths.add(createPath("srcEdge", "middle", "dstEdge"));
tom545708e2014-10-09 17:10:02 -0700104 fakeHostMgr.hosts.put(src, host("12:34:56:78:90:ab/1", "srcEdge"));
105 fakeHostMgr.hosts.put(dst, host("12:34:56:78:90:ef/1", "dstEdge"));
tomca90c462014-09-22 11:40:58 -0700106 Set<Path> paths = service.getPaths(src, dst);
107 validatePaths(paths, 1, 4, src, dst);
108 }
109
110 @Test
111 public void edgeToEdgeDirect() {
tom545708e2014-10-09 17:10:02 -0700112 HostId src = hid("12:34:56:78:90:ab/1");
113 HostId dst = hid("12:34:56:78:90:ef/1");
114 fakeHostMgr.hosts.put(src, host("12:34:56:78:90:ab/1", "edge"));
115 fakeHostMgr.hosts.put(dst, host("12:34:56:78:90:ef/1", "edge"));
tomca90c462014-09-22 11:40:58 -0700116 Set<Path> paths = service.getPaths(src, dst);
117 validatePaths(paths, 1, 2, src, dst);
118 }
119
120 @Test
121 public void noEdge() {
tom545708e2014-10-09 17:10:02 -0700122 Set<Path> paths = service.getPaths(hid("12:34:56:78:90:ab/1"),
123 hid("12:34:56:78:90:ef/1"));
tomca90c462014-09-22 11:40:58 -0700124 assertTrue("there should be no paths", paths.isEmpty());
125 }
126
127 // Makes sure the set of paths meets basic expectations.
128 private void validatePaths(Set<Path> paths, int count, int length,
129 ElementId src, ElementId dst) {
130 assertEquals("incorrect path count", count, paths.size());
131 for (Path path : paths) {
132 assertEquals("incorrect length", length, path.links().size());
133 assertEquals("incorrect source", src, path.src().elementId());
134 assertEquals("incorrect destination", dst, path.dst().elementId());
135 }
136 }
137
138 // Fake entity to give out paths.
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700139 private class FakeTopoMgr extends TopologyServiceAdapter {
tomca90c462014-09-22 11:40:58 -0700140 Set<Path> paths = new HashSet<>();
141
142 @Override
143 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
144 return paths;
145 }
146
147 @Override
148 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
149 return paths;
150 }
tomca90c462014-09-22 11:40:58 -0700151 }
152
153 // Fake entity to give out hosts.
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700154 private class FakeHostMgr extends HostServiceAdapter {
tomca90c462014-09-22 11:40:58 -0700155 private Map<HostId, Host> hosts = new HashMap<>();
156
157 @Override
158 public Host getHost(HostId hostId) {
159 return hosts.get(hostId);
160 }
161 }
162
163}