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.Before;
13 import org.junit.Ignore;
14 import org.junit.Test;
15 import org.junit.runner.RunWith;
16 import org.opendaylight.controller.sal.connector.remoterpc.Client;
17 import org.opendaylight.controller.sal.connector.remoterpc.RemoteRpcClient;
18 import org.opendaylight.controller.sal.connector.remoterpc.RemoteRpcServer;
19 import org.opendaylight.controller.sal.connector.remoterpc.ServerImpl;
20 import org.opendaylight.controller.sal.connector.remoterpc.dto.Message;
21 import org.opendaylight.controller.sal.core.api.Broker;
22 import org.opendaylight.controller.sample.zeromq.provider.ExampleProvider;
23 import org.opendaylight.controller.sample.zeromq.consumer.ExampleConsumer;
24 import org.opendaylight.controller.test.sal.binding.it.TestHelper;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.common.RpcError;
27 import org.opendaylight.yangtools.yang.common.RpcResult;
28 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
29 import org.ops4j.pax.exam.Configuration;
30 import org.ops4j.pax.exam.Option;
31 import org.ops4j.pax.exam.junit.PaxExam;
32 import org.ops4j.pax.exam.util.Filter;
33 import org.osgi.framework.Bundle;
34 import org.osgi.framework.BundleException;
35 import org.osgi.framework.ServiceReference;
36 import org.osgi.framework.ServiceRegistration;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39 import org.zeromq.ZMQ;
41 import javax.inject.Inject;
43 import java.io.IOException;
45 import java.util.Hashtable;
47 import static org.opendaylight.controller.test.sal.binding.it.TestHelper.baseModelBundles;
48 import static org.opendaylight.controller.test.sal.binding.it.TestHelper.bindingAwareSalBundles;
49 import static org.opendaylight.controller.test.sal.binding.it.TestHelper.configMinumumBundles;
50 import static org.opendaylight.controller.test.sal.binding.it.TestHelper.mdSalCoreBundles;
51 import static org.ops4j.pax.exam.CoreOptions.*;
53 @RunWith(PaxExam.class)
54 public class RouterTest {
56 private Logger _logger = LoggerFactory.getLogger(RouterTest.class);
58 public static final String ODL = "org.opendaylight.controller";
59 public static final String YANG = "org.opendaylight.yangtools";
60 public static final String SAMPLE = "org.opendaylight.controller.tests";
61 private final URI namespace = URI.create("http://cisco.com/example");
62 private final QName QNAME = new QName(namespace, "heartbeat");
66 org.osgi.framework.BundleContext ctx;
69 @Filter(timeout=60*1000)
72 private ZMQ.Context zmqCtx = ZMQ.context(1);
73 //private Server router;
74 //private ExampleProvider provider;
77 public void testInvokeRpc() throws Exception{
80 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
81 Assert.assertNotNull(providerRef);
83 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
84 Assert.assertNotNull(provider);
86 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
87 Assert.assertNotNull(consumerRef);
88 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
89 Assert.assertNotNull(consumer);
92 _logger.debug("Provider sends announcement [{}]", "heartbeat");
93 provider.announce(QNAME);
94 ServiceReference routerRef = ctx.getServiceReference(Client.class);
95 Client router = (Client) ctx.getService(routerRef);
96 _logger.debug("Found router[{}]", router);
97 _logger.debug("Invoking RPC [{}]", QNAME);
98 for (int i = 0; i < 3; i++) {
99 RpcResult<CompositeNode> result = router.invokeRpc(QNAME, consumer.getValidCompositeNodeWithOneSimpleChild());
100 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
101 Assert.assertNotNull(result);
106 public void testInvokeRpcWithValidSimpleNode() throws Exception{
107 //Thread.sleep(1500);
109 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
110 Assert.assertNotNull(providerRef);
111 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
112 Assert.assertNotNull(provider);
113 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
114 Assert.assertNotNull(consumerRef);
115 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
116 Assert.assertNotNull(consumer);
118 // Provider sends announcement
119 _logger.debug("Provider sends announcement [{}]", "heartbeat");
120 provider.announce(QNAME);
121 // Consumer invokes RPC
122 _logger.debug("Invoking RPC [{}]", QNAME);
123 CompositeNode input = consumer.getValidCompositeNodeWithOneSimpleChild();
124 for (int i = 0; i < 3; i++) {
125 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
126 Assert.assertNotNull(result);
127 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
128 Assert.assertTrue(result.isSuccessful());
129 Assert.assertNotNull(result.getResult());
130 Assert.assertEquals(0, result.getErrors().size());
131 Assert.assertEquals(input.getChildren().size()+1, result.getResult().getChildren().size());
136 public void testInvokeRpcWithValidSimpleNodes() throws Exception{
137 //Thread.sleep(1500);
139 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
140 Assert.assertNotNull(providerRef);
141 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
142 Assert.assertNotNull(provider);
143 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
144 Assert.assertNotNull(consumerRef);
145 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
146 Assert.assertNotNull(consumer);
148 // Provider sends announcement
149 _logger.debug("Provider sends announcement [{}]", "heartbeat");
150 provider.announce(QNAME);
151 // Consumer invokes RPC
152 _logger.debug("Invoking RPC [{}]", QNAME);
153 CompositeNode input = consumer.getValidCompositeNodeWithFourSimpleChildren();
154 for (int i = 0; i < 3; i++) {
155 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
156 Assert.assertNotNull(result);
157 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
158 Assert.assertTrue(result.isSuccessful());
159 Assert.assertNotNull(result.getResult());
160 Assert.assertEquals(0, result.getErrors().size());
161 Assert.assertEquals(input.getChildren().size()+1, result.getResult().getChildren().size());
166 public void testInvokeRpcWithValidCompositeNode() throws Exception{
167 //Thread.sleep(1500);
169 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
170 Assert.assertNotNull(providerRef);
171 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
172 Assert.assertNotNull(provider);
173 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
174 Assert.assertNotNull(consumerRef);
175 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
176 Assert.assertNotNull(consumer);
178 // Provider sends announcement
179 _logger.debug("Provider sends announcement [{}]", "heartbeat");
180 provider.announce(QNAME);
181 // Consumer invokes RPC
182 _logger.debug("Invoking RPC [{}]", QNAME);
183 CompositeNode input = consumer.getValidCompositeNodeWithTwoCompositeChildren();
184 for (int i = 0; i < 3; i++) {
185 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
186 Assert.assertNotNull(result);
187 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
188 Assert.assertTrue(result.isSuccessful());
189 Assert.assertNotNull(result.getResult());
190 Assert.assertEquals(0, result.getErrors().size());
191 Assert.assertEquals(input.getChildren().size()+1, result.getResult().getChildren().size());
196 public void testInvokeRpcWithNullInput() throws Exception{
197 //Thread.sleep(1500);
199 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
200 Assert.assertNotNull(providerRef);
201 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
202 Assert.assertNotNull(provider);
203 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
204 Assert.assertNotNull(consumerRef);
205 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
206 Assert.assertNotNull(consumer);
208 // Provider sends announcement
209 _logger.debug("Provider sends announcement [{}]", QNAME.getLocalName());
210 provider.announce(QNAME);
211 // Consumer invokes RPC
212 _logger.debug("Invoking RPC [{}]", QNAME);
213 for (int i = 0; i < 3; i++) {
214 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, null);
215 Assert.assertNotNull(result);
216 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
217 Assert.assertFalse(result.isSuccessful());
218 Assert.assertNull(result.getResult());
219 Assert.assertEquals(1, result.getErrors().size());
220 Assert.assertEquals(RpcError.ErrorSeverity.WARNING, ((RpcError)result.getErrors().toArray()[0]).getSeverity());
225 public void testInvokeRpcWithInvalidSimpleNode() throws Exception{
226 //Thread.sleep(1500);
228 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
229 Assert.assertNotNull(providerRef);
230 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
231 Assert.assertNotNull(provider);
232 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
233 Assert.assertNotNull(consumerRef);
234 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
235 Assert.assertNotNull(consumer);
237 // Provider sends announcement
238 _logger.debug("Provider sends announcement [{}]", QNAME.getLocalName());
239 provider.announce(QNAME);
240 // Consumer invokes RPC
241 _logger.debug("Invoking RPC [{}]", QNAME);
242 CompositeNode input = consumer.getInvalidCompositeNodeSimpleChild();
243 for (int i = 0; i < 3; i++) {
244 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
245 Assert.assertNotNull(result);
246 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
247 Assert.assertFalse(result.isSuccessful());
248 Assert.assertNull(result.getResult());
249 Assert.assertEquals(1, result.getErrors().size());
250 Assert.assertEquals(RpcError.ErrorSeverity.ERROR, ((RpcError)result.getErrors().toArray()[0]).getSeverity());
255 public void testInvokeRpcWithInvalidCompositeNode() throws Exception{
256 //Thread.sleep(1500);
258 ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
259 Assert.assertNotNull(providerRef);
260 ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
261 Assert.assertNotNull(provider);
262 ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
263 Assert.assertNotNull(consumerRef);
264 ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
265 Assert.assertNotNull(consumer);
267 // Provider sends announcement
268 _logger.debug("Provider sends announcement [{}]", QNAME.getLocalName());
269 provider.announce(QNAME);
270 // Consumer invokes RPC
271 _logger.debug("Invoking RPC [{}]", QNAME);
272 CompositeNode input = consumer.getInvalidCompositeNodeCompositeChild();
273 for (int i = 0; i < 3; i++) {
274 RpcResult<CompositeNode> result = consumer.invokeRpc(QNAME, input);
275 Assert.assertNotNull(result);
276 _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
277 Assert.assertFalse(result.isSuccessful());
278 Assert.assertNull(result.getResult());
279 Assert.assertEquals(1, result.getErrors().size());
280 Assert.assertEquals(RpcError.ErrorSeverity.ERROR, ((RpcError)result.getErrors().toArray()[0]).getSeverity());
285 // This method is UNTESTED -- need to get around the bundling issues before I know if this even work
286 // public void testInvokeRpcWithValidCompositeNode() throws Exception{
287 // Thread.sleep(10000);
288 // //Send announcement
289 // ServiceReference providerRef = ctx.getServiceReference(ExampleProvider.class);
290 // Assert.assertNotNull(providerRef);
292 // ExampleProvider provider = (ExampleProvider)ctx.getService(providerRef);
293 // Assert.assertNotNull(provider);
295 // ServiceReference consumerRef = ctx.getServiceReference(ExampleConsumer.class);
296 // Assert.assertNotNull(consumerRef);
298 // ExampleConsumer consumer = (ExampleConsumer)ctx.getService(consumerRef);
299 // Assert.assertNotNull(consumer);
301 // _logger.debug("Provider sends announcement [{}]", "heartbeat");
302 // provider.announce(QNAME);
303 // ServiceReference routerRef = ctx.getServiceReference(Client.class);
304 // Client router = (Client) ctx.getService(routerRef);
305 // _logger.debug("Found router[{}]", router);
306 // _logger.debug("Invoking RPC [{}]", QNAME);
307 // for (int i = 0; i < 3; i++) {
308 // RpcResult<CompositeNode> result = router.getInstance().invokeRpc(QNAME, consumer.getValidCompositeNodeWithOneSimpleChild());
309 // _logger.debug("{}-> Result is: Successful:[{}], Payload:[{}], Errors: [{}]", i, result.isSuccessful(), result.getResult(), result.getErrors());
310 // Assert.assertNotNull(result);
314 private Message send(Message msg) throws IOException {
315 ZMQ.Socket reqSocket = zmqCtx.socket(ZMQ.REQ);
316 reqSocket.connect("tcp://localhost:5555");
317 reqSocket.send(Message.serialize(msg));
318 Message response = parseMessage(reqSocket);
327 private Message parseMessage(ZMQ.Socket socket) {
331 byte[] bytes = socket.recv();
332 _logger.debug("Received bytes:[{}]", bytes.length);
333 msg = (Message) Message.deserialize(bytes);
334 } catch (Throwable t) {
341 private void printState(){
342 Bundle[] b = ctx.getBundles();
343 _logger.debug("\n\nNumber of bundles [{}]\n\n]", b.length);
344 for (int i=0;i<b.length;i++){
345 _logger.debug("Bundle States {}-{} ",b[i].getSymbolicName(), stateToString(b[i].getState()));
347 if ( Bundle.INSTALLED == b[i].getState() || (Bundle.RESOLVED == b[i].getState())){
350 } catch (BundleException e) {
356 private String stateToString(int state) {
360 case Bundle.INSTALLED:
362 case Bundle.RESOLVED:
364 case Bundle.UNINSTALLED:
365 return "UNINSTALLED";
367 return "Not CONVERTED";
372 public Option[] config() {
373 return options(systemProperty("osgi.console").value("2401"),
374 systemProperty("rpc.port").value("5555"),
375 mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(), //
376 mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(), //
377 mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), //
378 mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(), //
380 //mavenBundle(ODL, "sal-binding-broker-impl").versionAsInProject().update(), //
381 mavenBundle(ODL, "sal-common").versionAsInProject(), //
382 mavenBundle(ODL, "sal-common-api").versionAsInProject(),//
383 mavenBundle(ODL, "sal-common-impl").versionAsInProject(), //
384 mavenBundle(ODL, "sal-common-util").versionAsInProject(), //
385 mavenBundle(ODL, "sal-core-api").versionAsInProject().update(), //
386 mavenBundle(ODL, "sal-broker-impl").versionAsInProject(), //
387 mavenBundle(ODL, "sal-core-spi").versionAsInProject().update(), //
388 mavenBundle(ODL, "sal-connector-api").versionAsInProject(), //
393 bindingAwareSalBundles(),
394 TestHelper.bindingIndependentSalBundles(),
395 TestHelper.configMinumumBundles(),
396 TestHelper.mdSalCoreBundles(),
399 mavenBundle(SAMPLE, "sal-remoterpc-connector-test-consumer").versionAsInProject(), //
400 //**** These two bundles below are NOT successfully resolved -- some of their dependencies must be missing
401 //**** This causes the "Message" error to occur, the class cannot be found
402 mavenBundle(SAMPLE, "sal-remoterpc-connector-test-provider").versionAsInProject(), //
403 mavenBundle(ODL, "sal-remoterpc-connector").versionAsInProject(), //
405 mavenBundle(ODL, "zeromq-routingtable.implementation").versionAsInProject(),
406 mavenBundle(YANG, "concepts").versionAsInProject(),
407 mavenBundle(YANG, "yang-binding").versionAsInProject(), //
408 mavenBundle(YANG, "yang-common").versionAsInProject(), //
409 mavenBundle(YANG, "yang-data-api").versionAsInProject(), //
410 mavenBundle(YANG, "yang-data-impl").versionAsInProject(), //
411 mavenBundle(YANG, "yang-model-api").versionAsInProject(), //
412 mavenBundle(YANG, "yang-parser-api").versionAsInProject(), //
413 mavenBundle(YANG, "yang-parser-impl").versionAsInProject(), //
414 mavenBundle(YANG, "yang-model-util").versionAsInProject(), //
415 mavenBundle(YANG + ".thirdparty", "xtend-lib-osgi").versionAsInProject(), //
416 mavenBundle(YANG + ".thirdparty", "antlr4-runtime-osgi-nohead").versionAsInProject(), //
417 mavenBundle("com.google.guava", "guava").versionAsInProject(), //
418 mavenBundle("org.zeromq", "jeromq").versionAsInProject(),
419 mavenBundle("com.fasterxml.jackson.core", "jackson-annotations").versionAsInProject(),
420 mavenBundle("com.fasterxml.jackson.core", "jackson-core").versionAsInProject(),
421 mavenBundle("com.fasterxml.jackson.core", "jackson-databind").versionAsInProject(),
422 //routingtable dependencies
423 systemPackages("sun.reflect", "sun.reflect.misc", "sun.misc"),
424 // List framework bundles
425 mavenBundle("equinoxSDK381", "org.eclipse.equinox.console").versionAsInProject(),
426 mavenBundle("equinoxSDK381", "org.eclipse.equinox.util").versionAsInProject(),
427 mavenBundle("equinoxSDK381", "org.eclipse.osgi.services").versionAsInProject(),
428 mavenBundle("equinoxSDK381", "org.eclipse.equinox.ds").versionAsInProject(),
429 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.command").versionAsInProject(),
430 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.runtime").versionAsInProject(),
431 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell").versionAsInProject(),
432 // List logger bundles
434 mavenBundle("org.opendaylight.controller", "clustering.services")
435 .versionAsInProject(),
436 mavenBundle("org.opendaylight.controller", "clustering.stub")
437 .versionAsInProject(),
440 // List all the bundles on which the test case depends
441 mavenBundle("org.opendaylight.controller", "sal")
442 .versionAsInProject(),
443 mavenBundle("org.opendaylight.controller", "sal.implementation")
444 .versionAsInProject(),
445 mavenBundle("org.jboss.spec.javax.transaction",
446 "jboss-transaction-api_1.1_spec").versionAsInProject(),
447 mavenBundle("org.apache.commons", "commons-lang3")
448 .versionAsInProject(),
449 mavenBundle("org.apache.felix",
450 "org.apache.felix.dependencymanager")
451 .versionAsInProject(),