blob: 98b014cc1bb40b938bcea6f573f4b44d2f606da5 [file] [log] [blame]
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -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 */
16
17package org.onlab.graph;
18
19import org.junit.Test;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070020
21import java.util.HashMap;
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070022import java.util.HashSet;
23import java.util.Map;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070024import java.util.Set;
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070025
26import static com.google.common.collect.ImmutableSet.of;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070027import static org.junit.Assert.assertEquals;
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070028import static org.junit.Assert.assertTrue;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070029import static org.onlab.graph.GraphPathSearch.ALL_PATHS;
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070030
31/**
32 * Test of the Suurballe backup path algorithm.
33 */
Jonathan Hartd9df7bd2015-11-10 17:10:25 -080034public class SrlgGraphSearchTest extends BreadthFirstSearchTest {
Thomas Vachuska48e64e42015-09-22 15:32:55 -070035
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070036 @Override
37 protected AbstractGraphPathSearch<TestVertex, TestEdge> graphSearch() {
Jonathan Hartd9df7bd2015-11-10 17:10:25 -080038 return new SrlgGraphSearch<>(null);
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070039 }
40
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070041 public void setDefaultWeights() {
42 weight = null;
43 }
Thomas Vachuska48e64e42015-09-22 15:32:55 -070044
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070045 @Override
46 public void defaultGraphTest() {
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070047 }
48
49 @Override
50 public void defaultHopCountWeight() {
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070051 }
52
53 @Test
54 public void onePathPair() {
55 setDefaultWeights();
56 TestEdge aB = new TestEdge(A, B, 1);
57 TestEdge bC = new TestEdge(B, C, 1);
58 TestEdge aD = new TestEdge(A, D, 1);
59 TestEdge dC = new TestEdge(D, C, 1);
60 Graph<TestVertex, TestEdge> graph = new AdjacencyListsGraph<>(of(A, B, C, D),
61 of(aB, bC, aD, dC));
Thomas Vachuska48e64e42015-09-22 15:32:55 -070062 Map<TestEdge, Integer> riskProfile = new HashMap<>();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070063 riskProfile.put(aB, 0);
64 riskProfile.put(bC, 0);
65 riskProfile.put(aD, 1);
66 riskProfile.put(dC, 1);
Jonathan Hartd9df7bd2015-11-10 17:10:25 -080067 SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(2, riskProfile);
Thomas Vachuska48e64e42015-09-22 15:32:55 -070068 Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, C, weight, ALL_PATHS).paths();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070069 System.out.println("\n\n\n" + paths + "\n\n\n");
Thomas Vachuska48e64e42015-09-22 15:32:55 -070070 assertEquals("one disjoint path pair found", 1, paths.size());
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070071 checkIsDisjoint(paths.iterator().next(), riskProfile);
72 }
Thomas Vachuska48e64e42015-09-22 15:32:55 -070073
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070074 public void checkIsDisjoint(Path<TestVertex, TestEdge> p, Map<TestEdge, Integer> risks) {
75 assertTrue("The path is not a DisjointPathPair", (p instanceof DisjointPathPair));
76 DisjointPathPair<TestVertex, TestEdge> q = (DisjointPathPair) p;
Thomas Vachuska48e64e42015-09-22 15:32:55 -070077 Set<Integer> p1Risks = new HashSet<>();
78 for (TestEdge e : q.edges()) {
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070079 p1Risks.add(risks.get(e));
80 }
81 if (!q.hasBackup()) {
82 return;
83 }
Thomas Vachuska48e64e42015-09-22 15:32:55 -070084 Path<TestVertex, TestEdge> pq = q.secondary();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070085 for (TestEdge e: pq.edges()) {
86 assertTrue("The paths are not disjoint", !p1Risks.contains(risks.get(e)));
87 }
88 }
Thomas Vachuska48e64e42015-09-22 15:32:55 -070089
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -070090 @Test
91 public void complexGraphTest() {
92 setDefaultWeights();
93 TestEdge aB = new TestEdge(A, B, 1);
94 TestEdge bC = new TestEdge(B, C, 1);
95 TestEdge aD = new TestEdge(A, D, 1);
96 TestEdge dC = new TestEdge(D, C, 1);
97 TestEdge cE = new TestEdge(C, E, 1);
98 TestEdge bE = new TestEdge(B, E, 1);
99 Graph<TestVertex, TestEdge> graph = new AdjacencyListsGraph<>(of(A, B, C, D, E),
100 of(aB, bC, aD, dC, cE, bE));
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700101 Map<TestEdge, Integer> riskProfile = new HashMap<>();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700102 riskProfile.put(aB, 0);
103 riskProfile.put(bC, 0);
104 riskProfile.put(aD, 1);
105 riskProfile.put(dC, 1);
106 riskProfile.put(cE, 2);
107 riskProfile.put(bE, 3);
Jonathan Hartd9df7bd2015-11-10 17:10:25 -0800108 SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(4, riskProfile);
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700109 search.search(graph, A, E, weight, ALL_PATHS).paths();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700110 }
111
112 @Test
113 public void multiplePathGraphTest() {
114 setDefaultWeights();
115 TestEdge aB = new TestEdge(A, B, 1);
116 TestEdge bE = new TestEdge(B, E, 1);
117 TestEdge aD = new TestEdge(A, D, 1);
118 TestEdge dE = new TestEdge(D, E, 1);
119 TestEdge aC = new TestEdge(A, C, 1);
120 TestEdge cE = new TestEdge(C, E, 1);
121 Graph<TestVertex, TestEdge> graph = new AdjacencyListsGraph<>(of(A, B, C, D, E),
122 of(aB, bE, aD, dE, aC, cE));
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700123 Map<TestEdge, Integer> riskProfile = new HashMap<>();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700124 riskProfile.put(aB, 0);
125 riskProfile.put(bE, 1);
126 riskProfile.put(aD, 2);
127 riskProfile.put(dE, 3);
128 riskProfile.put(aC, 4);
129 riskProfile.put(cE, 5);
Jonathan Hartd9df7bd2015-11-10 17:10:25 -0800130 SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(6, riskProfile);
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700131 Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, E, weight, ALL_PATHS).paths();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700132 assertTrue("> one disjoint path pair found", paths.size() >= 1);
133 checkIsDisjoint(paths.iterator().next(), riskProfile);
134 }
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700135
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700136 @Test
137 public void onePath() {
138 setDefaultWeights();
139 TestEdge aB = new TestEdge(A, B, 1);
140 TestEdge bC = new TestEdge(B, C, 1);
141 TestEdge aD = new TestEdge(A, D, 1);
142 TestEdge dC = new TestEdge(D, C, 1);
143 Graph<TestVertex, TestEdge> graph = new AdjacencyListsGraph<>(of(A, B, C, D),
144 of(aB, bC, aD, dC));
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700145 Map<TestEdge, Integer> riskProfile = new HashMap<>();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700146 riskProfile.put(aB, 0);
147 riskProfile.put(bC, 0);
148 riskProfile.put(aD, 1);
149 riskProfile.put(dC, 0);
Jonathan Hartd9df7bd2015-11-10 17:10:25 -0800150 SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(2, riskProfile);
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700151 Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, C, weight, ALL_PATHS).paths();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700152 System.out.println(paths);
153 assertTrue("no disjoint path pairs found", paths.size() == 0);
154 }
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700155
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700156 @Test
157 public void noPath() {
158 setDefaultWeights();
159 TestEdge aB = new TestEdge(A, B, 1);
160 TestEdge bC = new TestEdge(B, C, 1);
161 TestEdge aD = new TestEdge(A, D, 1);
162 TestEdge dC = new TestEdge(D, C, 1);
163 Graph<TestVertex, TestEdge> graph = new AdjacencyListsGraph<>(of(A, B, C, D, E),
164 of(aB, bC, aD, dC));
165 Map<TestEdge, Integer> riskProfile = new HashMap<>();
166 riskProfile.put(aB, 0);
167 riskProfile.put(bC, 0);
168 riskProfile.put(aD, 1);
169 riskProfile.put(dC, 0);
Jonathan Hartd9df7bd2015-11-10 17:10:25 -0800170 SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(2, riskProfile);
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700171 Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, E, weight, ALL_PATHS).paths();
Nikhil Cheerlaf7c2e1a2015-07-09 12:06:37 -0700172 assertTrue("no disjoint path pairs found", paths.size() == 0);
173 }
174}