Fixed some major sonar issues in yang-validation-tool
[yangtools.git] / restconf / restconf-util / src / test / java / org / opendaylight / yangtools / restconf / utils / BindingStreamWriterTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.restconf.utils;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13
14 import com.google.common.base.Optional;
15 import com.google.common.collect.ImmutableList;
16 import java.util.Map.Entry;
17 import javassist.ClassPool;
18 import org.junit.Before;
19 import org.junit.Ignore;
20 import org.junit.Test;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.unix.rev131222.network.topology.topology.node.path.computation.client.reported.lsp.lsp.tlvs.vs.tlv.vendor.payload.unix.UnixSubTlvs;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.unix.rev131222.network.topology.topology.node.path.computation.client.reported.lsp.lsp.tlvs.vs.tlv.vendor.payload.unix.UnixSubTlvsBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.ReportedLsp1;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.ReportedLsp1Builder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.Tlvs;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.network.topology.topology.node.path.computation.client.reported.lsp.lsp.tlvs.vs.tlv.vendor.payload.LinuxBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.network.topology.topology.node.path.computation.client.reported.lsp.lsp.tlvs.vs.tlv.vendor.payload.linux.LinuxSubTlvsBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vs.tlv.VsTlv;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vs.tlv.VsTlvBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.Node1;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.PathComputationClient;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.PathComputationClientBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLsp;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLspBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLspKey;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
46 import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
47 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
48 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
49 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
50 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
51 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
52 import org.opendaylight.yangtools.yang.binding.DataObject;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
55 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
56 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
57 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
58 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
59
60 public class BindingStreamWriterTest {
61
62     private static final InstanceIdentifier<PathComputationClient> PATH_TO_CLIENT = InstanceIdentifier
63             .builder(NetworkTopology.class).child(Topology.class, new TopologyKey(new TopologyId("foo"))).child(Node.class,new NodeKey(new NodeId("test"))).augmentation(Node1.class)
64             .child(PathComputationClient.class).build();
65
66
67     private static final InstanceIdentifier<Tlvs> PATH_TO_TLVS = PATH_TO_CLIENT.child(ReportedLsp.class, new ReportedLspKey("test")).augmentation(ReportedLsp1.class).child(Lsp.class).child(Tlvs.class);
68     private static final InstanceIdentifier<UnixSubTlvs> PATH_TO_UNIX = PATH_TO_TLVS.child(VsTlv.class).child(UnixSubTlvs.class);
69
70     private static final ReportedLspKey LSP1_KEY = new ReportedLspKey("one");
71     private static final ReportedLspKey LSP2_KEY = new ReportedLspKey("two");
72
73
74     private Optional<SchemaContext> schemaContext;
75     private DataObjectSerializerGenerator generator;
76     private BindingNormalizedNodeCodecRegistry registry;
77     private BindingRuntimeContext runtimeContext;
78
79     @Before
80     public void setup() {
81         final ModuleInfoBackedContext moduleInfo = ModuleInfoBackedContext.create();
82         moduleInfo.addModuleInfos(BindingReflections.loadModuleInfos());
83         schemaContext = moduleInfo.tryToCreateSchemaContext();
84         JavassistUtils utils = JavassistUtils.forClassPool(ClassPool.getDefault());
85         generator = StreamWriterGenerator.create(utils);
86         registry = new BindingNormalizedNodeCodecRegistry(generator);
87         runtimeContext = BindingRuntimeContext.create(moduleInfo, schemaContext.get());
88         registry.onBindingRuntimeContextUpdated(runtimeContext);
89     }
90
91
92
93     @Test
94     public void writeWithStreamAndBack() {
95         Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> result = registry.toNormalizedNode(PATH_TO_CLIENT, createTestData());
96         NormalizedNode<?, ?> output = result.getValue();
97         assertNotNull(output);
98         assertTrue(output instanceof ContainerNode);
99         Entry<InstanceIdentifier<?>, DataObject> deserialized = registry.fromNormalizedNode(result.getKey(), result.getValue());
100         assertEquals(PATH_TO_CLIENT, deserialized.getKey());
101         Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> resultAfterDeserialize = registry.toNormalizedNode((InstanceIdentifier) PATH_TO_CLIENT, deserialized.getValue());
102         assertEquals(result.getValue(), resultAfterDeserialize.getValue());
103
104     }
105
106
107     @Test
108     public void writeWithStreamAPI() {
109         Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> result = registry.toNormalizedNode(PATH_TO_CLIENT, createTestData());
110         NormalizedNode<?, ?> output = result.getValue();
111         assertNotNull(output);
112         assertTrue(output instanceof ContainerNode);
113
114         Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> unixResult = registry.toNormalizedNode(PATH_TO_UNIX, new UnixSubTlvsBuilder().setUnixValue((short) 10).build());
115         assertNotNull(unixResult);
116     }
117
118     @Test
119     public void testInstanceIdentifier() {
120         YangInstanceIdentifier yang = registry.toYangInstanceIdentifier(PATH_TO_UNIX);
121         assertNotNull(yang);
122         InstanceIdentifier<?> binding = registry.fromYangInstanceIdentifier(yang);
123         assertEquals(PATH_TO_UNIX,binding);
124     }
125
126     @Test
127     @Ignore
128     public void testPerformance() {
129         for (int i = 1; i < 5; i++) {
130             int repetitions = (int) Math.pow(10, i);
131             measure("streamAPI: " + repetitions, repetitions, new Runnable() {
132                 @Override
133                 public void run() {
134                     writeWithStreamAPI();
135                 }
136             });
137         }
138     }
139
140     private void measure(final String name, final int repetitions, final Runnable runnable) {
141         runnable.run(); // WARM UP
142         long start = System.nanoTime();
143         // TODO Auto-generated method stub
144         for (int i = 0; i < repetitions; i++) {
145             runnable.run();
146         }
147         long finish = System.nanoTime();
148         // To Miliseconds
149         System.out.println(String.format("Type: %s Time: %f", name, (finish - start) / 1000000.d));
150     }
151
152     PathComputationClient createTestData() {
153         return new PathComputationClientBuilder().setReportedLsp(
154                 ImmutableList.<ReportedLsp> builder().add(reportedLsp(LSP1_KEY)).add(reportedLsp(LSP2_KEY)).build())
155                 .build();
156     }
157
158     private ReportedLsp reportedLsp(final ReportedLspKey lspKey) {
159         return new ReportedLspBuilder()
160                 .setKey(lspKey)
161                 .addAugmentation(
162                         ReportedLsp1.class,
163                         new ReportedLsp1Builder().setLsp(
164                                 new LspBuilder().setTlvs(
165                                         new TlvsBuilder().setVsTlv(
166                                                 new VsTlvBuilder().setVendorPayload(
167                                                         new LinuxBuilder().setLinuxSubTlvs(
168                                                                 new LinuxSubTlvsBuilder().setLinuxValue((short) 50)
169                                                                         .build()).build()).build()).build()).build())
170                                 .build()).build();
171     }
172
173 }