1 package org.opendaylight.controller.sal.binding.test;
2 import static org.junit.Assert.*;
4 import java.util.Arrays;
5 import java.util.HashMap;
8 import javassist.ClassPool;
10 import org.junit.Before;
11 import org.junit.Test;
12 import static org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper.*;
13 import org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator;
14 import org.opendaylight.controller.sal.binding.test.mock.FooService;
15 import org.opendaylight.controller.sal.binding.test.mock.ReferencableObject;
16 import org.opendaylight.controller.sal.binding.test.mock.ReferencableObjectKey;
17 import org.opendaylight.controller.sal.binding.test.mock.SimpleInput;
18 import org.opendaylight.yangtools.yang.binding.Augmentation;
19 import org.opendaylight.yangtools.yang.binding.BaseIdentity;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
21 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
22 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
24 import static org.mockito.Mockito.*;
27 public class RuntimeCodeGeneratorTest {
29 private RuntimeCodeGenerator codeGenerator;
33 public void initialize() {
34 this.codeGenerator = new RuntimeCodeGenerator(ClassPool.getDefault());
38 public void testGenerateDirectProxy() {
39 Class<? extends FooService> product = codeGenerator.generateDirectProxy(FooService.class);
40 assertNotNull(product);
44 public void testGenerateRouter() throws Exception {
45 Class<? extends FooService> product = codeGenerator.generateRouter(FooService.class);
46 assertNotNull(product);
47 assertNotNull(product.getSimpleName());
48 assertEquals("2 fields should be generated.",2,product.getFields().length);
50 verifyRouting(product.newInstance());
53 private void verifyRouting(FooService product) {
54 Map<InstanceIdentifier,FooService> routingTable = new HashMap<>();
55 setRoutingTable(product, BaseIdentity.class, routingTable);
57 assertSame("Returned routing table should be same instance",routingTable,getRoutingTable(product, BaseIdentity.class));
59 int servicesCount = 2;
60 int instancesPerService = 3;
62 InstanceIdentifier[][] identifiers = identifiers(servicesCount,instancesPerService);
63 FooService service[] = new FooService[] {
64 mock(FooService.class, "Instance 0"),
65 mock(FooService.class,"Instance 1")
68 for(int i = 0;i<service.length;i++) {
69 for (InstanceIdentifier instance : identifiers[i]) {
70 routingTable.put(instance, service[i]);
74 assertEquals("All instances should be registered.", servicesCount*instancesPerService, routingTable.size());
76 SimpleInput[] instance_0_input = new SimpleInputImpl[] {
77 new SimpleInputImpl(identifiers[0][0]),
78 new SimpleInputImpl(identifiers[0][1]),
79 new SimpleInputImpl(identifiers[0][2])
82 SimpleInput[] instance_1_input = new SimpleInputImpl[] {
83 new SimpleInputImpl(identifiers[1][0]),
84 new SimpleInputImpl(identifiers[1][1]),
85 new SimpleInputImpl(identifiers[1][2])
88 // We test sending mock messages
90 product.simple(instance_0_input[0]);
91 verify(service[0]).simple(instance_0_input[0]);
93 product.simple(instance_0_input[1]);
94 product.simple(instance_0_input[2]);
96 verify(service[0]).simple(instance_0_input[1]);
97 verify(service[0]).simple(instance_0_input[2]);
99 product.simple(instance_1_input[0]);
100 verify(service[1]).simple(instance_1_input[0]);
103 private InstanceIdentifier[][] identifiers(int serviceSize, int instancesPerService) {
104 InstanceIdentifier[][] ret = new InstanceIdentifier[serviceSize][];
106 for (int i = 0;i<serviceSize;i++) {
108 InstanceIdentifier[] instanceIdentifiers = new InstanceIdentifier[instancesPerService];
109 ret[i] = instanceIdentifiers;
110 for(int id = 0;id<instancesPerService;id++) {
111 instanceIdentifiers[id] = referencableIdentifier(service*instancesPerService+id);
119 private InstanceIdentifier referencableIdentifier(int i) {
120 ReferencableObjectKey key = new ReferencableObjectKey(i);
121 IdentifiableItem<ReferencableObject,ReferencableObjectKey> pathArg = new IdentifiableItem<>(ReferencableObject.class,key);
122 return new InstanceIdentifier(Arrays.<PathArgument>asList(pathArg), ReferencableObject.class);
125 private static class SimpleInputImpl implements SimpleInput {
126 private final InstanceIdentifier identifier;
128 public SimpleInputImpl(InstanceIdentifier _identifier) {
129 this.identifier = _identifier;
133 public <E extends Augmentation<SimpleInput>> E getAugmentation(Class<E> augmentationType) {
138 public InstanceIdentifier getIdentifier() {
139 return this.identifier;