blob: 547d594bcbb7b10117a7a69dd6297d7c99b8ccf2 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* 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.sdxl2;
import com.google.common.collect.Sets;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.onosproject.TestApplicationId;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.IdGenerator;
import org.onosproject.net.intent.Intent;
import org.onosproject.net.intent.Key;
import org.onosproject.net.intent.MockIdGenerator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import static java.lang.String.format;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
/**
* Unit tests for SDX-L2 VC Manager.
*/
public class SdxL2VCManagerTest {
private static final String SDXL2_1 = "sdxl2_test1";
private static final String CP1 = "of:00000000000001/1";
private static final String CP2 = "of:00000000000002/1";
private static final String VLANS1 = "2,3,4";
private static final String VLANS2 = "4,5,6";
private static final String CEMAC1 = "52:40:00:12:44:01";
private static final String CEMAC2 = "51:12:11:00:23:01";
private static final String CP3 = "of:00000000000002/2";
private static final String VLANS3 = "8,9,10";
private static final String CEMAC3 = "52:12:11:00:23:01";
private static final String SDXL2_2 = "sdxl2_test2";
private static final String CP5 = "of:00000000000002/4";
private static final String VLANS5 = "100";
private static final String CEMAC5 = "52:12:11:00:23:11";
private static final String CP6 = "of:00000000000004/4";
private static final String VLANS6 = "1";
private static final String CEMAC6 = "52:12:11:a0:23:11";
private static final String CP7 = "of:0000000000000a/4";
private static final String VLANS7 = "1";
private static final String CEMAC7 = "52:12:21:00:25:11";
private static final String CP8 = "of:00000000000009/4";
private static final String VLANS8 = "111";
private static final String CEMAC8 = "52:12:14:a0:23:11";
private static final String CP9 = "of:0000000000000a/4";
private static final String VLANS9 = "1";
private static final String CEMAC9 = "52:12:21:00:28:11";
private static final String CP10 = "of:00000000000009/4";
private static final String VLANS10 = "1";
private static final String CEMAC10 = "52:12:14:aa:23:11";
private static final ApplicationId APPID = TestApplicationId.create("foo");
/**
* Exception expected to raise when creating VC with CPs using both same MAC.
*/
@Rule
public ExpectedException exceptionAddVC = ExpectedException.none();
/**
* Exception expected to raise when removing VC with CPs using both same MAC.
*/
@Rule
public ExpectedException exceptionRemoveVC = ExpectedException.none();
private SdxL2MacVCManager manager;
private IdGenerator idGenerator = new MockIdGenerator();
/**
* Prepare environment before starting testing VCs.
*/
@Before
public void setUp() {
SdxL2DistributedStore store = new SdxL2DistributedStore();
store.initForTest();
manager = new SdxL2MacVCManager(
APPID, store, new IntentServiceTest());
Intent.bindIdGenerator(idGenerator);
}
/**
* Clean up environment after finishing testing VCs.
*/
@After
public void tearDown() {
Intent.unbindIdGenerator(idGenerator);
}
/**
* Ensure that intents generated when reversing endpoints are different.
*/
@Test
public void testGeneratedIntentsHaveDifferentKey() {
SdxL2ConnectionPoint cpOne = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpOneAux = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC1);
SdxL2ConnectionPoint cpTwo = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC1);
SdxL2ConnectionPoint cpTwoAux = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
Key key1 = manager.generateIntentKey(SDXL2_1, cpOne, cpTwo, "1");
Key key2 = manager.generateIntentKey(SDXL2_1, cpOneAux, cpTwoAux, "1");
assertNotEquals(key1, key2);
Key key3 = manager.generateIntentKey(SDXL2_1, cpOne, cpTwoAux, "1");
Key key4 = manager.generateIntentKey(SDXL2_1, cpOneAux, cpTwo, "1");
assertNotEquals(key3, key4);
}
/**
* Tests proper creation of VCs only when endpoints have different MAC address.
*/
@Test
public void testAddVCChecks() {
SdxL2ConnectionPoint cpFive = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpSix = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC2);
manager.addVC(SDXL2_1, cpFive, cpSix);
SdxL2ConnectionPoint cpSeven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC2);
SdxL2ConnectionPoint cpEight = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
manager.addVC(SDXL2_1, cpSeven, cpEight);
SdxL2ConnectionPoint cpNine = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpTen = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST3", CP3, VLANS3, CEMAC3);
manager.addVC(SDXL2_1, cpNine, cpTen);
exceptionAddVC.expect(IllegalStateException.class);
SdxL2ConnectionPoint cpOne = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpTwo = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC1);
manager.addVC(SDXL2_1, cpOne, cpTwo);
}
/**
* Tests proper removal of VCs only when endpoints have different MAC address.
*/
@Test
public void testremoveVCChecks() {
SdxL2ConnectionPoint cpOne = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpTwo = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC1);
SdxL2ConnectionPoint cpFive = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpSix = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC2);
SdxL2ConnectionPoint cpSeven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC2);
SdxL2ConnectionPoint cpEight = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpNine = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpTen = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST3", CP3, VLANS3, CEMAC3);
manager.addVC(SDXL2_1, cpFive, cpSix);
manager.removeVC(cpFive, cpSix);
manager.removeVC(cpSeven, cpEight);
manager.removeVC(cpNine, cpTen);
exceptionRemoveVC.expect(IllegalStateException.class);
manager.removeVC(cpOne, cpTwo);
}
/**
* Verifies that only VCs created properly (here, during set up) are retrieved.
*/
@Test
public void testGetVC() {
connectionSetup();
Iterator<SdxL2ConnectionPoint> lhs = setupLhsCPs().iterator();
Iterator<SdxL2ConnectionPoint> rhs = setupRhsCPs().iterator();
String vc;
SdxL2ConnectionPoint one;
SdxL2ConnectionPoint two;
while (lhs.hasNext()) {
one = lhs.next();
two = rhs.next();
vc = one.toString().compareTo(two.toString()) < 0 ?
format(SdxL2VCManager.SDXL2_CPS_FORMAT, one, two) :
format(SdxL2VCManager.SDXL2_CPS_FORMAT, two, one);
assertEquals(vc, manager.getVC(one, two));
}
SdxL2ConnectionPoint cpLeft = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
SdxL2ConnectionPoint cpRight = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP3, VLANS3, CEMAC1);
assertNull(manager.getVC(cpLeft, cpRight));
}
/**
* Verifies that only VCs created properly (here, during set up) are retrieved.
*/
@Test
public void testGetVCs() {
connectionSetup();
Iterator<SdxL2ConnectionPoint> lhs = setupLhsCPs().iterator();
Iterator<SdxL2ConnectionPoint> rhs = setupRhsCPs().iterator();
Set<String> expectedVCs = Sets.newHashSet();
String vc;
String lhsName;
String rhsName;
while (lhs.hasNext()) {
lhsName = lhs.next().name();
rhsName = rhs.next().name();
vc = lhsName.compareTo(rhsName) < 0 ?
format(SdxL2VCManager.NAME_FORMAT, SDXL2_2, lhsName, rhsName) :
format(SdxL2VCManager.NAME_FORMAT, SDXL2_2, rhsName, lhsName);
expectedVCs.add(vc);
}
Set<String> vcs = manager.getVCs(Optional.of(SDXL2_2));
assertEquals(expectedVCs, vcs);
vcs = manager.getVCs(Optional.of(SDXL2_1));
assertEquals(Collections.emptySet(), vcs);
vcs = manager.getVCs(Optional.empty());
assertEquals(expectedVCs, vcs);
}
/**
* Defines the left-hand side endpoints, each with a specific VLAN.
*
* @return list of SdxL2ConnectionPoint objects
*/
private List<SdxL2ConnectionPoint> setupLhsCPs() {
List<SdxL2ConnectionPoint> cps = new ArrayList<>();
SdxL2ConnectionPoint cpone = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST1", CP1, VLANS1, CEMAC1);
cps.add(cpone);
SdxL2ConnectionPoint cpfive = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST5", CP5, VLANS5, CEMAC5);
cps.add(cpfive);
SdxL2ConnectionPoint cpseven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST7", CP7, VLANS7, CEMAC7);
cps.add(cpseven);
SdxL2ConnectionPoint cpnine = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST9", CP9, VLANS9, CEMAC9);
cps.add(cpnine);
return cps;
}
/**
* Defines the right-hand side endpoints, each with a specific VLAN.
*
* @return list of SdxL2ConnectionPoint objects
*/
private List<SdxL2ConnectionPoint> setupRhsCPs() {
List<SdxL2ConnectionPoint> cps = new ArrayList<>();
SdxL2ConnectionPoint cptwo = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST2", CP2, VLANS2, CEMAC2);
cps.add(cptwo);
SdxL2ConnectionPoint cpsix = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST6", CP6, VLANS6, CEMAC6);
cps.add(cpsix);
SdxL2ConnectionPoint cpeight = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST8", CP8, VLANS8, CEMAC8);
cps.add(cpeight);
SdxL2ConnectionPoint cpten = SdxL2ConnectionPoint.sdxl2ConnectionPoint("TEST10", CP10, VLANS10, CEMAC10);
cps.add(cpten);
return cps;
}
/**
* Sets the connection up by adding CPs for left and right hand side of the VCs.
*/
private void connectionSetup() {
Iterator<SdxL2ConnectionPoint> lhs = setupLhsCPs().iterator();
Iterator<SdxL2ConnectionPoint> rhs = setupRhsCPs().iterator();
while (lhs.hasNext()) {
manager.addVC(SDXL2_2, lhs.next(), rhs.next());
}
}
}