blob: 805259369f7d0e4bb9383c8be78a1bb0bf878533 [file] [log] [blame]
/*
* Copyright 2016-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.behaviour;
import org.junit.Test;
import org.onlab.packet.DscpClass;
import org.onlab.util.Bandwidth;
import org.onosproject.TestApplicationId;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.meter.Band;
import org.onosproject.net.meter.DefaultBand;
import org.onosproject.net.meter.DefaultMeter;
import org.onosproject.net.meter.Meter;
import org.onosproject.net.meter.MeterId;
import static org.onosproject.net.behaviour.BandwidthProfileAction.Action;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Test for BandwidthProfile class.
*/
public class BandwidthProfileTest {
private static final long ONE = 1L;
private static final long ONE_K = 1_000L;
private static final long TWO_K = 2_000L;
private static final long EIGHT_K = 8_000L;
private static final long ONE_M = 1_000_000L;
private static final long TEN_M = 10_000_000L;
@Test
public void testMeterConversion() {
DeviceId deviceId = DeviceId.deviceId("netconf:10.0.0.1:22");
ApplicationId appId = TestApplicationId.create("org.onosproject.foo.app");
Meter.Builder meterBuilder = new DefaultMeter.Builder()
.withId(MeterId.meterId(ONE))
.withUnit(Meter.Unit.KB_PER_SEC)
.forDevice(deviceId)
.burst();
// Create Meter with single band
Band band1 = DefaultBand.builder()
.ofType(Band.Type.DROP)
.withRate(TEN_M)
.burstSize(TWO_K)
.build();
Meter meter = meterBuilder
.fromApp(appId)
.withBands(Arrays.asList(band1))
.build();
BandwidthProfile bandwidthProfile = BandwidthProfile.fromMeter(meter);
assertEquals("wrong bw profile name",
bandwidthProfile.name(), meter.id().toString());
assertEquals("wrong bw profile type",
bandwidthProfile.type(), BandwidthProfile.Type.sr2CM);
assertEquals("wrong bw profile CIR",
bandwidthProfile.cir().bps(), band1.rate() * EIGHT_K, 0);
assertEquals("wrong bw profile CBS",
(long) bandwidthProfile.cbs(), (long) band1.burst());
assertNull(bandwidthProfile.pir());
assertNull(bandwidthProfile.pbs());
assertNull(bandwidthProfile.ebs());
assertEquals("wrong green action",
bandwidthProfile.greenAction(),
getBuilder(Action.PASS).build());
assertNull(bandwidthProfile.yellowAction());
assertEquals("wrong red action",
bandwidthProfile.redAction(),
getBuilder(Action.DISCARD).build());
assertEquals("wrong color-aware mode",
bandwidthProfile.colorAware(), false);
// Create Meter with two bands
Band band2 = DefaultBand.builder().burstSize(ONE_K)
.ofType(Band.Type.REMARK)
.dropPrecedence((short) 0b001010)
.withRate(ONE_M)
.build();
meter = meterBuilder
.fromApp(appId)
.withBands(Arrays.asList(band1, band2))
.build();
bandwidthProfile = BandwidthProfile.fromMeter(meter);
assertEquals("wrong bw profile name",
bandwidthProfile.name(), meter.id().toString());
assertEquals("wrong bw profile type",
bandwidthProfile.type(), BandwidthProfile.Type.trTCM);
assertEquals("wrong bw profile CIR",
bandwidthProfile.cir().bps(), band2.rate() * EIGHT_K, 0);
assertEquals("wrong bw profile CBS",
(long) bandwidthProfile.cbs(), (long) band2.burst());
assertEquals("wrong bw profile PIR",
bandwidthProfile.pir().bps(), band1.rate() * EIGHT_K, 0);
assertEquals("wrong bw profile PBS",
(long) bandwidthProfile.pbs(), (long) band1.burst());
assertNull(bandwidthProfile.ebs());
assertEquals("wrong green action",
bandwidthProfile.greenAction(),
getBuilder(Action.PASS).build());
assertEquals("wrong yellow action",
bandwidthProfile.yellowAction(),
getBuilder(Action.REMARK)
.dscpClass(DscpClass.AF11)
.build());
assertEquals("wrong red action",
bandwidthProfile.redAction(),
getBuilder(Action.DISCARD).build());
assertEquals("wrong color-aware mode",
bandwidthProfile.colorAware(), false);
}
@Test
public void testType() {
BandwidthProfile.Builder bwProfileBuilder = BandwidthProfile.builder()
.name("profile")
.cir(Bandwidth.bps(ONE_M))
.cbs((int) ONE_K)
.greenAction(getBuilder(Action.PASS).build())
.redAction(getBuilder(Action.DISCARD).build())
.colorAware(false);
assertEquals("wrong bw profile type",
bwProfileBuilder.build().type(),
BandwidthProfile.Type.sr2CM);
bwProfileBuilder.ebs((int) TWO_K)
.yellowAction(getBuilder(Action.REMARK)
.dscpClass(DscpClass.AF11)
.build());
assertEquals("wrong bw profile type",
bwProfileBuilder.build().type(),
BandwidthProfile.Type.srTCM);
bwProfileBuilder.ebs(null);
bwProfileBuilder.pir(Bandwidth.bps(TEN_M))
.pbs((int) TWO_K);
assertEquals("wrong bw profile type",
bwProfileBuilder.build().type(),
BandwidthProfile.Type.trTCM);
}
@Test
public void testEquals() {
BandwidthProfile bwProfile1 = new BandwidthProfile.Builder()
.name("profile1")
.cir(Bandwidth.bps(ONE_M))
.cbs((int) ONE_K)
.pir(Bandwidth.bps(TEN_M))
.pbs((int) TWO_K)
.greenAction(getBuilder(Action.PASS).build())
.yellowAction(getBuilder(Action.REMARK)
.dscpClass(DscpClass.AF11)
.build())
.redAction(getBuilder(Action.DISCARD).build())
.colorAware(false)
.build();
BandwidthProfile bwProfile2 = new BandwidthProfile.Builder()
.name("profile2")
.cir(Bandwidth.bps(ONE_M))
.cbs((int) ONE_K)
.pir(Bandwidth.bps(TEN_M))
.pbs((int) TWO_K)
.greenAction(getBuilder(Action.PASS).build())
.yellowAction(getBuilder(Action.REMARK)
.dscpClass(DscpClass.AF11)
.build())
.redAction(getBuilder(Action.DISCARD).build())
.colorAware(false)
.build();
assertTrue("wrong equals method", bwProfile1.equals(bwProfile2));
}
private static BandwidthProfileAction.Builder getBuilder(Action action) {
return new BandwidthProfileAction.Builder().action(action);
}
}