2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.restconf.utils;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
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;
60 public class BindingStreamWriterTest {
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();
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);
70 private static final ReportedLspKey LSP1_KEY = new ReportedLspKey("one");
71 private static final ReportedLspKey LSP2_KEY = new ReportedLspKey("two");
74 private Optional<SchemaContext> schemaContext;
75 private DataObjectSerializerGenerator generator;
76 private BindingNormalizedNodeCodecRegistry registry;
77 private BindingRuntimeContext runtimeContext;
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);
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());
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);
114 Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> unixResult = registry.toNormalizedNode(PATH_TO_UNIX, new UnixSubTlvsBuilder().setUnixValue((short) 10).build());
115 assertNotNull(unixResult);
119 public void testInstanceIdentifier() {
120 YangInstanceIdentifier yang = registry.toYangInstanceIdentifier(PATH_TO_UNIX);
122 InstanceIdentifier<?> binding = registry.fromYangInstanceIdentifier(yang);
123 assertEquals(PATH_TO_UNIX,binding);
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() {
134 writeWithStreamAPI();
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++) {
147 long finish = System.nanoTime();
149 System.out.println(String.format("Type: %s Time: %f", name, (finish - start) / 1000000.d));
152 PathComputationClient createTestData() {
153 return new PathComputationClientBuilder().setReportedLsp(
154 ImmutableList.<ReportedLsp> builder().add(reportedLsp(LSP1_KEY)).add(reportedLsp(LSP2_KEY)).build())
158 private ReportedLsp reportedLsp(final ReportedLspKey lspKey) {
159 return new ReportedLspBuilder()
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())