Unit tests for some Intent objects and compilers
Unit tests for HostToHost and MultiPointToSinglePoint intents and intent compilers. Made Intent classes final to make them immutable.
Showing
13 changed files
with
933 additions
and
30 deletions
... | @@ -12,7 +12,7 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -12,7 +12,7 @@ import static com.google.common.base.Preconditions.checkNotNull; |
12 | /** | 12 | /** |
13 | * Abstraction of end-station to end-station bidirectional connectivity. | 13 | * Abstraction of end-station to end-station bidirectional connectivity. |
14 | */ | 14 | */ |
15 | -public class HostToHostIntent extends ConnectivityIntent { | 15 | +public final class HostToHostIntent extends ConnectivityIntent { |
16 | 16 | ||
17 | private final HostId one; | 17 | private final HostId one; |
18 | private final HostId two; | 18 | private final HostId two; | ... | ... |
... | @@ -14,7 +14,7 @@ import com.google.common.base.MoreObjects; | ... | @@ -14,7 +14,7 @@ import com.google.common.base.MoreObjects; |
14 | * Abstraction of a connectivity intent that is implemented by a set of path | 14 | * Abstraction of a connectivity intent that is implemented by a set of path |
15 | * segments. | 15 | * segments. |
16 | */ | 16 | */ |
17 | -public class LinkCollectionIntent extends ConnectivityIntent implements InstallableIntent { | 17 | +public final class LinkCollectionIntent extends ConnectivityIntent implements InstallableIntent { |
18 | 18 | ||
19 | private final Set<Link> links; | 19 | private final Set<Link> links; |
20 | 20 | ||
... | @@ -46,6 +46,12 @@ public class LinkCollectionIntent extends ConnectivityIntent implements Installa | ... | @@ -46,6 +46,12 @@ public class LinkCollectionIntent extends ConnectivityIntent implements Installa |
46 | return links; | 46 | return links; |
47 | } | 47 | } |
48 | 48 | ||
49 | + /** | ||
50 | + * Returns the set of links that represent the network connections needed | ||
51 | + * by this intent. | ||
52 | + * | ||
53 | + * @return Set of links for the network hops needed by this intent | ||
54 | + */ | ||
49 | public Set<Link> links() { | 55 | public Set<Link> links() { |
50 | return links; | 56 | return links; |
51 | } | 57 | } | ... | ... |
... | @@ -15,7 +15,7 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -15,7 +15,7 @@ import static com.google.common.base.Preconditions.checkNotNull; |
15 | /** | 15 | /** |
16 | * Abstraction of multiple source to single destination connectivity intent. | 16 | * Abstraction of multiple source to single destination connectivity intent. |
17 | */ | 17 | */ |
18 | -public class MultiPointToSinglePointIntent extends ConnectivityIntent { | 18 | +public final class MultiPointToSinglePointIntent extends ConnectivityIntent { |
19 | 19 | ||
20 | private final Set<ConnectPoint> ingressPoints; | 20 | private final Set<ConnectPoint> ingressPoints; |
21 | private final ConnectPoint egressPoint; | 21 | private final ConnectPoint egressPoint; | ... | ... |
... | @@ -47,10 +47,16 @@ public final class NetTestTools { | ... | @@ -47,10 +47,16 @@ public final class NetTestTools { |
47 | new HashSet<IpPrefix>()); | 47 | new HashSet<IpPrefix>()); |
48 | } | 48 | } |
49 | 49 | ||
50 | + // Short-hand for creating a connection point. | ||
51 | + public static ConnectPoint connectPoint(String id, int port) { | ||
52 | + return new ConnectPoint(did(id), portNumber(port)); | ||
53 | + } | ||
54 | + | ||
50 | // Short-hand for creating a link. | 55 | // Short-hand for creating a link. |
51 | public static Link link(String src, int sp, String dst, int dp) { | 56 | public static Link link(String src, int sp, String dst, int dp) { |
52 | - return new DefaultLink(PID, new ConnectPoint(did(src), portNumber(sp)), | 57 | + return new DefaultLink(PID, |
53 | - new ConnectPoint(did(dst), portNumber(dp)), | 58 | + connectPoint(src, sp), |
59 | + connectPoint(dst, dp), | ||
54 | Link.Type.DIRECT); | 60 | Link.Type.DIRECT); |
55 | } | 61 | } |
56 | 62 | ... | ... |
... | @@ -41,7 +41,7 @@ public class HostToHostIntentCompiler | ... | @@ -41,7 +41,7 @@ public class HostToHostIntentCompiler |
41 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 41 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
42 | protected HostService hostService; | 42 | protected HostService hostService; |
43 | 43 | ||
44 | - private IdGenerator<IntentId> intentIdGenerator; | 44 | + protected IdGenerator<IntentId> intentIdGenerator; |
45 | 45 | ||
46 | @Activate | 46 | @Activate |
47 | public void activate() { | 47 | public void activate() { | ... | ... |
... | @@ -37,7 +37,7 @@ public class MultiPointToSinglePointIntentCompiler | ... | @@ -37,7 +37,7 @@ public class MultiPointToSinglePointIntentCompiler |
37 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 37 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
38 | protected PathService pathService; | 38 | protected PathService pathService; |
39 | 39 | ||
40 | - private IdGenerator<IntentId> intentIdGenerator; | 40 | + protected IdGenerator<IntentId> intentIdGenerator; |
41 | 41 | ||
42 | @Activate | 42 | @Activate |
43 | public void activate() { | 43 | public void activate() { | ... | ... |
1 | +package org.onlab.onos.net.intent; | ||
2 | + | ||
3 | +import java.util.ArrayList; | ||
4 | +import java.util.Arrays; | ||
5 | +import java.util.Collections; | ||
6 | +import java.util.HashSet; | ||
7 | +import java.util.List; | ||
8 | +import java.util.Set; | ||
9 | + | ||
10 | +import org.onlab.onos.net.ElementId; | ||
11 | +import org.onlab.onos.net.Path; | ||
12 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
13 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
14 | +import org.onlab.onos.net.flow.criteria.Criterion; | ||
15 | +import org.onlab.onos.net.flow.instructions.Instruction; | ||
16 | +import org.onlab.onos.net.topology.LinkWeight; | ||
17 | +import org.onlab.onos.net.topology.PathService; | ||
18 | + | ||
19 | +import static org.onlab.onos.net.NetTestTools.createPath; | ||
20 | + | ||
21 | +/** | ||
22 | + * Common mocks used by the intent framework tests. | ||
23 | + */ | ||
24 | +public class IntentTestsMocks { | ||
25 | + /** | ||
26 | + * Mock traffic selector class used for satisfying API requirements. | ||
27 | + */ | ||
28 | + public static class MockSelector implements TrafficSelector { | ||
29 | + @Override | ||
30 | + public Set<Criterion> criteria() { | ||
31 | + return new HashSet<>(); | ||
32 | + } | ||
33 | + } | ||
34 | + | ||
35 | + /** | ||
36 | + * Mock traffic treatment class used for satisfying API requirements. | ||
37 | + */ | ||
38 | + public static class MockTreatment implements TrafficTreatment { | ||
39 | + @Override | ||
40 | + public List<Instruction> instructions() { | ||
41 | + return new ArrayList<>(); | ||
42 | + } | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * Mock path service for creating paths within the test. | ||
47 | + */ | ||
48 | + public static class MockPathService implements PathService { | ||
49 | + | ||
50 | + final String[] pathHops; | ||
51 | + final String[] reversePathHops; | ||
52 | + | ||
53 | + /** | ||
54 | + * Constructor that provides a set of hops to mock. | ||
55 | + * | ||
56 | + * @param pathHops path hops to mock | ||
57 | + */ | ||
58 | + public MockPathService(String[] pathHops) { | ||
59 | + this.pathHops = pathHops; | ||
60 | + String[] reversed = pathHops.clone(); | ||
61 | + Collections.reverse(Arrays.asList(reversed)); | ||
62 | + reversePathHops = reversed; | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public Set<Path> getPaths(ElementId src, ElementId dst) { | ||
67 | + Set<Path> result = new HashSet<>(); | ||
68 | + | ||
69 | + String[] allHops = new String[pathHops.length]; | ||
70 | + | ||
71 | + if (src.toString().endsWith(pathHops[0])) { | ||
72 | + System.arraycopy(pathHops, 0, allHops, 0, pathHops.length); | ||
73 | + } else { | ||
74 | + System.arraycopy(reversePathHops, 0, allHops, 0, pathHops.length); | ||
75 | + } | ||
76 | + | ||
77 | + result.add(createPath(allHops)); | ||
78 | + return result; | ||
79 | + } | ||
80 | + | ||
81 | + @Override | ||
82 | + public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) { | ||
83 | + return getPaths(src, dst); | ||
84 | + } | ||
85 | + } | ||
86 | +} |
core/net/src/test/java/org/onlab/onos/net/intent/LinksHaveEntryWithSourceDestinationPairMatcher.java
0 → 100644
1 | +package org.onlab.onos.net.intent; | ||
2 | + | ||
3 | +import java.util.Collection; | ||
4 | + | ||
5 | +import org.hamcrest.Description; | ||
6 | +import org.hamcrest.TypeSafeMatcher; | ||
7 | +import org.onlab.onos.net.Link; | ||
8 | + | ||
9 | +/** | ||
10 | + * Matcher to determine if a Collection of Links contains a path between a source | ||
11 | + * and a destination. | ||
12 | + */ | ||
13 | +public class LinksHaveEntryWithSourceDestinationPairMatcher extends | ||
14 | + TypeSafeMatcher<Collection<Link>> { | ||
15 | + private final String source; | ||
16 | + private final String destination; | ||
17 | + | ||
18 | + /** | ||
19 | + * Creates a matcher for a given path represented by a source and | ||
20 | + * a destination. | ||
21 | + * | ||
22 | + * @param source string identifier for the source of the path | ||
23 | + * @param destination string identifier for the destination of the path | ||
24 | + */ | ||
25 | + LinksHaveEntryWithSourceDestinationPairMatcher(String source, | ||
26 | + String destination) { | ||
27 | + this.source = source; | ||
28 | + this.destination = destination; | ||
29 | + } | ||
30 | + | ||
31 | + @Override | ||
32 | + public boolean matchesSafely(Collection<Link> links) { | ||
33 | + for (Link link : links) { | ||
34 | + if (link.src().elementId().toString().endsWith(source) && | ||
35 | + link.dst().elementId().toString().endsWith(destination)) { | ||
36 | + return true; | ||
37 | + } | ||
38 | + } | ||
39 | + | ||
40 | + return false; | ||
41 | + } | ||
42 | + | ||
43 | + @Override | ||
44 | + public void describeTo(Description description) { | ||
45 | + description.appendText("link lookup for source \""); | ||
46 | + description.appendText(source); | ||
47 | + description.appendText(" and destination "); | ||
48 | + description.appendText(destination); | ||
49 | + description.appendText("\""); | ||
50 | + } | ||
51 | + | ||
52 | + @Override | ||
53 | + public void describeMismatchSafely(Collection<Link> links, | ||
54 | + Description mismatchDescription) { | ||
55 | + mismatchDescription.appendText("was "). | ||
56 | + appendText(links.toString()); | ||
57 | + } | ||
58 | + | ||
59 | + /** | ||
60 | + * Creates a link has path matcher. | ||
61 | + * | ||
62 | + * @param source string identifier for the source of the path | ||
63 | + * @param destination string identifier for the destination of the path | ||
64 | + * @return matcher to match the path | ||
65 | + */ | ||
66 | + public static LinksHaveEntryWithSourceDestinationPairMatcher linksHasPath( | ||
67 | + String source, | ||
68 | + String destination) { | ||
69 | + return new LinksHaveEntryWithSourceDestinationPairMatcher(source, | ||
70 | + destination); | ||
71 | + } | ||
72 | +} | ||
73 | + |
1 | +package org.onlab.onos.net.intent; | ||
2 | + | ||
3 | +import org.junit.Test; | ||
4 | +import org.onlab.onos.net.HostId; | ||
5 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
6 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
7 | + | ||
8 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
9 | +import static org.hamcrest.Matchers.equalTo; | ||
10 | +import static org.hamcrest.Matchers.is; | ||
11 | +import static org.hamcrest.Matchers.not; | ||
12 | +import static org.onlab.onos.net.NetTestTools.hid; | ||
13 | + | ||
14 | +/** | ||
15 | + * Unit tests for the HostToHostIntent class. | ||
16 | + */ | ||
17 | +public class TestHostToHostIntent { | ||
18 | + | ||
19 | + private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | ||
20 | + private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | ||
21 | + | ||
22 | + private HostToHostIntent makeHostToHost(long id, HostId one, HostId two) { | ||
23 | + return new HostToHostIntent(new IntentId(id), | ||
24 | + one, | ||
25 | + two, | ||
26 | + selector, | ||
27 | + treatment); | ||
28 | + } | ||
29 | + | ||
30 | + /** | ||
31 | + * Tests the equals() method where two HostToHostIntents have references | ||
32 | + * to the same hosts. These should compare equal. | ||
33 | + */ | ||
34 | + @Test | ||
35 | + public void testSameEquals() { | ||
36 | + | ||
37 | + HostId one = hid("00:00:00:00:00:01/-1"); | ||
38 | + HostId two = hid("00:00:00:00:00:02/-1"); | ||
39 | + HostToHostIntent i1 = makeHostToHost(12, one, two); | ||
40 | + HostToHostIntent i2 = makeHostToHost(12, one, two); | ||
41 | + | ||
42 | + assertThat(i1, is(equalTo(i2))); | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * Tests the equals() method where two HostToHostIntents have references | ||
47 | + * to different Hosts. These should compare not equal. | ||
48 | + */ | ||
49 | + @Test | ||
50 | + public void testLinksDifferentEquals() { | ||
51 | + | ||
52 | + HostId one = hid("00:00:00:00:00:01/-1"); | ||
53 | + HostId two = hid("00:00:00:00:00:02/-1"); | ||
54 | + HostToHostIntent i1 = makeHostToHost(12, one, two); | ||
55 | + HostToHostIntent i2 = makeHostToHost(12, two, one); | ||
56 | + | ||
57 | + assertThat(i1, is(not(equalTo(i2)))); | ||
58 | + } | ||
59 | + | ||
60 | + /** | ||
61 | + * Tests the equals() method where two HostToHostIntents have different | ||
62 | + * ids. These should compare not equal. | ||
63 | + */ | ||
64 | + | ||
65 | + @Test | ||
66 | + public void testBaseDifferentEquals() { | ||
67 | + HostId one = hid("00:00:00:00:00:01/-1"); | ||
68 | + HostId two = hid("00:00:00:00:00:02/-1"); | ||
69 | + HostToHostIntent i1 = makeHostToHost(12, one, two); | ||
70 | + HostToHostIntent i2 = makeHostToHost(11, one, two); | ||
71 | + | ||
72 | + assertThat(i1, is(not(equalTo(i2)))); | ||
73 | + } | ||
74 | + | ||
75 | + /** | ||
76 | + * Tests that the hashCode() values for two equivalent HostToHostIntent | ||
77 | + * objects are the same. | ||
78 | + */ | ||
79 | + | ||
80 | + @Test | ||
81 | + public void testHashCodeEquals() { | ||
82 | + HostId one = hid("00:00:00:00:00:01/-1"); | ||
83 | + HostId two = hid("00:00:00:00:00:02/-1"); | ||
84 | + HostToHostIntent i1 = makeHostToHost(12, one, two); | ||
85 | + HostToHostIntent i2 = makeHostToHost(12, one, two); | ||
86 | + | ||
87 | + assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | ||
88 | + } | ||
89 | + | ||
90 | + /** | ||
91 | + * Tests that the hashCode() values for two distinct LinkCollectionIntent | ||
92 | + * objects are different. | ||
93 | + */ | ||
94 | + | ||
95 | + @Test | ||
96 | + public void testHashCodeDifferent() { | ||
97 | + HostId one = hid("00:00:00:00:00:01/-1"); | ||
98 | + HostId two = hid("00:00:00:00:00:02/-1"); | ||
99 | + HostToHostIntent i1 = makeHostToHost(12, one, two); | ||
100 | + HostToHostIntent i2 = makeHostToHost(112, one, two); | ||
101 | + | ||
102 | + assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | ||
103 | + } | ||
104 | + | ||
105 | + /** | ||
106 | + * Checks that the HostToHostIntent class is immutable. | ||
107 | + */ | ||
108 | + @Test | ||
109 | + public void checkImmutability() { | ||
110 | + ImmutableClassChecker.assertThatClassIsImmutable(HostToHostIntent.class); | ||
111 | + } | ||
112 | +} |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | -import java.util.ArrayList; | ||
4 | import java.util.HashSet; | 3 | import java.util.HashSet; |
5 | -import java.util.List; | ||
6 | import java.util.Set; | 4 | import java.util.Set; |
7 | 5 | ||
6 | +import org.junit.Before; | ||
8 | import org.junit.Test; | 7 | import org.junit.Test; |
9 | import org.onlab.onos.net.Link; | 8 | import org.onlab.onos.net.Link; |
10 | import org.onlab.onos.net.flow.TrafficSelector; | 9 | import org.onlab.onos.net.flow.TrafficSelector; |
11 | import org.onlab.onos.net.flow.TrafficTreatment; | 10 | import org.onlab.onos.net.flow.TrafficTreatment; |
12 | -import org.onlab.onos.net.flow.criteria.Criterion; | ||
13 | -import org.onlab.onos.net.flow.instructions.Instruction; | ||
14 | 11 | ||
12 | +import static org.hamcrest.CoreMatchers.not; | ||
15 | import static org.hamcrest.MatcherAssert.assertThat; | 13 | import static org.hamcrest.MatcherAssert.assertThat; |
14 | +import static org.hamcrest.Matchers.equalTo; | ||
16 | import static org.hamcrest.Matchers.is; | 15 | import static org.hamcrest.Matchers.is; |
16 | +import static org.onlab.onos.net.NetTestTools.link; | ||
17 | 17 | ||
18 | +/** | ||
19 | + * Unit tests for the LinkCollectionIntent class. | ||
20 | + */ | ||
18 | public class TestLinkCollectionIntent { | 21 | public class TestLinkCollectionIntent { |
19 | 22 | ||
20 | - private static class MockSelector implements TrafficSelector { | 23 | + private Link link1 = link("dev1", 1, "dev2", 2); |
21 | - @Override | 24 | + private Link link2 = link("dev1", 1, "dev3", 2); |
22 | - public Set<Criterion> criteria() { | 25 | + private Link link3 = link("dev2", 1, "dev3", 2); |
23 | - return new HashSet<Criterion>(); | 26 | + |
24 | - } | 27 | + private Set<Link> links1; |
28 | + private Set<Link> links2; | ||
29 | + | ||
30 | + private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | ||
31 | + private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | ||
32 | + | ||
33 | + private LinkCollectionIntent makeLinkCollection(long id, Set<Link> links) { | ||
34 | + return new LinkCollectionIntent(new IntentId(id), | ||
35 | + selector, treatment, links); | ||
36 | + } | ||
37 | + | ||
38 | + @Before | ||
39 | + public void setup() { | ||
40 | + links1 = new HashSet<>(); | ||
41 | + links2 = new HashSet<>(); | ||
25 | } | 42 | } |
26 | 43 | ||
27 | - private static class MockTreatment implements TrafficTreatment { | 44 | + /** |
28 | - @Override | 45 | + * Tests the equals() method where two LinkCollectionIntents have references |
29 | - public List<Instruction> instructions() { | 46 | + * to the same Links in different orders. These should compare equal. |
30 | - return new ArrayList<>(); | 47 | + */ |
31 | - } | 48 | + @Test |
49 | + public void testSameEquals() { | ||
50 | + links1.add(link1); | ||
51 | + links1.add(link2); | ||
52 | + links1.add(link3); | ||
53 | + | ||
54 | + links2.add(link3); | ||
55 | + links2.add(link2); | ||
56 | + links2.add(link1); | ||
57 | + | ||
58 | + LinkCollectionIntent i1 = makeLinkCollection(12, links1); | ||
59 | + LinkCollectionIntent i2 = makeLinkCollection(12, links2); | ||
60 | + | ||
61 | + assertThat(i1, is(equalTo(i2))); | ||
32 | } | 62 | } |
33 | 63 | ||
64 | + /** | ||
65 | + * Tests the equals() method where two LinkCollectionIntents have references | ||
66 | + * to different Links. These should compare not equal. | ||
67 | + */ | ||
34 | @Test | 68 | @Test |
35 | - public void testComparison() { | 69 | + public void testLinksDifferentEquals() { |
36 | - TrafficSelector selector = new MockSelector(); | 70 | + links1.add(link1); |
37 | - TrafficTreatment treatment = new MockTreatment(); | 71 | + links1.add(link2); |
38 | - Set<Link> links = new HashSet<>(); | 72 | + |
39 | - LinkCollectionIntent i1 = new LinkCollectionIntent(new IntentId(12), | 73 | + links2.add(link3); |
40 | - selector, treatment, links); | 74 | + links2.add(link1); |
41 | - LinkCollectionIntent i2 = new LinkCollectionIntent(new IntentId(12), | ||
42 | - selector, treatment, links); | ||
43 | 75 | ||
44 | - assertThat(i1.equals(i2), is(true)); | 76 | + LinkCollectionIntent i1 = makeLinkCollection(12, links1); |
77 | + LinkCollectionIntent i2 = makeLinkCollection(12, links2); | ||
78 | + | ||
79 | + assertThat(i1, is(not(equalTo(i2)))); | ||
45 | } | 80 | } |
46 | 81 | ||
82 | + /** | ||
83 | + * Tests the equals() method where two LinkCollectionIntents have different | ||
84 | + * ids. These should compare not equal. | ||
85 | + */ | ||
86 | + @Test | ||
87 | + public void testBaseDifferentEquals() { | ||
88 | + links1.add(link1); | ||
89 | + links1.add(link2); | ||
90 | + | ||
91 | + links2.add(link2); | ||
92 | + links2.add(link1); | ||
93 | + | ||
94 | + LinkCollectionIntent i1 = makeLinkCollection(1, links1); | ||
95 | + LinkCollectionIntent i2 = makeLinkCollection(2, links2); | ||
96 | + | ||
97 | + assertThat(i1, is(not(equalTo(i2)))); | ||
98 | + } | ||
99 | + | ||
100 | + /** | ||
101 | + * Tests that the hashCode() values for two equivalent LinkCollectionIntent | ||
102 | + * objects are the same. | ||
103 | + */ | ||
104 | + @Test | ||
105 | + public void testHashCodeEquals() { | ||
106 | + links1.add(link1); | ||
107 | + links1.add(link2); | ||
108 | + links1.add(link3); | ||
109 | + | ||
110 | + links2.add(link3); | ||
111 | + links2.add(link2); | ||
112 | + links2.add(link1); | ||
113 | + | ||
114 | + LinkCollectionIntent i1 = makeLinkCollection(1, links1); | ||
115 | + LinkCollectionIntent i2 = makeLinkCollection(1, links2); | ||
116 | + | ||
117 | + assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | ||
118 | + } | ||
119 | + | ||
120 | + /** | ||
121 | + * Tests that the hashCode() values for two distinct LinkCollectionIntent | ||
122 | + * objects are different. | ||
123 | + */ | ||
124 | + @Test | ||
125 | + public void testHashCodeDifferent() { | ||
126 | + links1.add(link1); | ||
127 | + links1.add(link2); | ||
128 | + | ||
129 | + links2.add(link1); | ||
130 | + links2.add(link3); | ||
131 | + | ||
132 | + LinkCollectionIntent i1 = makeLinkCollection(1, links1); | ||
133 | + LinkCollectionIntent i2 = makeLinkCollection(1, links2); | ||
134 | + | ||
135 | + assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | ||
136 | + } | ||
137 | + | ||
138 | + /** | ||
139 | + * Checks that the HostToHostIntent class is immutable. | ||
140 | + */ | ||
141 | + @Test | ||
142 | + public void checkImmutability() { | ||
143 | + ImmutableClassChecker.assertThatClassIsImmutable(LinkCollectionIntent.class); | ||
144 | + } | ||
47 | } | 145 | } | ... | ... |
1 | +package org.onlab.onos.net.intent; | ||
2 | + | ||
3 | +import java.util.HashSet; | ||
4 | +import java.util.Set; | ||
5 | + | ||
6 | +import org.junit.Before; | ||
7 | +import org.junit.Test; | ||
8 | +import org.onlab.onos.net.ConnectPoint; | ||
9 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
10 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
11 | + | ||
12 | +import static org.hamcrest.CoreMatchers.not; | ||
13 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
14 | +import static org.hamcrest.Matchers.equalTo; | ||
15 | +import static org.hamcrest.Matchers.is; | ||
16 | +import static org.onlab.onos.net.NetTestTools.connectPoint; | ||
17 | + | ||
18 | +/** | ||
19 | + * Unit tests for the MultiPointToSinglePointIntent class. | ||
20 | + */ | ||
21 | +public class TestMultiPointToSinglePointIntent { | ||
22 | + | ||
23 | + private ConnectPoint point1 = connectPoint("dev1", 1); | ||
24 | + private ConnectPoint point2 = connectPoint("dev2", 1); | ||
25 | + private ConnectPoint point3 = connectPoint("dev3", 1); | ||
26 | + | ||
27 | + private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | ||
28 | + private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | ||
29 | + | ||
30 | + Set<ConnectPoint> ingress1; | ||
31 | + Set<ConnectPoint> ingress2; | ||
32 | + | ||
33 | + /** | ||
34 | + * Creates a MultiPointToSinglePointIntent object. | ||
35 | + * | ||
36 | + * @param id identifier to use for the new intent | ||
37 | + * @param ingress set of ingress points | ||
38 | + * @param egress egress point | ||
39 | + * @return MultiPointToSinglePoint intent | ||
40 | + */ | ||
41 | + private MultiPointToSinglePointIntent makeIntent(long id, | ||
42 | + Set<ConnectPoint> ingress, | ||
43 | + ConnectPoint egress) { | ||
44 | + return new MultiPointToSinglePointIntent(new IntentId(id), | ||
45 | + selector, | ||
46 | + treatment, | ||
47 | + ingress, | ||
48 | + egress); | ||
49 | + } | ||
50 | + | ||
51 | + /** | ||
52 | + * Initializes the ingress sets. | ||
53 | + */ | ||
54 | + @Before | ||
55 | + public void setup() { | ||
56 | + ingress1 = new HashSet<>(); | ||
57 | + ingress2 = new HashSet<>(); | ||
58 | + } | ||
59 | + | ||
60 | + /** | ||
61 | + * Tests the equals() method where two MultiPointToSinglePoint have references | ||
62 | + * to the same Links in different orders. These should compare equal. | ||
63 | + */ | ||
64 | + @Test | ||
65 | + public void testSameEquals() { | ||
66 | + | ||
67 | + Set<ConnectPoint> ingress1 = new HashSet<>(); | ||
68 | + ingress1.add(point2); | ||
69 | + ingress1.add(point3); | ||
70 | + | ||
71 | + Set<ConnectPoint> ingress2 = new HashSet<>(); | ||
72 | + ingress2.add(point3); | ||
73 | + ingress2.add(point2); | ||
74 | + | ||
75 | + Intent i1 = makeIntent(12, ingress1, point1); | ||
76 | + Intent i2 = makeIntent(12, ingress2, point1); | ||
77 | + | ||
78 | + assertThat(i1, is(equalTo(i2))); | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * Tests the equals() method where two MultiPointToSinglePoint have references | ||
83 | + * to different Links. These should compare not equal. | ||
84 | + */ | ||
85 | + @Test | ||
86 | + public void testLinksDifferentEquals() { | ||
87 | + ingress1.add(point3); | ||
88 | + | ||
89 | + ingress2.add(point3); | ||
90 | + ingress2.add(point2); | ||
91 | + | ||
92 | + Intent i1 = makeIntent(12, ingress1, point1); | ||
93 | + Intent i2 = makeIntent(12, ingress2, point1); | ||
94 | + | ||
95 | + assertThat(i1, is(not(equalTo(i2)))); | ||
96 | + } | ||
97 | + | ||
98 | + /** | ||
99 | + * Tests the equals() method where two MultiPointToSinglePoint have different | ||
100 | + * ids. These should compare not equal. | ||
101 | + */ | ||
102 | + @Test | ||
103 | + public void testBaseDifferentEquals() { | ||
104 | + ingress1.add(point3); | ||
105 | + ingress2.add(point3); | ||
106 | + | ||
107 | + Intent i1 = makeIntent(12, ingress1, point1); | ||
108 | + Intent i2 = makeIntent(11, ingress2, point1); | ||
109 | + | ||
110 | + assertThat(i1, is(not(equalTo(i2)))); | ||
111 | + } | ||
112 | + | ||
113 | + /** | ||
114 | + * Tests that the hashCode() values for two equivalent MultiPointToSinglePoint | ||
115 | + * objects are the same. | ||
116 | + */ | ||
117 | + @Test | ||
118 | + public void testHashCodeEquals() { | ||
119 | + ingress1.add(point2); | ||
120 | + ingress1.add(point3); | ||
121 | + | ||
122 | + ingress2.add(point3); | ||
123 | + ingress2.add(point2); | ||
124 | + | ||
125 | + Intent i1 = makeIntent(12, ingress1, point1); | ||
126 | + Intent i2 = makeIntent(12, ingress2, point1); | ||
127 | + | ||
128 | + assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | ||
129 | + } | ||
130 | + | ||
131 | + /** | ||
132 | + * Tests that the hashCode() values for two distinct MultiPointToSinglePoint | ||
133 | + * objects are different. | ||
134 | + */ | ||
135 | + @Test | ||
136 | + public void testHashCodeDifferent() { | ||
137 | + ingress1.add(point2); | ||
138 | + | ||
139 | + ingress2.add(point3); | ||
140 | + ingress2.add(point2); | ||
141 | + | ||
142 | + Intent i1 = makeIntent(12, ingress1, point1); | ||
143 | + Intent i2 = makeIntent(12, ingress2, point1); | ||
144 | + | ||
145 | + | ||
146 | + assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | ||
147 | + } | ||
148 | + | ||
149 | + /** | ||
150 | + * Checks that the MultiPointToSinglePointIntent class is immutable. | ||
151 | + */ | ||
152 | + @Test | ||
153 | + public void checkImmutability() { | ||
154 | + ImmutableClassChecker. | ||
155 | + assertThatClassIsImmutable(MultiPointToSinglePointIntent.class); | ||
156 | + } | ||
157 | +} |
1 | +package org.onlab.onos.net.intent.impl; | ||
2 | + | ||
3 | +import java.util.List; | ||
4 | + | ||
5 | +import org.hamcrest.Matchers; | ||
6 | +import org.junit.Before; | ||
7 | +import org.junit.Test; | ||
8 | +import org.onlab.onos.net.Host; | ||
9 | +import org.onlab.onos.net.HostId; | ||
10 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
11 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
12 | +import org.onlab.onos.net.host.HostService; | ||
13 | +import org.onlab.onos.net.intent.HostToHostIntent; | ||
14 | +import org.onlab.onos.net.intent.Intent; | ||
15 | +import org.onlab.onos.net.intent.IntentId; | ||
16 | +import org.onlab.onos.net.intent.IntentTestsMocks; | ||
17 | +import org.onlab.onos.net.intent.PathIntent; | ||
18 | +import org.onlab.packet.MacAddress; | ||
19 | +import org.onlab.packet.VlanId; | ||
20 | + | ||
21 | +import static org.easymock.EasyMock.createMock; | ||
22 | +import static org.easymock.EasyMock.eq; | ||
23 | +import static org.easymock.EasyMock.expect; | ||
24 | +import static org.easymock.EasyMock.replay; | ||
25 | +import static org.hamcrest.CoreMatchers.notNullValue; | ||
26 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
27 | +import static org.hamcrest.Matchers.hasSize; | ||
28 | +import static org.hamcrest.Matchers.is; | ||
29 | +import static org.onlab.onos.net.NetTestTools.hid; | ||
30 | +import static org.onlab.onos.net.intent.LinksHaveEntryWithSourceDestinationPairMatcher.linksHasPath; | ||
31 | + | ||
32 | +/** | ||
33 | + * Unit tests for the HostToHost intent compiler. | ||
34 | + */ | ||
35 | +public class TestHostToHostIntentCompiler { | ||
36 | + private static final String HOST_ONE_MAC = "00:00:00:00:00:01"; | ||
37 | + private static final String HOST_TWO_MAC = "00:00:00:00:00:02"; | ||
38 | + private static final String HOST_ONE_VLAN = "-1"; | ||
39 | + private static final String HOST_TWO_VLAN = "-1"; | ||
40 | + private static final String HOST_ONE = HOST_ONE_MAC + "/" + HOST_ONE_VLAN; | ||
41 | + private static final String HOST_TWO = HOST_TWO_MAC + "/" + HOST_TWO_VLAN; | ||
42 | + | ||
43 | + private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | ||
44 | + private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | ||
45 | + | ||
46 | + private HostId hostOneId = HostId.hostId(HOST_ONE); | ||
47 | + private HostId hostTwoId = HostId.hostId(HOST_TWO); | ||
48 | + private HostService mockHostService; | ||
49 | + | ||
50 | + @Before | ||
51 | + public void setup() { | ||
52 | + Host hostOne = createMock(Host.class); | ||
53 | + expect(hostOne.mac()).andReturn(new MacAddress(HOST_ONE_MAC.getBytes())).anyTimes(); | ||
54 | + expect(hostOne.vlan()).andReturn(VlanId.vlanId()).anyTimes(); | ||
55 | + replay(hostOne); | ||
56 | + | ||
57 | + Host hostTwo = createMock(Host.class); | ||
58 | + expect(hostTwo.mac()).andReturn(new MacAddress(HOST_TWO_MAC.getBytes())).anyTimes(); | ||
59 | + expect(hostTwo.vlan()).andReturn(VlanId.vlanId()).anyTimes(); | ||
60 | + replay(hostTwo); | ||
61 | + | ||
62 | + mockHostService = createMock(HostService.class); | ||
63 | + expect(mockHostService.getHost(eq(hostOneId))).andReturn(hostOne).anyTimes(); | ||
64 | + expect(mockHostService.getHost(eq(hostTwoId))).andReturn(hostTwo).anyTimes(); | ||
65 | + replay(mockHostService); | ||
66 | + } | ||
67 | + | ||
68 | + /** | ||
69 | + * Creates a HostToHost intent based on two host Ids. | ||
70 | + * | ||
71 | + * @param oneIdString string for host one id | ||
72 | + * @param twoIdString string for host two id | ||
73 | + * @return HostToHostIntent for the two hosts | ||
74 | + */ | ||
75 | + private HostToHostIntent makeIntent(String oneIdString, String twoIdString) { | ||
76 | + return new HostToHostIntent(new IntentId(12), | ||
77 | + hid(oneIdString), | ||
78 | + hid(twoIdString), | ||
79 | + selector, | ||
80 | + treatment); | ||
81 | + } | ||
82 | + | ||
83 | + /** | ||
84 | + * Creates a compiler for HostToHost intents. | ||
85 | + * | ||
86 | + * @param hops string array describing the path hops to use when compiling | ||
87 | + * @return HostToHost intent compiler | ||
88 | + */ | ||
89 | + private HostToHostIntentCompiler makeCompiler(String[] hops) { | ||
90 | + HostToHostIntentCompiler compiler = | ||
91 | + new HostToHostIntentCompiler(); | ||
92 | + compiler.pathService = new IntentTestsMocks.MockPathService(hops); | ||
93 | + compiler.hostService = mockHostService; | ||
94 | + IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
95 | + compiler.intentIdGenerator = | ||
96 | + new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
97 | + return compiler; | ||
98 | + } | ||
99 | + | ||
100 | + | ||
101 | + /** | ||
102 | + * Tests a pair of hosts with 8 hops between them. | ||
103 | + */ | ||
104 | + @Test | ||
105 | + public void testSingleLongPathCompilation() { | ||
106 | + | ||
107 | + HostToHostIntent intent = makeIntent(HOST_ONE, | ||
108 | + HOST_TWO); | ||
109 | + assertThat(intent, is(notNullValue())); | ||
110 | + | ||
111 | + String[] hops = {HOST_ONE, "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", HOST_TWO}; | ||
112 | + HostToHostIntentCompiler compiler = makeCompiler(hops); | ||
113 | + assertThat(compiler, is(notNullValue())); | ||
114 | + | ||
115 | + List<Intent> result = compiler.compile(intent); | ||
116 | + assertThat(result, is(Matchers.notNullValue())); | ||
117 | + assertThat(result, hasSize(2)); | ||
118 | + Intent forwardResultIntent = result.get(0); | ||
119 | + assertThat(forwardResultIntent instanceof PathIntent, is(true)); | ||
120 | + Intent reverseResultIntent = result.get(1); | ||
121 | + assertThat(reverseResultIntent instanceof PathIntent, is(true)); | ||
122 | + | ||
123 | + if (forwardResultIntent instanceof PathIntent) { | ||
124 | + PathIntent forwardPathIntent = (PathIntent) forwardResultIntent; | ||
125 | + assertThat(forwardPathIntent.path().links(), hasSize(9)); | ||
126 | + assertThat(forwardPathIntent.path().links(), linksHasPath(HOST_ONE, "h1")); | ||
127 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h1", "h2")); | ||
128 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h2", "h3")); | ||
129 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h3", "h4")); | ||
130 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h4", "h5")); | ||
131 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h5", "h6")); | ||
132 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h6", "h7")); | ||
133 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h7", "h8")); | ||
134 | + assertThat(forwardPathIntent.path().links(), linksHasPath("h8", HOST_TWO)); | ||
135 | + } | ||
136 | + | ||
137 | + if (reverseResultIntent instanceof PathIntent) { | ||
138 | + PathIntent reversePathIntent = (PathIntent) reverseResultIntent; | ||
139 | + assertThat(reversePathIntent.path().links(), hasSize(9)); | ||
140 | + assertThat(reversePathIntent.path().links(), linksHasPath("h1", HOST_ONE)); | ||
141 | + assertThat(reversePathIntent.path().links(), linksHasPath("h2", "h1")); | ||
142 | + assertThat(reversePathIntent.path().links(), linksHasPath("h3", "h2")); | ||
143 | + assertThat(reversePathIntent.path().links(), linksHasPath("h4", "h3")); | ||
144 | + assertThat(reversePathIntent.path().links(), linksHasPath("h5", "h4")); | ||
145 | + assertThat(reversePathIntent.path().links(), linksHasPath("h6", "h5")); | ||
146 | + assertThat(reversePathIntent.path().links(), linksHasPath("h7", "h6")); | ||
147 | + assertThat(reversePathIntent.path().links(), linksHasPath("h8", "h7")); | ||
148 | + assertThat(reversePathIntent.path().links(), linksHasPath(HOST_TWO, "h8")); | ||
149 | + } | ||
150 | + } | ||
151 | +} |
core/net/src/test/java/org/onlab/onos/net/intent/impl/TestMultiPointToSinglePointIntentCompiler.java
0 → 100644
1 | +package org.onlab.onos.net.intent.impl; | ||
2 | + | ||
3 | +import java.util.HashSet; | ||
4 | +import java.util.List; | ||
5 | +import java.util.Set; | ||
6 | + | ||
7 | +import org.hamcrest.Matchers; | ||
8 | +import org.junit.Test; | ||
9 | +import org.onlab.onos.net.ConnectPoint; | ||
10 | +import org.onlab.onos.net.ElementId; | ||
11 | +import org.onlab.onos.net.Path; | ||
12 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
13 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
14 | +import org.onlab.onos.net.intent.Intent; | ||
15 | +import org.onlab.onos.net.intent.IntentId; | ||
16 | +import org.onlab.onos.net.intent.IntentTestsMocks; | ||
17 | +import org.onlab.onos.net.intent.LinkCollectionIntent; | ||
18 | +import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | ||
19 | +import org.onlab.onos.net.topology.LinkWeight; | ||
20 | +import org.onlab.onos.net.topology.PathService; | ||
21 | + | ||
22 | +import static org.hamcrest.CoreMatchers.notNullValue; | ||
23 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
24 | +import static org.hamcrest.Matchers.hasSize; | ||
25 | +import static org.hamcrest.Matchers.is; | ||
26 | +import static org.onlab.onos.net.NetTestTools.connectPoint; | ||
27 | +import static org.onlab.onos.net.NetTestTools.createPath; | ||
28 | +import static org.onlab.onos.net.intent.LinksHaveEntryWithSourceDestinationPairMatcher.linksHasPath; | ||
29 | + | ||
30 | +/** | ||
31 | + * Unit tests for the MultiPointToSinglePoint intent compiler. | ||
32 | + */ | ||
33 | +public class TestMultiPointToSinglePointIntentCompiler { | ||
34 | + | ||
35 | + private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | ||
36 | + private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | ||
37 | + | ||
38 | + /** | ||
39 | + * Mock path service for creating paths within the test. | ||
40 | + */ | ||
41 | + private static class MockPathService implements PathService { | ||
42 | + | ||
43 | + final String[] pathHops; | ||
44 | + | ||
45 | + /** | ||
46 | + * Constructor that provides a set of hops to mock. | ||
47 | + * | ||
48 | + * @param pathHops path hops to mock | ||
49 | + */ | ||
50 | + MockPathService(String[] pathHops) { | ||
51 | + this.pathHops = pathHops; | ||
52 | + } | ||
53 | + | ||
54 | + @Override | ||
55 | + public Set<Path> getPaths(ElementId src, ElementId dst) { | ||
56 | + Set<Path> result = new HashSet<>(); | ||
57 | + | ||
58 | + String[] allHops = new String[pathHops.length + 1]; | ||
59 | + allHops[0] = src.toString(); | ||
60 | + System.arraycopy(pathHops, 0, allHops, 1, pathHops.length); | ||
61 | + | ||
62 | + result.add(createPath(allHops)); | ||
63 | + return result; | ||
64 | + } | ||
65 | + | ||
66 | + @Override | ||
67 | + public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) { | ||
68 | + return null; | ||
69 | + } | ||
70 | + } | ||
71 | + | ||
72 | + /** | ||
73 | + * Creates a MultiPointToSinglePoint intent for a group of ingress points | ||
74 | + * and an egress point. | ||
75 | + * | ||
76 | + * @param ingressIds array of ingress device ids | ||
77 | + * @param egressId device id of the egress point | ||
78 | + * @return MultiPointToSinglePoint intent | ||
79 | + */ | ||
80 | + private MultiPointToSinglePointIntent makeIntent(String[] ingressIds, String egressId) { | ||
81 | + Set<ConnectPoint> ingressPoints = new HashSet<>(); | ||
82 | + ConnectPoint egressPoint = connectPoint(egressId, 1); | ||
83 | + | ||
84 | + for (String ingressId : ingressIds) { | ||
85 | + ingressPoints.add(connectPoint(ingressId, 1)); | ||
86 | + } | ||
87 | + | ||
88 | + return new MultiPointToSinglePointIntent( | ||
89 | + new IntentId(12), | ||
90 | + selector, | ||
91 | + treatment, | ||
92 | + ingressPoints, | ||
93 | + egressPoint); | ||
94 | + } | ||
95 | + | ||
96 | + /** | ||
97 | + * Creates a compiler for MultiPointToSinglePoint intents. | ||
98 | + * | ||
99 | + * @param hops hops to use while computing paths for this intent | ||
100 | + * @return MultiPointToSinglePoint intent | ||
101 | + */ | ||
102 | + private MultiPointToSinglePointIntentCompiler makeCompiler(String[] hops) { | ||
103 | + MultiPointToSinglePointIntentCompiler compiler = | ||
104 | + new MultiPointToSinglePointIntentCompiler(); | ||
105 | + compiler.pathService = new MockPathService(hops); | ||
106 | + IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
107 | + compiler.intentIdGenerator = | ||
108 | + new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
109 | + return compiler; | ||
110 | + } | ||
111 | + | ||
112 | + /** | ||
113 | + * Tests a single ingress point with 8 hops to its egress point. | ||
114 | + */ | ||
115 | + @Test | ||
116 | + public void testSingleLongPathCompilation() { | ||
117 | + | ||
118 | + String[] ingress = {"ingress"}; | ||
119 | + String egress = "egress"; | ||
120 | + | ||
121 | + MultiPointToSinglePointIntent intent = makeIntent(ingress, egress); | ||
122 | + assertThat(intent, is(notNullValue())); | ||
123 | + | ||
124 | + String[] hops = {"h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", | ||
125 | + egress}; | ||
126 | + MultiPointToSinglePointIntentCompiler compiler = makeCompiler(hops); | ||
127 | + assertThat(compiler, is(notNullValue())); | ||
128 | + | ||
129 | + List<Intent> result = compiler.compile(intent); | ||
130 | + assertThat(result, is(Matchers.notNullValue())); | ||
131 | + assertThat(result, hasSize(1)); | ||
132 | + Intent resultIntent = result.get(0); | ||
133 | + assertThat(resultIntent instanceof LinkCollectionIntent, is(true)); | ||
134 | + | ||
135 | + if (resultIntent instanceof LinkCollectionIntent) { | ||
136 | + LinkCollectionIntent linkIntent = (LinkCollectionIntent) resultIntent; | ||
137 | + assertThat(linkIntent.links(), hasSize(9)); | ||
138 | + assertThat(linkIntent.links(), linksHasPath("ingress", "h1")); | ||
139 | + assertThat(linkIntent.links(), linksHasPath("h1", "h2")); | ||
140 | + assertThat(linkIntent.links(), linksHasPath("h2", "h3")); | ||
141 | + assertThat(linkIntent.links(), linksHasPath("h4", "h5")); | ||
142 | + assertThat(linkIntent.links(), linksHasPath("h5", "h6")); | ||
143 | + assertThat(linkIntent.links(), linksHasPath("h7", "h8")); | ||
144 | + assertThat(linkIntent.links(), linksHasPath("h8", "egress")); | ||
145 | + } | ||
146 | + } | ||
147 | + | ||
148 | + /** | ||
149 | + * Tests a simple topology where two ingress points share some path segments | ||
150 | + * and some path segments are not shared. | ||
151 | + */ | ||
152 | + @Test | ||
153 | + public void testTwoIngressCompilation() { | ||
154 | + String[] ingress = {"ingress1", "ingress2"}; | ||
155 | + String egress = "egress"; | ||
156 | + | ||
157 | + MultiPointToSinglePointIntent intent = makeIntent(ingress, egress); | ||
158 | + assertThat(intent, is(notNullValue())); | ||
159 | + | ||
160 | + final String[] hops = {"inner1", "inner2", egress}; | ||
161 | + MultiPointToSinglePointIntentCompiler compiler = makeCompiler(hops); | ||
162 | + assertThat(compiler, is(notNullValue())); | ||
163 | + | ||
164 | + List<Intent> result = compiler.compile(intent); | ||
165 | + assertThat(result, is(notNullValue())); | ||
166 | + assertThat(result, hasSize(1)); | ||
167 | + Intent resultIntent = result.get(0); | ||
168 | + assertThat(resultIntent instanceof LinkCollectionIntent, is(true)); | ||
169 | + | ||
170 | + if (resultIntent instanceof LinkCollectionIntent) { | ||
171 | + LinkCollectionIntent linkIntent = (LinkCollectionIntent) resultIntent; | ||
172 | + assertThat(linkIntent.links(), hasSize(4)); | ||
173 | + assertThat(linkIntent.links(), linksHasPath("ingress1", "inner1")); | ||
174 | + assertThat(linkIntent.links(), linksHasPath("ingress2", "inner1")); | ||
175 | + assertThat(linkIntent.links(), linksHasPath("inner1", "inner2")); | ||
176 | + assertThat(linkIntent.links(), linksHasPath("inner2", "egress")); | ||
177 | + } | ||
178 | + } | ||
179 | + | ||
180 | + /** | ||
181 | + * Tests a large number of ingress points that share a common path to the | ||
182 | + * egress point. | ||
183 | + */ | ||
184 | + @Test | ||
185 | + public void testMultiIngressCompilation() { | ||
186 | + String[] ingress = {"i1", "i2", "i3", "i4", "i5", | ||
187 | + "i6", "i7", "i8", "i9", "i10"}; | ||
188 | + String egress = "e"; | ||
189 | + | ||
190 | + MultiPointToSinglePointIntent intent = makeIntent(ingress, egress); | ||
191 | + assertThat(intent, is(notNullValue())); | ||
192 | + | ||
193 | + final String[] hops = {"n1", egress}; | ||
194 | + MultiPointToSinglePointIntentCompiler compiler = makeCompiler(hops); | ||
195 | + assertThat(compiler, is(notNullValue())); | ||
196 | + | ||
197 | + List<Intent> result = compiler.compile(intent); | ||
198 | + assertThat(result, is(notNullValue())); | ||
199 | + assertThat(result, hasSize(1)); | ||
200 | + Intent resultIntent = result.get(0); | ||
201 | + assertThat(resultIntent instanceof LinkCollectionIntent, is(true)); | ||
202 | + | ||
203 | + if (resultIntent instanceof LinkCollectionIntent) { | ||
204 | + LinkCollectionIntent linkIntent = (LinkCollectionIntent) resultIntent; | ||
205 | + assertThat(linkIntent.links(), hasSize(ingress.length + 1)); | ||
206 | + for (String ingressToCheck : ingress) { | ||
207 | + assertThat(linkIntent.links(), | ||
208 | + linksHasPath(ingressToCheck, | ||
209 | + "n1")); | ||
210 | + } | ||
211 | + assertThat(linkIntent.links(), linksHasPath("n1", egress)); | ||
212 | + } | ||
213 | + } | ||
214 | +} |
-
Please register or login to post a comment