X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-it%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Fit%2FOFPluginToLibraryTest.java;h=061f996d4d88ea8c148b3fa06f5ff0491044bd97;hb=88843cf835a7bd502d0140a55daed30a77d7218f;hp=ca8f76b2e233a3fcc7b219f89310b7806763392d;hpb=f6191e57b90b712248220e87549c882dadd09eae;p=openflowplugin.git diff --git a/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPluginToLibraryTest.java b/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPluginToLibraryTest.java index ca8f76b2e2..061f996d4d 100644 --- a/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPluginToLibraryTest.java +++ b/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPluginToLibraryTest.java @@ -1,66 +1,79 @@ +/** + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.openflowplugin.openflow.md.it; -import static org.ops4j.pax.exam.CoreOptions.junitBundles; -import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.CoreOptions.options; import static org.ops4j.pax.exam.CoreOptions.systemProperty; import java.util.Stack; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; import javax.inject.Inject; -import junit.framework.Assert; - import org.junit.After; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.opendaylight.controller.test.sal.binding.it.TestHelper; import org.opendaylight.openflowjava.protocol.impl.clients.ClientEvent; -import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioFactory; import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioHandler; -import org.opendaylight.openflowjava.protocol.impl.clients.SendEvent; import org.opendaylight.openflowjava.protocol.impl.clients.SimpleClient; import org.opendaylight.openflowjava.protocol.impl.clients.SleepEvent; -import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; +import org.opendaylight.openflowplugin.openflow.md.core.ThreadPoolLoggingExecutor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; +import org.ops4j.pax.exam.spi.reactors.PerClass; +import org.ops4j.pax.exam.util.Filter; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * @author mirehak + * covers basic handshake scenarios */ @RunWith(PaxExam.class) +@ExamReactorStrategy(PerClass.class) public class OFPluginToLibraryTest { private static final Logger LOG = LoggerFactory .getLogger(OFPluginToLibraryTest.class); - /** base controller package */ - public static final String ODL = "org.opendaylight.controller"; - /** controller.model package */ - public static final String ODL_MODEL = "org.opendaylight.controller.model"; - /** yangtools package */ - public static final String YANG = "org.opendaylight.yangtools"; - /** yangtools.model package */ - public static final String YANG_MODEL = "org.opendaylight.yangtools.model"; - /** OFPlugin package */ - public static final String OFPLUGIN = "org.opendaylight.openflowplugin"; - /** OFLibrary package */ - public static final String OFLIBRARY = "org.opendaylight.openflowjava"; - /** netty.io package */ - public static final String NETTY = "io.netty"; + private static final ArrayBlockingQueue SCENARIO_POOL_QUEUE = new ArrayBlockingQueue<>(1); - @Inject - SwitchConnectionProvider switchConnectionProvider; + @Inject @Filter(timeout=20000) + OpenflowPluginProvider openflowPluginProvider; @Inject BundleContext ctx; private SimpleClient switchSim; + private ThreadPoolLoggingExecutor scenarioPool; + + /** + * test setup + * @throws InterruptedException + */ + @Before + public void setUp() throws InterruptedException { + LOG.debug("openflowPluginProvider: "+openflowPluginProvider); + scenarioPool = new ThreadPoolLoggingExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, SCENARIO_POOL_QUEUE, "scenario"); + //FIXME: plugin should provide service exposing startup result via future + Thread.sleep(5000); + } + /** + * test tear down + */ @After public void tearDown() { try { @@ -70,6 +83,19 @@ public class OFPluginToLibraryTest { String msg = "waiting for scenario to finish failed: "+e.getMessage(); LOG.error(msg, e); Assert.fail(msg); + } finally { + scenarioPool.shutdownNow(); + SCENARIO_POOL_QUEUE.clear(); + } + + try { + LOG.debug("checking if simulator succeeded to connect to controller"); + boolean simulatorWasOnline = switchSim.getIsOnlineFuture().get(100, TimeUnit.MILLISECONDS); + Assert.assertTrue("simulator failed to connect to controller", simulatorWasOnline); + } catch (Exception e) { + String message = "simulator probably failed to connect to controller"; + LOG.error(message, e); + Assert.fail(message); } } @@ -78,74 +104,131 @@ public class OFPluginToLibraryTest { * @throws Exception */ @Test - public void handshakeOk() throws Exception { - LOG.debug("handshake integration test"); - LOG.debug("switchConnectionProvider: "+switchConnectionProvider); + public void handshakeOk1() throws Exception { + LOG.debug("handshakeOk1 integration test"); - switchSim = new SimpleClient("localhost", 6653); + switchSim = createSimpleClient(); switchSim.setSecuredClient(false); - Stack handshakeScenario = ScenarioFactory.createHandshakeScenario(); - + Stack handshakeScenario = ScenarioFactory.createHandshakeScenarioVBM( + ScenarioFactory.VERSION_BITMAP_13, (short) 0, ScenarioFactory.VERSION_BITMAP_10_13); + ScenarioHandler scenario = new ScenarioHandler(handshakeScenario); switchSim.setScenarioHandler(scenario); - switchSim.start(); - try { - switchSim.getScenarioDone().get(getFailSafeTimeout(), TimeUnit.MILLISECONDS); - } catch (Exception e) { - String msg = "waiting for scenario to finish failed: "+e.getMessage(); - LOG.error(msg, e); - Assert.fail(msg); - } - //TODO: dump errors of plugin + scenarioPool.execute(switchSim); } - + /** - * test basic integration with OFLib running the handshake + * test basic integration with OFLib running the handshake (with version bitmap) + * @throws Exception + */ + @Test + public void handshakeOk2() throws Exception { + LOG.debug("handshakeOk2 integration test"); + + switchSim = createSimpleClient(); + switchSim.setSecuredClient(false); + Stack handshakeScenario = ScenarioFactory.createHandshakeScenario( + (short) 0, ScenarioFactory.VERSION_BITMAP_10_13); + + ScenarioHandler scenario = new ScenarioHandler(handshakeScenario); + switchSim.setScenarioHandler(scenario); + scenarioPool.execute(switchSim); + } + + /** + * test basic integration with OFLib running the handshake: + * creating auxiliary connection without primary connection -- FAIL * @throws Exception */ @Test public void handshakeFail1() throws Exception { - LOG.debug("handshake integration test"); - LOG.debug("switchConnectionProvider: "+switchConnectionProvider); + LOG.debug("handshakeFail1 integration test"); - switchSim = new SimpleClient("localhost", 6653); + switchSim = createSimpleClient(); switchSim.setSecuredClient(false); - Stack handshakeScenario = ScenarioFactory.createHandshakeScenario(); - SendEvent featuresReply = new SendEvent(new byte[] {4, 6, 0, 32, 0, 0, 0, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 1, 1, 0, 0, 0, 1, 2, 3, 0, 1, 2, 3}); - handshakeScenario.setElementAt(featuresReply, 0); - + Stack handshakeScenario = ScenarioFactory.createHandshakeScenario((short) 1, + ScenarioFactory.VERSION_BITMAP_10_13); + ScenarioHandler scenario = new ScenarioHandler(handshakeScenario); switchSim.setScenarioHandler(scenario); - switchSim.start(); - try { - switchSim.getScenarioDone().get(getFailSafeTimeout(), TimeUnit.MILLISECONDS); - } catch (Exception e) { - String msg = "waiting for scenario to finish failed: "+e.getMessage(); - LOG.error(msg, e); - Assert.fail(msg); - } - //TODO: dump errors of plugin + scenarioPool.execute(switchSim); } - + /** * test basic integration with OFLib running the handshake + * adding 5s wait as first event of switch -- FAIL * @throws Exception */ @Test public void handshakeFail2() throws Exception { - LOG.debug("handshake integration test"); - LOG.debug("switchConnectionProvider: "+switchConnectionProvider); + LOG.debug("handshakeFail2 integration test"); + LOG.debug("openflowPluginProvider: "+openflowPluginProvider); - switchSim = new SimpleClient("localhost", 6653); + switchSim = createSimpleClient(); switchSim.setSecuredClient(false); - Stack handshakeScenario = ScenarioFactory.createHandshakeScenario(); + Stack handshakeScenario = ScenarioFactory.createHandshakeScenario((short) 0, + ScenarioFactory.VERSION_BITMAP_10_13); handshakeScenario.setElementAt(new SleepEvent(5000), 0); - + + ScenarioHandler scenario = new ScenarioHandler(handshakeScenario); + switchSim.setScenarioHandler(scenario); + scenarioPool.execute(switchSim); + } + + /** + * test with MLX running OF10 and OFP running OF13/OF10 + * + * MLX issues an OFPT_ERROR on the version compatability MLX issues a second + * HELLO after the second OFP HELLO + * + * @throws Exception + */ + @Test + public void handshakeOkNoVBM_OF10_TwoHello() throws Exception { + LOG.debug("handshakeOkMLX10 integration test"); + LOG.debug("openflowPluginProvider: " + openflowPluginProvider); + + switchSim = createSimpleClient(); + switchSim.setSecuredClient(false); + Stack handshakeScenario = ScenarioFactory + .createHandshakeScenarioNoVBM_OF10_TwoHello(); + // handshakeScenario.setElementAt(new SleepEvent(5000), + // handshakeScenario + // .size()); + ScenarioHandler scenario = new ScenarioHandler(handshakeScenario); switchSim.setScenarioHandler(scenario); - switchSim.start(); - tearDown(); - //TODO: dump errors of plugin + scenarioPool.execute(switchSim); + } + + /** + * test with Mininet running OF10 and OFP running OF13/OF10 + * + * Mininet issues an OFPT_ERROR on the version compatability Mininet doesn't + * issue a second HELLO + * + * @throws Exception + */ + @Test + public void handshakeOkNoVBM_OF10_SingleHello() throws Exception { + LOG.debug("handshakeOkMLX10 integration test"); + LOG.debug("openflowPluginProvider: " + openflowPluginProvider); + + switchSim = createSimpleClient(); + switchSim.setSecuredClient(false); + Stack handshakeScenario = ScenarioFactory + .createHandshakeScenarioNOVBM_OF10_OneHello(); + + ScenarioHandler scenario = new ScenarioHandler(handshakeScenario); + switchSim.setScenarioHandler(scenario); + scenarioPool.execute(switchSim); + } + + /** + * @return + */ + private static SimpleClient createSimpleClient() { + return new SimpleClient("localhost", 6653); } /** @@ -161,53 +244,22 @@ public class OFPluginToLibraryTest { */ @Configuration public Option[] config() { + LOG.info("configuring..."); return options( systemProperty("osgi.console").value("2401"), - mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(), - mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(), - mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), - mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(), - mavenBundle("org.opendaylight.yangtools.thirdparty", "xtend-lib-osgi").versionAsInProject(), - mavenBundle("com.google.guava", "guava").versionAsInProject(), - mavenBundle("org.javassist", "javassist").versionAsInProject(), - mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager").versionAsInProject(), - mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(), - - mavenBundle(ODL, "sal").versionAsInProject(), - mavenBundle(ODL, "sal.connection").versionAsInProject(), - mavenBundle(ODL, "sal-binding-api").versionAsInProject(), - mavenBundle(ODL, "sal-common").versionAsInProject(), - mavenBundle(ODL, "sal-common-api").versionAsInProject(), - mavenBundle(ODL, "sal-common-util").versionAsInProject(), - - mavenBundle("org.opendaylight.controller.thirdparty", "org.openflow.openflowj").versionAsInProject(), - mavenBundle(ODL_MODEL, "model-flow-base").versionAsInProject(), - mavenBundle(ODL_MODEL, "model-inventory").versionAsInProject(), - mavenBundle(ODL_MODEL, "model-flow-service").versionAsInProject(), - mavenBundle(ODL_MODEL, "model-flow-statistics").versionAsInProject(), - - mavenBundle(OFLIBRARY, "openflow-protocol-impl").versionAsInProject(), - mavenBundle(OFLIBRARY, "openflow-protocol-api").versionAsInProject(), - mavenBundle(OFLIBRARY, "openflow-protocol-spi").versionAsInProject(), - - mavenBundle(NETTY, "netty-handler").versionAsInProject(), - mavenBundle(NETTY, "netty-buffer").versionAsInProject(), - mavenBundle(NETTY, "netty-common").versionAsInProject(), - mavenBundle(NETTY, "netty-transport").versionAsInProject(), - mavenBundle(NETTY, "netty-codec").versionAsInProject(), - - mavenBundle(YANG_MODEL, "ietf-inet-types").versionAsInProject(), - mavenBundle(YANG_MODEL, "ietf-yang-types").versionAsInProject(), - mavenBundle(YANG_MODEL, "yang-ext").versionAsInProject(), - mavenBundle(YANG_MODEL, "opendaylight-l2-types").versionAsInProject(), - - mavenBundle(YANG, "concepts").versionAsInProject(), - mavenBundle(YANG, "yang-binding").versionAsInProject(), - mavenBundle(YANG, "yang-common").versionAsInProject(), - - mavenBundle(OFLIBRARY, "simple-client").versionAsInProject().start(), - mavenBundle(OFPLUGIN, "openflowplugin").versionAsInProject(), - junitBundles()); + systemProperty("osgi.bundles.defaultStartLevel").value("4"), + systemProperty("pax.exam.osgi.unresolved.fail").value("true"), + + OFPaxOptionsAssistant.osgiConsoleBundles(), + OFPaxOptionsAssistant.loggingBudles(), + + TestHelper.junitAndMockitoBundles(), + TestHelper.mdSalCoreBundles(), + TestHelper.configMinumumBundles(), + TestHelper.baseModelBundles(), + TestHelper.flowCapableModelBundles(), + + OFPaxOptionsAssistant.ofPluginBundles()); } }