2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.sample.zeromq.test.it;
10 import junit.framework.Assert;
12 import org.junit.Test;
13 import org.junit.runner.RunWith;
15 import org.opendaylight.controller.sal.connector.remoterpc.RemoteRpcClient;
17 import org.opendaylight.controller.sal.connector.remoterpc.dto.Message;
18 import org.opendaylight.controller.sal.core.api.Broker;
19 import org.opendaylight.controller.sample.zeromq.consumer.ExampleConsumer;
20 import org.opendaylight.controller.sample.zeromq.provider.ExampleProvider;
22 import org.opendaylight.controller.test.sal.binding.it.TestHelper;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.common.RpcError;
25 import org.opendaylight.yangtools.yang.common.RpcResult;
26 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
27 import org.ops4j.pax.exam.Configuration;
28 import org.ops4j.pax.exam.Option;
29 import org.ops4j.pax.exam.junit.PaxExam;
30 import org.ops4j.pax.exam.util.Filter;
31 import org.osgi.framework.Bundle;
32 import org.osgi.framework.BundleException;
33 import org.osgi.framework.ServiceReference;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.zeromq.ZMQ;
39 import javax.inject.Inject;
41 import java.io.IOException;
44 import static org.opendaylight.controller.test.sal.binding.it.TestHelper.baseModelBundles;
45 import static org.opendaylight.controller.test.sal.binding.it.TestHelper.bindingAwareSalBundles;
47 //import static org.ops4j.pax.exam.CoreOptions.*;
49 @RunWith(PaxExam.class)
50 public class RouterTest {
52 private Logger _logger = LoggerFactory.getLogger(RouterTest.class);
54 public static final String ODL = "org.opendaylight.controller";
55 public static final String YANG = "org.opendaylight.yangtools";
56 public static final String SAMPLE = "org.opendaylight.controller.tests";
57 private final URI namespace = URI.create("http://cisco.com/example");
58 private final QName QNAME = new QName(namespace, "heartbeat");
62 org.osgi.framework.BundleContext ctx;
65 @Filter(timeout=60*1000)
68 private ZMQ.Context zmqCtx = ZMQ.context(1);
69 //private Server router;
70 //private ExampleProvider provider;
73 public void testInvokeRpc() throws Exception{
76 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
77 Assert.assertNotNull(providerRef);
79 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
80 Assert.assertNotNull(provider);
82 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
83 Assert.assertNotNull(consumerRef);
84 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
85 Assert.assertNotNull(consumer);
88 _logger.debug("Provider sends announcement [{}]", "heartbeat");
89 provider.announce(QNAME);
90 ServiceReference routerRef = ctx.getServiceReference(RemoteRpcClient.class);
91 RemoteRpcClient router = (RemoteRpcClient) ctx.getService(routerRef);
92 _logger.debug("Found router[{}]", router);
93 _logger.debug("Invoking RPC [{}]", QNAME);
94 for (int i = 0; i < 3; i++) {
95 RpcResult<CompositeNode> result = router.invokeRpc(QNAME, consumer.getValidCompositeNodeWithOneSimpleChild());
96 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
97 Assert.assertNotNull(result);
102 public void testInvokeRpcWithValidSimpleNode() throws Exception{
103 //Thread.sleep(1500);
105 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
106 Assert.assertNotNull(providerRef);
107 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
108 Assert.assertNotNull(provider);
109 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
110 Assert.assertNotNull(consumerRef);
111 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
112 Assert.assertNotNull(consumer);
114 // Provider sends announcement
115 _logger.debug("Provider sends announcement [{}]", "heartbeat");
116 provider.announce(QNAME);
117 // Consumer invokes RPC
118 _logger.debug("Invoking RPC [{}]", QNAME);
119 CompositeNode input = consumer.getValidCompositeNodeWithOneSimpleChild();
120 for (int i = 0; i < 3; i++) {
121 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
122 Assert.assertNotNull(result);
123 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
124 Assert.assertTrue(result.isSuccessful());
125 Assert.assertNotNull(result.getResult());
126 Assert.assertEquals(0, result.getErrors().size());
127 Assert.assertEquals(input.getChildren().size()+1, result.getResult().getChildren().size());
132 public void testInvokeRpcWithValidSimpleNodes() throws Exception{
133 //Thread.sleep(1500);
135 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
136 Assert.assertNotNull(providerRef);
137 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
138 Assert.assertNotNull(provider);
139 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
140 Assert.assertNotNull(consumerRef);
141 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
142 Assert.assertNotNull(consumer);
144 // Provider sends announcement
145 _logger.debug("Provider sends announcement [{}]", "heartbeat");
146 provider.announce(QNAME);
147 // Consumer invokes RPC
148 _logger.debug("Invoking RPC [{}]", QNAME);
149 CompositeNode input = consumer.getValidCompositeNodeWithFourSimpleChildren();
150 for (int i = 0; i < 3; i++) {
151 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
152 Assert.assertNotNull(result);
153 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
154 Assert.assertTrue(result.isSuccessful());
155 Assert.assertNotNull(result.getResult());
156 Assert.assertEquals(0, result.getErrors().size());
157 Assert.assertEquals(input.getChildren().size()+1, result.getResult().getChildren().size());
162 public void testInvokeRpcWithValidCompositeNode() throws Exception{
163 //Thread.sleep(1500);
165 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
166 Assert.assertNotNull(providerRef);
167 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
168 Assert.assertNotNull(provider);
169 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
170 Assert.assertNotNull(consumerRef);
171 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
172 Assert.assertNotNull(consumer);
174 // Provider sends announcement
175 _logger.debug("Provider sends announcement [{}]", "heartbeat");
176 provider.announce(QNAME);
177 // Consumer invokes RPC
178 _logger.debug("Invoking RPC [{}]", QNAME);
179 CompositeNode input = consumer.getValidCompositeNodeWithTwoCompositeChildren();
180 for (int i = 0; i < 3; i++) {
181 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
182 Assert.assertNotNull(result);
183 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
184 Assert.assertTrue(result.isSuccessful());
185 Assert.assertNotNull(result.getResult());
186 Assert.assertEquals(0, result.getErrors().size());
187 Assert.assertEquals(input.getChildren().size()+1, result.getResult().getChildren().size());
192 public void testInvokeRpcWithNullInput() throws Exception{
193 //Thread.sleep(1500);
195 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
196 Assert.assertNotNull(providerRef);
197 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
198 Assert.assertNotNull(provider);
199 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
200 Assert.assertNotNull(consumerRef);
201 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
202 Assert.assertNotNull(consumer);
204 // Provider sends announcement
205 _logger.debug("Provider sends announcement [{}]", QNAME.getLocalName());
206 provider.announce(QNAME);
207 // Consumer invokes RPC
208 _logger.debug("Invoking RPC [{}]", QNAME);
209 for (int i = 0; i < 3; i++) {
210 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, null);
211 Assert.assertNotNull(result);
212 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
213 Assert.assertFalse(result.isSuccessful());
214 Assert.assertNull(result.getResult());
215 Assert.assertEquals(1, result.getErrors().size());
216 Assert.assertEquals(RpcError.ErrorSeverity.WARNING, ((RpcError)result.getErrors().toArray()[0]).getSeverity());
221 public void testInvokeRpcWithInvalidSimpleNode() throws Exception{
222 //Thread.sleep(1500);
224 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
225 Assert.assertNotNull(providerRef);
226 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
227 Assert.assertNotNull(provider);
228 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
229 Assert.assertNotNull(consumerRef);
230 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
231 Assert.assertNotNull(consumer);
233 // Provider sends announcement
234 _logger.debug("Provider sends announcement [{}]", QNAME.getLocalName());
235 provider.announce(QNAME);
236 // Consumer invokes RPC
237 _logger.debug("Invoking RPC [{}]", QNAME);
238 CompositeNode input = consumer.getInvalidCompositeNodeSimpleChild();
239 for (int i = 0; i < 3; i++) {
240 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
241 Assert.assertNotNull(result);
242 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
243 Assert.assertFalse(result.isSuccessful());
244 Assert.assertNull(result.getResult());
245 Assert.assertEquals(1, result.getErrors().size());
246 Assert.assertEquals(RpcError.ErrorSeverity.ERROR, ((RpcError)result.getErrors().toArray()[0]).getSeverity());
251 public void testInvokeRpcWithInvalidCompositeNode() throws Exception{
252 //Thread.sleep(1500);
254 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
255 Assert.assertNotNull(providerRef);
256 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
257 Assert.assertNotNull(provider);
258 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
259 Assert.assertNotNull(consumerRef);
260 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
261 Assert.assertNotNull(consumer);
263 // Provider sends announcement
264 _logger.debug("Provider sends announcement [{}]", QNAME.getLocalName());
265 provider.announce(QNAME);
266 // Consumer invokes RPC
267 _logger.debug("Invoking RPC [{}]", QNAME);
268 CompositeNode input = consumer.getInvalidCompositeNodeCompositeChild();
269 for (int i = 0; i < 3; i++) {
270 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
271 Assert.assertNotNull(result);
272 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
273 Assert.assertFalse(result.isSuccessful());
274 Assert.assertNull(result.getResult());
275 Assert.assertEquals(1, result.getErrors().size());
276 Assert.assertEquals(RpcError.ErrorSeverity.ERROR, ((RpcError)result.getErrors().toArray()[0]).getSeverity());
281 // This method is UNTESTED -- need to get around the bundling issues before I know if this even work
282 // public void testInvokeRpcWithValidCompositeNode() throws Exception{
283 // Thread.sleep(10000);
284 // //Send announcement
285 // ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
286 // Assert.assertNotNull(providerRef);
288 // ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
289 // Assert.assertNotNull(provider);
291 // ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
292 // Assert.assertNotNull(consumerRef);
294 // ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
295 // Assert.assertNotNull(consumer);
297 // _logger.debug("Provider sends announcement [{}]", "heartbeat");
298 // provider.announce(QNAME);
299 // ServiceReference routerRef = ctx.getServiceReference(Client.class);
300 // Client router = (Client) ctx.getService(routerRef);
301 // _logger.debug("Found router[{}]", router);
302 // _logger.debug("Invoking RPC [{}]", QNAME);
303 // for (int i = 0; i < 3; i++) {
304 // RpcResult<CompositeNode> result = router.getInstance().invokeRpc(QNAME, consumer.getValidCompositeNodeWithOneSimpleChild());
305 // _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
306 // Assert.assertNotNull(result);
310 private Message send(Message msg) throws IOException {
311 ZMQ.Socket reqSocket = zmqCtx.socket(ZMQ.REQ);
312 reqSocket.connect("tcp://localhost:5555");
313 reqSocket.send(Message.serialize(msg));
314 Message response = parseMessage(reqSocket);
323 private Message parseMessage(ZMQ.Socket socket) {
327 byte[] bytes = socket.recv();
328 _logger.debug("Received bytes:[{}]", bytes.length);
329 msg = (Message) Message.deserialize(bytes);
330 } catch (Throwable t) {
337 private void printState(){
338 Bundle[] b = ctx.getBundles();
339 _logger.debug("\n\nNumber of bundles [{}]\n\n]", b.length);
340 for (int i=0;i<b.length;i++){
341 _logger.debug("Bundle States {}-{} ",b[i].getSymbolicName(), stateToString(b[i].getState()));
343 if ( Bundle.INSTALLED == b[i].getState() || (Bundle.RESOLVED == b[i].getState())){
346 } catch (BundleException e) {
353 private String stateToString(int state) {
357 case Bundle.INSTALLED:
359 case Bundle.RESOLVED:
361 case Bundle.UNINSTALLED:
362 return "UNINSTALLED";
364 return "Not CONVERTED";
369 public Option[] config() {
370 return options(systemProperty("osgi.console").value("2401"),
371 systemProperty("rpc.port").value("5555"),
372 mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(), //
373 mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(), //
374 mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), //
375 mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(), //
377 //mavenBundle(ODL, "sal-binding-broker-impl").versionAsInProject().update(), //
378 mavenBundle(ODL, "sal-common").versionAsInProject(), //
379 mavenBundle(ODL, "sal-common-api").versionAsInProject(),//
380 mavenBundle(ODL, "sal-common-impl").versionAsInProject(), //
381 mavenBundle(ODL, "sal-common-util").versionAsInProject(), //
382 mavenBundle(ODL, "sal-core-api").versionAsInProject().update(), //
383 mavenBundle(ODL, "sal-broker-impl").versionAsInProject(), //
384 mavenBundle(ODL, "sal-core-spi").versionAsInProject().update(), //
385 mavenBundle(ODL, "sal-connector-api").versionAsInProject(), //
389 bindingAwareSalBundles(),
390 TestHelper.bindingIndependentSalBundles(),
391 TestHelper.configMinumumBundles(),
392 TestHelper.mdSalCoreBundles(),
395 mavenBundle(SAMPLE, "sal-remoterpc-connector-test-consumer").versionAsInProject(), //
396 //**** These two bundles below are NOT successfully resolved -- some of their dependencies must be missing
397 //**** This causes the "Message" error to occur, the class cannot be found
398 mavenBundle(SAMPLE, "sal-remoterpc-connector-test-provider").versionAsInProject(), //
399 mavenBundle(ODL, "sal-remoterpc-connector").versionAsInProject(), //
401 mavenBundle(ODL, "zeromq-routingtable.implementation").versionAsInProject(),
402 mavenBundle(YANG, "concepts").versionAsInProject(),
403 mavenBundle(YANG, "yang-binding").versionAsInProject(), //
404 mavenBundle(YANG, "yang-common").versionAsInProject(), //
405 mavenBundle(YANG, "yang-data-api").versionAsInProject(), //
406 mavenBundle(YANG, "yang-data-impl").versionAsInProject(), //
407 mavenBundle(YANG, "yang-model-api").versionAsInProject(), //
408 mavenBundle(YANG, "yang-parser-api").versionAsInProject(), //
409 mavenBundle(YANG, "yang-parser-impl").versionAsInProject(), //
410 mavenBundle(YANG, "yang-model-util").versionAsInProject(), //
411 mavenBundle(YANG + ".thirdparty", "xtend-lib-osgi").versionAsInProject(), //
412 mavenBundle(YANG + ".thirdparty", "antlr4-runtime-osgi-nohead").versionAsInProject(), //
413 mavenBundle("com.google.guava", "guava").versionAsInProject(), //
414 mavenBundle("org.zeromq", "jeromq").versionAsInProject(),
415 mavenBundle("org.codehaus.jackson", "jackson-mapper-asl").versionAsInProject(),
416 mavenBundle("org.codehaus.jackson", "jackson-core-asl").versionAsInProject(),
417 //routingtable dependencies
418 systemPackages("sun.reflect", "sun.reflect.misc", "sun.misc"),
419 // List framework bundles
420 mavenBundle("equinoxSDK381", "org.eclipse.equinox.console").versionAsInProject(),
421 mavenBundle("equinoxSDK381", "org.eclipse.equinox.util").versionAsInProject(),
422 mavenBundle("equinoxSDK381", "org.eclipse.osgi.services").versionAsInProject(),
423 mavenBundle("equinoxSDK381", "org.eclipse.equinox.ds").versionAsInProject(),
424 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.command").versionAsInProject(),
425 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.runtime").versionAsInProject(),
426 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell").versionAsInProject(),
427 // List logger bundles
429 mavenBundle("org.opendaylight.controller", "clustering.services")
430 .versionAsInProject(),
431 mavenBundle("org.opendaylight.controller", "clustering.stub")
432 .versionAsInProject(),
435 // List all the bundles on which the test case depends
436 mavenBundle("org.opendaylight.controller", "sal")
437 .versionAsInProject(),
438 mavenBundle("org.opendaylight.controller", "sal.implementation")
439 .versionAsInProject(),
440 mavenBundle("org.jboss.spec.javax.transaction",
441 "jboss-transaction-api_1.1_spec").versionAsInProject(),
442 mavenBundle("org.apache.commons", "commons-lang3")
443 .versionAsInProject(),
444 mavenBundle("org.apache.felix",
445 "org.apache.felix.dependencymanager")
446 .versionAsInProject(),