| /* |
| * Copyright 2015-present 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.flowobjective; |
| |
| import org.junit.Test; |
| import org.onosproject.net.flow.DefaultTrafficSelector; |
| import org.onosproject.net.flow.DefaultTrafficTreatment; |
| import org.onosproject.net.flow.TrafficSelector; |
| import org.onosproject.net.flow.TrafficTreatment; |
| import org.onosproject.net.flow.criteria.Criteria; |
| import org.onosproject.net.flow.criteria.Criterion; |
| |
| import static org.hamcrest.CoreMatchers.hasItem; |
| import static org.hamcrest.CoreMatchers.is; |
| import static org.hamcrest.CoreMatchers.nullValue; |
| import static org.hamcrest.MatcherAssert.assertThat; |
| import static org.hamcrest.Matchers.not; |
| import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; |
| import static org.onosproject.net.NetTestTools.APP_ID; |
| import static org.onosproject.net.flowobjective.FilteringObjective.Type.DENY; |
| import static org.onosproject.net.flowobjective.ForwardingObjective.Flag.SPECIFIC; |
| import static org.onosproject.net.flowobjective.NextObjective.Type.HASHED; |
| import static org.onosproject.net.flowobjective.Objective.Operation.ADD; |
| import static org.onosproject.net.flowobjective.Objective.Operation.REMOVE; |
| |
| /** |
| * Unit tests for forwarding objective class. |
| */ |
| public class ObjectiveTest { |
| |
| private final TrafficTreatment treatment = |
| DefaultTrafficTreatment.emptyTreatment(); |
| private final TrafficSelector selector = |
| DefaultTrafficSelector.emptySelector(); |
| private final Criterion criterion = Criteria.dummy(); |
| private final Criterion key = Criteria.dummy(); |
| |
| /** |
| * Mock objective context. |
| */ |
| private static class MockObjectiveContext implements ObjectiveContext { |
| @Override |
| public void onSuccess(Objective objective) { |
| // stub |
| } |
| |
| @Override |
| public void onError(Objective objective, ObjectiveError error) { |
| // stub |
| } |
| } |
| |
| /** |
| * Checks immutability of objective classes. |
| */ |
| @Test |
| public void testImmutability() { |
| assertThatClassIsImmutable(DefaultFilteringObjective.class); |
| assertThatClassIsImmutable(DefaultForwardingObjective.class); |
| assertThatClassIsImmutable(DefaultNextObjective.class); |
| } |
| |
| // Forwarding Objectives |
| |
| /** |
| * Makes a forwarding objective builder with a set of default values. |
| * |
| * @return forwarding objective builder |
| */ |
| private ForwardingObjective.Builder baseForwardingBuilder() { |
| return DefaultForwardingObjective.builder() |
| .withSelector(selector) |
| .withTreatment(treatment) |
| .withFlag(SPECIFIC) |
| .fromApp(APP_ID) |
| .withPriority(22) |
| .makeTemporary(5) |
| .nextStep(33); |
| } |
| |
| /** |
| * Checks the default values of a forwarding objective object. |
| * |
| * @param objective forwarding objective to check |
| */ |
| private void checkForwardingBase(ForwardingObjective objective, |
| Objective.Operation op, |
| ObjectiveContext expectedContext) { |
| assertThat(objective.permanent(), is(false)); |
| assertThat(objective.timeout(), is(5)); |
| assertThat(objective.selector(), is(selector)); |
| assertThat(objective.treatment(), is(treatment)); |
| assertThat(objective.flag(), is(SPECIFIC)); |
| assertThat(objective.appId(), is(APP_ID)); |
| assertThat(objective.nextId(), is(33)); |
| assertThat(objective.id(), is(not(0))); |
| assertThat(objective.priority(), is(22)); |
| assertThat(objective.op(), is(op)); |
| if (objective.context().isPresent()) { |
| assertThat(objective.context().get(), is(expectedContext)); |
| } else { |
| assertThat(expectedContext, nullValue()); |
| } |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * add() method. |
| */ |
| @Test |
| public void testForwardingAdd() { |
| checkForwardingBase(baseForwardingBuilder().add(), ADD, null); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * add(context) method. |
| */ |
| @Test |
| public void testForwardingAddWithContext() { |
| ObjectiveContext context = new MockObjectiveContext(); |
| checkForwardingBase(baseForwardingBuilder().add(context), ADD, context); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * remove() method. |
| */ |
| @Test |
| public void testForwardingRemove() { |
| checkForwardingBase(baseForwardingBuilder().remove(), REMOVE, null); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * remove(context) method. |
| */ |
| @Test |
| public void testForwardingRemoveWithContext() { |
| ObjectiveContext context = new MockObjectiveContext(); |
| checkForwardingBase(baseForwardingBuilder().remove(context), REMOVE, context); |
| } |
| |
| // Filtering objectives |
| |
| /** |
| * Makes a filtering objective builder with a set of default values. |
| * |
| * @return filtering objective builder |
| */ |
| private FilteringObjective.Builder baseFilteringBuilder() { |
| return DefaultFilteringObjective.builder() |
| .withKey(key) |
| .withPriority(5) |
| .addCondition(criterion) |
| .fromApp(APP_ID) |
| .makeTemporary(2) |
| .deny(); |
| } |
| |
| /** |
| * Checks the default values of a filtering objective object. |
| * |
| * @param objective filtering objective to check |
| */ |
| private void checkFilteringBase(FilteringObjective objective, |
| Objective.Operation op, |
| ObjectiveContext expectedContext) { |
| assertThat(objective.key(), is(key)); |
| assertThat(objective.conditions(), hasItem(criterion)); |
| assertThat(objective.permanent(), is(false)); |
| assertThat(objective.timeout(), is(2)); |
| assertThat(objective.priority(), is(5)); |
| assertThat(objective.appId(), is(APP_ID)); |
| assertThat(objective.type(), is(DENY)); |
| assertThat(objective.id(), is(not(0))); |
| assertThat(objective.op(), is(op)); |
| if (objective.context().isPresent()) { |
| assertThat(objective.context().get(), is(expectedContext)); |
| } else { |
| assertThat(expectedContext, nullValue()); |
| } |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * add() method. |
| */ |
| @Test |
| public void testFilteringAdd() { |
| checkFilteringBase(baseFilteringBuilder().add(), ADD, null); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * add(context) method. |
| */ |
| @Test |
| public void testFilteringAddWithContext() { |
| ObjectiveContext context = new MockObjectiveContext(); |
| checkFilteringBase(baseFilteringBuilder().add(context), ADD, context); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * remove() method. |
| */ |
| @Test |
| public void testFilteringRemove() { |
| checkFilteringBase(baseFilteringBuilder().remove(), REMOVE, null); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * remove(context) method. |
| */ |
| @Test |
| public void testFilteringRemoveWithContext() { |
| ObjectiveContext context = new MockObjectiveContext(); |
| checkFilteringBase(baseFilteringBuilder().remove(context), REMOVE, context); |
| } |
| |
| // Next objectives |
| |
| /** |
| * Makes a next objective builder with a set of default values. |
| * |
| * @return next objective builder |
| */ |
| private NextObjective.Builder baseNextBuilder() { |
| return DefaultNextObjective.builder() |
| .addTreatment(treatment) |
| .withId(12) |
| .withType(HASHED) |
| .makeTemporary(777) |
| .withPriority(33) |
| .fromApp(APP_ID); |
| } |
| |
| /** |
| * Checks the default values of a next objective object. |
| * |
| * @param objective next objective to check |
| */ |
| private void checkNextBase(NextObjective objective, |
| Objective.Operation op, |
| ObjectiveContext expectedContext) { |
| assertThat(objective.id(), is(12)); |
| assertThat(objective.appId(), is(APP_ID)); |
| assertThat(objective.type(), is(HASHED)); |
| assertThat(objective.next(), hasItem(treatment)); |
| assertThat(objective.permanent(), is(false)); |
| assertThat(objective.timeout(), is(0)); |
| assertThat(objective.priority(), is(0)); |
| assertThat(objective.op(), is(op)); |
| if (objective.context().isPresent()) { |
| assertThat(objective.context().get(), is(expectedContext)); |
| } else { |
| assertThat(expectedContext, nullValue()); |
| } |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * add() method. |
| */ |
| @Test |
| public void testNextAdd() { |
| checkNextBase(baseNextBuilder().add(), ADD, null); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * add(context) method. |
| */ |
| @Test |
| public void testNextAddWithContext() { |
| ObjectiveContext context = new MockObjectiveContext(); |
| checkNextBase(baseNextBuilder().add(context), ADD, context); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * remove() method. |
| */ |
| @Test |
| public void testNextRemove() { |
| checkNextBase(baseNextBuilder().remove(), REMOVE, null); |
| } |
| |
| /** |
| * Tests that forwarding objective objects are built correctly using the |
| * remove(context) method. |
| */ |
| @Test |
| public void testNextRemoveWithContext() { |
| ObjectiveContext context = new MockObjectiveContext(); |
| checkNextBase(baseNextBuilder().remove(context), REMOVE, context); |
| } |
| } |