Integration test, SimpleClient bundle
[openflowjava.git] / openflow-protocol-it / src / test / java / org / opendaylight / openflowjava / protocol / impl / integration / IntegrationTest.java
diff --git a/openflow-protocol-it/src/test/java/org/opendaylight/openflowjava/protocol/impl/integration/IntegrationTest.java b/openflow-protocol-it/src/test/java/org/opendaylight/openflowjava/protocol/impl/integration/IntegrationTest.java
new file mode 100644 (file)
index 0000000..75e5a72
--- /dev/null
@@ -0,0 +1,145 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.integration;\r
+\r
+import java.net.InetAddress;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Stack;\r
+import java.util.concurrent.ExecutionException;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.junit.After;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;\r
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration.FEATURE_SUPPORT;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.ClientEvent;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioHandler;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.SendEvent;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.SimpleClient;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.SleepEvent;\r
+import org.opendaylight.openflowjava.protocol.impl.clients.WaitForMessageEvent;\r
+import org.opendaylight.openflowjava.protocol.impl.connection.SwitchConnectionProviderImpl;\r
+import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class IntegrationTest {\r
+\r
+    /** Name of file in which OpenFLow protocol messages are stored in binary format */\r
+    private static int port;\r
+    private static final FEATURE_SUPPORT DEFAULT_TLS_SUPPORT = FEATURE_SUPPORT.NOT_SUPPORTED;\r
+    private static final int SWITCH_IDLE_TIMEOUT = 2000;\r
+\r
+    protected static final Logger LOGGER = LoggerFactory\r
+            .getLogger(IntegrationTest.class);\r
+\r
+    private static final long CONNECTION_TIMEOUT = 2000;\r
+    private InetAddress startupAddress;\r
+    private MockPlugin mockPlugin;\r
+    private SwitchConnectionProviderImpl scpimpl;\r
+    private List<ConnectionConfiguration> configs;\r
+\r
+    /**\r
+     * @throws Exception\r
+     */\r
+    @Before\r
+    public void setUp() throws Exception {\r
+        LOGGER.debug("\n\nstarting test -------------------------------");\r
+        startupAddress = InetAddress.getLocalHost();\r
+        mockPlugin = new MockPlugin();\r
+        scpimpl = new SwitchConnectionProviderImpl();\r
+        scpimpl.setSwitchConnectionHandler(mockPlugin);\r
+        configs = new ArrayList<>();\r
+        configs.add(new TestingConnConfigImpl(startupAddress, 0, DEFAULT_TLS_SUPPORT, SWITCH_IDLE_TIMEOUT));\r
+        scpimpl.configure(configs);\r
+        scpimpl.startup().get(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);\r
+        TcpHandler server = (TcpHandler) scpimpl.getServerLot().iterator().next();\r
+        port = server.getPort();\r
+    }\r
+\r
+    @After\r
+    public void tearDown() throws Exception {\r
+        Thread.sleep(500);\r
+    }\r
+\r
+    /**\r
+     * Library integration and communication test\r
+     * @throws Exception \r
+     */\r
+    @Test\r
+    public void testHandshake() throws Exception {\r
+        int amountOfCLients = 1;\r
+        Stack<ClientEvent> scenario = ScenarioFactory.createHandshakeScenario();\r
+        ScenarioHandler handler = new ScenarioHandler(scenario);\r
+        List<SimpleClient> clients = createAndStartClient(amountOfCLients, handler);\r
+        SimpleClient firstClient = clients.get(0);\r
+        firstClient.getScenarioDone().get();\r
+        mockPlugin.shutdown();\r
+        mockPlugin.getFinishedFuture().get();\r
+    }\r
+\r
+    /**\r
+     * Library integration and communication test\r
+     * @throws Exception \r
+     */\r
+    @Test\r
+    public void testHandshakeAndEcho() throws Exception {\r
+        int amountOfCLients = 1;\r
+        Stack<ClientEvent> scenario = ScenarioFactory.createHandshakeScenario();\r
+        scenario.add(0, new SleepEvent(1500));\r
+        scenario.add(0, new SendEvent(ByteBufUtils.hexStringToBytes("04 02 00 08 00 00 00 04")));\r
+        scenario.add(0, new SleepEvent(1500));\r
+        scenario.add(0, new WaitForMessageEvent(ByteBufUtils.hexStringToBytes("04 03 00 08 00 00 00 04")));\r
+        ScenarioHandler handler = new ScenarioHandler(scenario);\r
+        List<SimpleClient> clients = createAndStartClient(amountOfCLients, handler);\r
+        SimpleClient firstClient = clients.get(0);\r
+        firstClient.getScenarioDone().get();\r
+        mockPlugin.shutdown();\r
+        mockPlugin.getFinishedFuture().get();\r
+    }\r
+\r
+    /**\r
+     * Library integration and communication test (with virtual machine)\r
+     * @throws Exception\r
+     */\r
+    //@Test\r
+    public void testCommunicationWithVM() throws Exception {\r
+        mockPlugin.getFinishedFuture().get();\r
+    }\r
+    \r
+    /**\r
+     * @param amountOfCLients \r
+     * @return new clients up and running\r
+     * @throws InterruptedException\r
+     * @throws ExecutionException\r
+     */\r
+    private List<SimpleClient> createAndStartClient(int amountOfCLients, ScenarioHandler scenarioHandler)\r
+            throws InterruptedException, ExecutionException {\r
+        List<SimpleClient> clientsHorde = new ArrayList<>();\r
+        for (int i = 0; i < amountOfCLients; i++) {\r
+            LOGGER.debug("startup address in createclient: " + startupAddress.getHostAddress());\r
+            SimpleClient sc = new SimpleClient(startupAddress.getHostAddress(), port);\r
+            sc.setSecuredClient(false);\r
+            sc.setScenarioHandler(scenarioHandler);\r
+            clientsHorde.add(sc);\r
+            sc.start();\r
+        }\r
+        for (SimpleClient sc : clientsHorde) {\r
+            try {\r
+                sc.getIsOnlineFuture().get(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);\r
+            } catch (Exception e) {\r
+                LOGGER.error(e.getMessage(), e);\r
+                throw new ExecutionException(e);\r
+            }\r
+        }\r
+        return clientsHorde;\r
+    }\r
+\r
+}\r