From bb32048ded82d0e3b1ef3e8542a2f79a4e76c74e Mon Sep 17 00:00:00 2001 From: Ray Milkey Date: Wed, 25 Feb 2015 15:16:46 -0800 Subject: [PATCH] Add unit test for MPLS path intent installer - refactored common code from intent installer tests into a base class. Change-Id: Iab4d01531748dd014ba73cc2fbed5930d8018977 --- .../net/intent/IntentTestsMocks.java | 13 +- .../net/intent/impl/IntentInstallerTest.java | 135 ++++++++++++++++++ .../impl/MplsPathIntentInstallerTest.java | 134 +++++++++++++++++ .../intent/impl/PathIntentInstallerTest.java | 97 +------------ 4 files changed, 283 insertions(+), 96 deletions(-) create mode 100644 core/net/src/test/java/org/onosproject/net/intent/impl/IntentInstallerTest.java create mode 100644 core/net/src/test/java/org/onosproject/net/intent/impl/MplsPathIntentInstallerTest.java diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java index f56632ce86..ac4b44b924 100644 --- a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java +++ b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java @@ -52,6 +52,8 @@ import org.onosproject.net.resource.LinkResourceAllocations; import org.onosproject.net.resource.LinkResourceListener; import org.onosproject.net.resource.LinkResourceRequest; import org.onosproject.net.resource.LinkResourceService; +import org.onosproject.net.resource.MplsLabel; +import org.onosproject.net.resource.MplsLabelResourceAllocation; import org.onosproject.net.resource.ResourceAllocation; import org.onosproject.net.resource.ResourceRequest; import org.onosproject.net.resource.ResourceType; @@ -63,6 +65,7 @@ import org.onosproject.net.topology.TopologyVertex; import org.onosproject.store.Timestamp; import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableSet; /** * Common mocks used by the intent framework tests. @@ -152,7 +155,7 @@ public class IntentTestsMocks { public static class MockLinkResourceAllocations implements LinkResourceAllocations { @Override public Set getResourceAllocation(Link link) { - return null; + return ImmutableSet.of(new MplsLabelResourceAllocation(MplsLabel.valueOf(10))); } @Override @@ -254,17 +257,19 @@ public class IntentTestsMocks { @Override public Iterable getAllocations() { - return null; + return ImmutableSet.of( + new IntentTestsMocks.MockLinkResourceAllocations()); } @Override public Iterable getAllocations(Link link) { - return null; + return ImmutableSet.of( + new IntentTestsMocks.MockLinkResourceAllocations()); } @Override public LinkResourceAllocations getAllocations(IntentId intentId) { - return null; + return new IntentTestsMocks.MockLinkResourceAllocations(); } @Override diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/IntentInstallerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/IntentInstallerTest.java new file mode 100644 index 0000000000..b80ef2feb5 --- /dev/null +++ b/core/net/src/test/java/org/onosproject/net/intent/impl/IntentInstallerTest.java @@ -0,0 +1,135 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.net.intent.impl; + +import org.junit.After; +import org.junit.Before; +import org.onosproject.core.ApplicationId; +import org.onosproject.core.CoreService; +import org.onosproject.core.CoreServiceAdapter; +import org.onosproject.core.IdGenerator; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.DeviceId; +import org.onosproject.net.flow.FlowRuleOperation; +import org.onosproject.net.intent.FakeIntentManager; +import org.onosproject.net.intent.Intent; +import org.onosproject.net.intent.IntentInstaller; +import org.onosproject.net.intent.IntentTestsMocks; +import org.onosproject.net.intent.MockIdGenerator; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.onosproject.net.NetTestTools.APP_ID; +import static org.onosproject.net.NetTestTools.connectPoint; + +/** + * Base class for intent installer tests. + */ +public class IntentInstallerTest { + + /** + * Mock for core service. + */ + static class TestCoreService extends CoreServiceAdapter { + + String registeredId = ""; + + @Override + public ApplicationId registerApplication(String identifier) { + registeredId = identifier; + return APP_ID; + } + } + + /** + * Mock for intent manager service. Checks that the PathIntent + * installer installs and uninstalls properly. + */ + static class MockIntentManager extends FakeIntentManager { + + boolean installerRegistered = false; + final Class expectedClass; + + private MockIntentManager() { + expectedClass = null; + } + + MockIntentManager(Class expectedInstaller) { + this.expectedClass = expectedInstaller; + } + + @Override + public void registerInstaller( + Class cls, + IntentInstaller installer) { + assertThat(cls, equalTo(expectedClass)); + installerRegistered = true; + } + + @Override + public void unregisterInstaller(Class cls) { + assertThat(cls, equalTo(expectedClass)); + assertThat(installerRegistered, is(true)); + } + + } + + CoreService testCoreService; + IdGenerator idGenerator = new MockIdGenerator(); + IntentInstaller installer; + + final IntentTestsMocks.MockSelector selector = new IntentTestsMocks.MockSelector(); + final IntentTestsMocks.MockTreatment treatment = new IntentTestsMocks.MockTreatment(); + final ConnectPoint d1p1 = connectPoint("s1", 0); + final ConnectPoint d2p0 = connectPoint("s2", 0); + final ConnectPoint d2p1 = connectPoint("s2", 1); + final ConnectPoint d3p1 = connectPoint("s3", 1); + final ConnectPoint d3p0 = connectPoint("s3", 10); + final ConnectPoint d1p0 = connectPoint("s1", 10); + + /** + * Configures objects used in all the test cases. + */ + @Before + public void setUp() { + testCoreService = new TestCoreService(); + Intent.bindIdGenerator(idGenerator); + } + + /** + * Tears down objects used in all the test cases. + */ + @After + public void tearDown() { + Intent.unbindIdGenerator(idGenerator); + } + + /** + * Checks that a flow operation contains the correct values. + * + * @param op flow rule operation to check + * @param type type the flow rule operation should have + * @param deviceId device id the flow rule operation should have + */ + void checkFlowOperation(FlowRuleOperation op, + FlowRuleOperation.Type type, + DeviceId deviceId) { + assertThat(op.type(), is(type)); + assertThat(op.rule().deviceId(), equalTo(deviceId)); + } + +} diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/MplsPathIntentInstallerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/MplsPathIntentInstallerTest.java new file mode 100644 index 0000000000..c2f616a03b --- /dev/null +++ b/core/net/src/test/java/org/onosproject/net/intent/impl/MplsPathIntentInstallerTest.java @@ -0,0 +1,134 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.net.intent.impl; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.onlab.packet.MplsLabel; +import org.onosproject.net.DefaultLink; +import org.onosproject.net.DefaultPath; +import org.onosproject.net.Link; +import org.onosproject.net.flow.FlowRuleOperation; +import org.onosproject.net.intent.IntentTestsMocks; +import org.onosproject.net.intent.MplsPathIntent; +import org.onosproject.store.trivial.impl.SimpleLinkStore; + +import com.google.common.collect.ImmutableList; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.notNullValue; +import static org.onosproject.net.Link.Type.DIRECT; +import static org.onosproject.net.NetTestTools.APP_ID; +import static org.onosproject.net.NetTestTools.PID; + +/** + * Unit tests for path intent installer. + */ +public class MplsPathIntentInstallerTest extends IntentInstallerTest { + + MplsPathIntentInstaller installer; + + private final Optional ingressLabel = + Optional.ofNullable(MplsLabel.mplsLabel(10)); + private final Optional egressLabel = + Optional.ofNullable(MplsLabel.mplsLabel(20)); + + private final List links = Arrays.asList( + new DefaultLink(PID, d1p1, d2p0, DIRECT), + new DefaultLink(PID, d2p1, d3p1, DIRECT) + ); + private final int hops = links.size() - 1; + private MplsPathIntent intent; + + /** + * Configures objects used in all the test cases. + */ + @Before + public void localSetUp() { + installer = new MplsPathIntentInstaller(); + installer.coreService = testCoreService; + installer.intentManager = new MockIntentManager(MplsPathIntent.class); + installer.linkStore = new SimpleLinkStore(); + installer.resourceService = new IntentTestsMocks.MockResourceService(); + + intent = new MplsPathIntent(APP_ID, selector, treatment, + new DefaultPath(PID, links, hops), + ingressLabel, + egressLabel, + ImmutableList.of()); + } + + /** + * Tests activation and deactivation of the installer. + */ + @Test + public void activateDeactivate() { + installer.activate(); + installer.deactivate(); + } + + /** + * Tests installation operation of the MPLS path intent installer. + */ + @Test + public void install() { + installer.activate(); + + List> operations = + installer.install(intent); + assertThat(operations, notNullValue()); + assertThat(operations, hasSize(1)); + + Collection flowRuleOpsCollection = operations.get(0); + assertThat(flowRuleOpsCollection, hasSize(hops)); + FlowRuleOperation[] flowRuleOps = + flowRuleOpsCollection.toArray(new FlowRuleOperation[hops]); + + FlowRuleOperation op0 = flowRuleOps[0]; + checkFlowOperation(op0, FlowRuleOperation.Type.ADD, d2p0.deviceId()); + + installer.deactivate(); + } + + /** + * Checks the uninstall operation of the path intent installer. + */ + @Test + public void uninstall() { + installer.activate(); + + List> operations = + installer.uninstall(intent); + assertThat(operations, notNullValue()); + assertThat(operations, hasSize(1)); + + Collection flowRuleOpsCollection = operations.get(0); + assertThat(flowRuleOpsCollection, hasSize(hops)); + FlowRuleOperation[] flowRuleOps = + flowRuleOpsCollection.toArray(new FlowRuleOperation[hops]); + + FlowRuleOperation op0 = flowRuleOps[0]; + checkFlowOperation(op0, FlowRuleOperation.Type.REMOVE, d2p0.deviceId()); + + installer.deactivate(); + } +} diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/PathIntentInstallerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/PathIntentInstallerTest.java index e80e65fd98..ecdee64c31 100644 --- a/core/net/src/test/java/org/onosproject/net/intent/impl/PathIntentInstallerTest.java +++ b/core/net/src/test/java/org/onosproject/net/intent/impl/PathIntentInstallerTest.java @@ -19,54 +19,31 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; -import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.CoreService; -import org.onosproject.core.CoreServiceAdapter; -import org.onosproject.core.IdGenerator; -import org.onosproject.net.ConnectPoint; import org.onosproject.net.DefaultLink; import org.onosproject.net.DefaultPath; -import org.onosproject.net.DeviceId; import org.onosproject.net.Link; import org.onosproject.net.flow.FlowRuleOperation; -import org.onosproject.net.intent.FakeIntentManager; -import org.onosproject.net.intent.Intent; -import org.onosproject.net.intent.IntentInstaller; -import org.onosproject.net.intent.IntentTestsMocks; -import org.onosproject.net.intent.MockIdGenerator; import org.onosproject.net.intent.PathIntent; import com.google.common.collect.ImmutableList; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.notNullValue; import static org.onosproject.net.DefaultEdgeLink.createEdgeLink; import static org.onosproject.net.Link.Type.DIRECT; import static org.onosproject.net.NetTestTools.APP_ID; import static org.onosproject.net.NetTestTools.PID; -import static org.onosproject.net.NetTestTools.connectPoint; /** * Unit tests for path intent installer. */ -public class PathIntentInstallerTest { +public class PathIntentInstallerTest extends IntentInstallerTest { - CoreService testCoreService; - IdGenerator idGenerator = new MockIdGenerator(); PathIntentInstaller installer; - private final IntentTestsMocks.MockSelector selector = new IntentTestsMocks.MockSelector(); - private final IntentTestsMocks.MockTreatment treatment = new IntentTestsMocks.MockTreatment(); - private final ConnectPoint d1p1 = connectPoint("s1", 0); - private final ConnectPoint d2p0 = connectPoint("s2", 0); - private final ConnectPoint d2p1 = connectPoint("s2", 1); - private final ConnectPoint d3p1 = connectPoint("s3", 1); - private final ConnectPoint d3p0 = connectPoint("s3", 10); - private final ConnectPoint d1p0 = connectPoint("s1", 10); - private final List links = Arrays.asList( createEdgeLink(d1p0, true), new DefaultLink(PID, d1p1, d2p0, DIRECT), @@ -80,64 +57,14 @@ public class PathIntentInstallerTest { * Configures objects used in all the test cases. */ @Before - public void localSetup() { - testCoreService = new TestCoreService(); - Intent.bindIdGenerator(idGenerator); + public void localSetUp() { installer = new PathIntentInstaller(); installer.coreService = testCoreService; - installer.intentManager = new MockIntentManager(); + installer.intentManager = new MockIntentManager(PathIntent.class); intent = new PathIntent(APP_ID, selector, treatment, new DefaultPath(PID, links, hops), ImmutableList.of()); } - /** - * Tears down objects used in all the test cases. - */ - @After - public void localTearDown() { - Intent.unbindIdGenerator(idGenerator); - } - - /** - * Mock for core service. - */ - private static class TestCoreService extends CoreServiceAdapter { - - String registeredId = ""; - - @Override - public ApplicationId registerApplication(String identifier) { - registeredId = identifier; - return APP_ID; - } - } - - /** - * Mock for intent manager service. Checks that the PathIntent - * installer installs and uninstalls properly. - */ - private static class MockIntentManager extends FakeIntentManager { - - boolean installerRegistered = false; - - @Override - public void registerInstaller( - Class cls, - IntentInstaller installer) { - assertThat(cls.getCanonicalName(), - equalTo("org.onosproject.net.intent.PathIntent")); - installerRegistered = true; - } - - @Override - public void unregisterInstaller(Class cls) { - assertThat(cls.getCanonicalName(), - equalTo("org.onosproject.net.intent.PathIntent")); - assertThat(installerRegistered, is(true)); - } - - } - /** * Tests activation and deactivation of the installer. */ @@ -147,20 +74,6 @@ public class PathIntentInstallerTest { installer.deactivate(); } - /** - * Checks that a flow operation contains the correct values. - * - * @param op flow rule operation to check - * @param type type the flow rule operation should have - * @param deviceId device id the flow rule operation should have - */ - private void checkFlowOperation(FlowRuleOperation op, - FlowRuleOperation.Type type, - DeviceId deviceId) { - assertThat(op.type(), is(type)); - assertThat(op.rule().deviceId(), equalTo(deviceId)); - } - /** * Tests installation operation of the path intent installer. */