Improved logging in ScenarioHandler
[openflowjava.git] / openflow-protocol-it / src / test / java / org / opendaylight / openflowjava / protocol / impl / integration / IntegrationTest.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.integration;\r
3 \r
4 import java.net.InetAddress;\r
5 import java.util.ArrayList;\r
6 import java.util.List;\r
7 import java.util.Stack;\r
8 import java.util.concurrent.ExecutionException;\r
9 import java.util.concurrent.TimeUnit;\r
10 \r
11 import org.junit.After;\r
12 import org.junit.Before;\r
13 import org.junit.Test;\r
14 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;\r
15 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration.FEATURE_SUPPORT;\r
16 import org.opendaylight.openflowjava.protocol.impl.clients.ClientEvent;\r
17 import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioFactory;\r
18 import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioHandler;\r
19 import org.opendaylight.openflowjava.protocol.impl.clients.SendEvent;\r
20 import org.opendaylight.openflowjava.protocol.impl.clients.SimpleClient;\r
21 import org.opendaylight.openflowjava.protocol.impl.clients.SleepEvent;\r
22 import org.opendaylight.openflowjava.protocol.impl.clients.WaitForMessageEvent;\r
23 import org.opendaylight.openflowjava.protocol.impl.connection.SwitchConnectionProviderImpl;\r
24 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;\r
25 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
26 import org.slf4j.Logger;\r
27 import org.slf4j.LoggerFactory;\r
28 \r
29 /**\r
30  * @author michal.polkorab\r
31  * @author timotej.kubas\r
32  */\r
33 public class IntegrationTest {\r
34 \r
35     private static final Logger LOGGER = LoggerFactory\r
36             .getLogger(IntegrationTest.class);\r
37     private static int port;\r
38     private static final FEATURE_SUPPORT DEFAULT_TLS_SUPPORT = FEATURE_SUPPORT.NOT_SUPPORTED;\r
39     private static final int SWITCH_IDLE_TIMEOUT = 2000;\r
40     private static final long CONNECTION_TIMEOUT = 2000;\r
41     private InetAddress startupAddress;\r
42     private MockPlugin mockPlugin;\r
43     private SwitchConnectionProviderImpl scpimpl;\r
44     private List<ConnectionConfiguration> configs;\r
45 \r
46     /**\r
47      * @throws Exception\r
48      */\r
49     @Before\r
50     public void setUp() throws Exception {\r
51         LOGGER.debug("\n\nstarting test -------------------------------");\r
52         startupAddress = InetAddress.getLocalHost();\r
53         mockPlugin = new MockPlugin();\r
54         scpimpl = new SwitchConnectionProviderImpl();\r
55         scpimpl.setSwitchConnectionHandler(mockPlugin);\r
56         configs = new ArrayList<>();\r
57         configs.add(new TestingConnConfigImpl(startupAddress, 0, DEFAULT_TLS_SUPPORT, SWITCH_IDLE_TIMEOUT));\r
58         scpimpl.configure(configs);\r
59         scpimpl.startup().get(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);\r
60         TcpHandler server = (TcpHandler) scpimpl.getServerLot().iterator().next();\r
61         port = server.getPort();\r
62     }\r
63 \r
64     /**\r
65      * @throws Exception\r
66      */\r
67     @After\r
68     public void tearDown() throws Exception {\r
69         Thread.sleep(500);\r
70     }\r
71 \r
72     /**\r
73      * Library integration and communication test with handshake\r
74      * @throws Exception \r
75      */\r
76     @Test\r
77     public void testHandshake() throws Exception {\r
78         int amountOfCLients = 1;\r
79         Stack<ClientEvent> scenario = ScenarioFactory.createHandshakeScenario();\r
80         ScenarioHandler handler = new ScenarioHandler(scenario);\r
81         List<SimpleClient> clients = createAndStartClient(amountOfCLients, handler);\r
82         SimpleClient firstClient = clients.get(0);\r
83         firstClient.getScenarioDone().get();\r
84         mockPlugin.shutdown();\r
85         mockPlugin.getFinishedFuture().get();\r
86     }\r
87 \r
88     /**\r
89      * Library integration and communication test with handshake + echo exchange\r
90      * @throws Exception \r
91      */\r
92     @Test\r
93     public void testHandshakeAndEcho() throws Exception {\r
94         int amountOfCLients = 1;\r
95         Stack<ClientEvent> scenario = ScenarioFactory.createHandshakeScenario();\r
96         scenario.add(0, new SleepEvent(1500));\r
97         scenario.add(0, new SendEvent(ByteBufUtils.hexStringToBytes("04 02 00 08 00 00 00 04")));\r
98         scenario.add(0, new SleepEvent(1500));\r
99         scenario.add(0, new WaitForMessageEvent(ByteBufUtils.hexStringToBytes("04 03 00 08 00 00 00 04")));\r
100         ScenarioHandler handler = new ScenarioHandler(scenario);\r
101         List<SimpleClient> clients = createAndStartClient(amountOfCLients, handler);\r
102         SimpleClient firstClient = clients.get(0);\r
103         firstClient.getScenarioDone().get();\r
104         mockPlugin.shutdown();\r
105         mockPlugin.getFinishedFuture().get();\r
106     }\r
107 \r
108     /**\r
109      * Library integration and communication test (with virtual machine)\r
110      * @throws Exception\r
111      */\r
112     //@Test\r
113     public void testCommunicationWithVM() throws Exception {\r
114         mockPlugin.getFinishedFuture().get();\r
115     }\r
116     \r
117     /**\r
118      * @param amountOfCLients \r
119      * @return new clients up and running\r
120      * @throws ExecutionException if some client could not start\r
121      */\r
122     private List<SimpleClient> createAndStartClient(int amountOfCLients, ScenarioHandler scenarioHandler)\r
123             throws ExecutionException {\r
124         List<SimpleClient> clientsHorde = new ArrayList<>();\r
125         for (int i = 0; i < amountOfCLients; i++) {\r
126             LOGGER.debug("startup address in createclient: " + startupAddress.getHostAddress());\r
127             SimpleClient sc = new SimpleClient(startupAddress.getHostAddress(), port);\r
128             sc.setSecuredClient(false);\r
129             sc.setScenarioHandler(scenarioHandler);\r
130             clientsHorde.add(sc);\r
131             sc.start();\r
132         }\r
133         for (SimpleClient sc : clientsHorde) {\r
134             try {\r
135                 sc.getIsOnlineFuture().get(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);\r
136             } catch (Exception e) {\r
137                 LOGGER.error(e.getMessage(), e);\r
138                 throw new ExecutionException(e);\r
139             }\r
140         }\r
141         return clientsHorde;\r
142     }\r
143 \r
144 }\r