Bug 7759 - TEST - Getter of BA object fails to construct class instance
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / BindingToNormalizedNodeCodecTest.java
1 /*
2  * Copyright (c) 2017 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.mdsal.binding.dom.adapter;
9
10 import java.io.File;
11 import java.io.FileNotFoundException;
12 import java.lang.reflect.Field;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Map.Entry;
16 import org.junit.Assert;
17 import org.junit.Test;
18 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
19 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
20 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
21 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
22 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
23 import org.opendaylight.yangtools.yang.binding.DataObject;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
29 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
31 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
32 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
35 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
36 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
37 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
38 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
39 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
40 import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
41 import javassist.ClassPool;
42
43 public class BindingToNormalizedNodeCodecTest {
44
45     @Test
46     public void fromNormalizedNodeTest() throws Exception {
47         final StreamWriterGenerator serializerGenerator =
48                 new StreamWriterGenerator(JavassistUtils.forClassPool(ClassPool.getDefault()));
49         final BindingNormalizedNodeCodecRegistry codecRegistry =
50                 new BindingNormalizedNodeCodecRegistry(serializerGenerator);
51         final GeneratedClassLoadingStrategy classLoadingStrategy =
52                 GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
53         final SchemaContext schemaCtx = loadSchemaContext("/");
54         final BindingRuntimeContext ctx = BindingRuntimeContext.create(classLoadingStrategy, schemaCtx);
55         codecRegistry.onBindingRuntimeContextUpdated(ctx);
56         final BindingToNormalizedNodeCodec codec =
57                 new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry);
58
59         final DataSchemaNode dataChildByName =
60                 schemaCtx.getDataChildByName(QName.create("urn:test", "2017-01-01", "cont"));
61         final DataSchemaNode leaf = ((ContainerSchemaNode) dataChildByName)
62                 .getDataChildByName(QName.create("urn:test", "2017-01-01", "vlan-id"));
63
64         final DataContainerChild<?, ?> child = Builders.leafBuilder((LeafSchemaNode) leaf).withValue(2420).build();
65         final ContainerNode data =
66                 Builders.containerBuilder((ContainerSchemaNode) dataChildByName).withChild(child).build();
67
68
69         final List<PathArgument> pathArgs = new ArrayList<>();
70         pathArgs.add(NodeIdentifier.create(QName.create("urn:test", "2017-01-01", "cont")));
71
72         final YangInstanceIdentifier path = YangInstanceIdentifier.create(pathArgs);
73         final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = codec.fromNormalizedNode(path, data);
74
75         final DataObject value = fromNormalizedNode.getValue();
76         Assert.assertNotNull(value);
77         Assert.assertEquals("Cont", value.getImplementedInterface().getSimpleName());
78         final Object objs[] = {};
79         final Object invoked = value.getImplementedInterface().getDeclaredMethods()[0].invoke(value, objs);
80         final Field declaredField = invoked.getClass().getDeclaredField("_id");
81         declaredField.setAccessible(true);
82         final Object id = declaredField.get(invoked);
83         final Field val = id.getClass().getDeclaredField("_value");
84         val.setAccessible(true);
85         Assert.assertEquals(2420, val.get(id));
86     }
87
88     public static SchemaContext loadSchemaContext(final String... yangPath)
89             throws FileNotFoundException, ReactorException {
90         final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
91
92         for (int i = 0; i < yangPath.length; i++) {
93             final String path = yangPath[i];
94             final String pathToFile = BindingToNormalizedNodeCodecTest.class.getResource(path).getPath();
95             final File testDir = new File(pathToFile);
96             final String[] fileList = testDir.list();
97             if (fileList == null) {
98                 throw new FileNotFoundException(pathToFile);
99             }
100             for (int j = 0; j < fileList.length; j++) {
101                 final String fileName = fileList[j];
102                 final File file = new File(testDir, fileName);
103                 if (file.isDirectory() == false) {
104                     reactor.addSource(new YangStatementSourceImpl(new NamedFileInputStream(file, file.getPath())));
105                 }
106             }
107         }
108         return reactor.buildEffective();
109     }
110 }