Added support for discovering YangModuleInfo via ServiceLoader.
[yangtools.git] / integration-test / yang-runtime-tests / src / test / java / org / opendaylight / yangtools / it / yang / runtime / tests / ModelDiscoveryTest.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.it.yang.runtime.tests;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14
15 import java.io.IOException;
16 import java.net.URL;
17 import java.util.Enumeration;
18 import java.util.Vector;
19
20 import org.junit.Test;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
22 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
23 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
24 import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
25 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
26 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28
29 import com.google.common.base.Optional;
30 import com.google.common.collect.ImmutableSet;
31
32 public class ModelDiscoveryTest {
33
34     public static final YangModuleInfo TOPOLOGY_OLD_MODULE = org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.$YangModuleInfoImpl
35             .getInstance();
36     public static final YangModuleInfo TOPOLOGY_NEW_MODULE = org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.$YangModuleInfoImpl
37             .getInstance();
38
39     public static final String METAINF_PATH = "META-INF/services/" + YangModelBindingProvider.class.getName();
40
41     @Test
42     public void discoveryUsing_BindingReflections_TCCL() {
43
44         ImmutableSet<YangModuleInfo> moduleInfoSet = BindingReflections.loadModuleInfos();
45         assertNotNull(moduleInfoSet);
46         assertFalse(moduleInfoSet.isEmpty());
47         assertTrue(moduleInfoSet.contains(TOPOLOGY_NEW_MODULE));
48     }
49
50     @Test
51     public void discoveryUsing_BindingReflections_classloader_partialServiceMetadata() throws Exception {
52
53         ClassLoader topologyModelClassLoader = new ClassLoader(Thread.currentThread().getContextClassLoader()) {
54
55             @Override
56             public Enumeration<URL> getResources(String name) throws IOException {
57                 if (METAINF_PATH.equals(name)) {
58                     Vector<URL> topologyUrlVector = new Vector<>();
59                     topologyUrlVector.add(TOPOLOGY_NEW_MODULE.getClass().getResource("/" + METAINF_PATH));
60                     return topologyUrlVector.elements();
61                 }
62                 return super.getResources(name);
63             }
64         };
65
66         ImmutableSet<YangModuleInfo> moduleInfoSet = BindingReflections.loadModuleInfos(topologyModelClassLoader);
67         assertNotNull(moduleInfoSet);
68         assertFalse(moduleInfoSet.isEmpty());
69         assertTrue(moduleInfoSet.contains(TOPOLOGY_NEW_MODULE));
70     }
71
72     @Test
73     public void moduleInfoBackedContextTCCL() throws Exception {
74
75         ModuleInfoBackedContext context = ModuleInfoBackedContext.create(GeneratedClassLoadingStrategy.getAlwaysFailClassLoadingStrategy());
76
77         ImmutableSet<YangModuleInfo> moduleInfoSet = BindingReflections.loadModuleInfos();
78
79         context.addModuleInfos(moduleInfoSet);
80         assertNotNull(moduleInfoSet);
81         assertFalse(moduleInfoSet.isEmpty());
82         assertTrue(moduleInfoSet.contains(TOPOLOGY_NEW_MODULE));
83
84         Class<?> linkClass = context.loadClass(Link.class.getName());
85         assertNotNull(linkClass);
86         assertEquals(Link.class, linkClass);
87         Optional<SchemaContext> schemaContext = context.tryToCreateSchemaContext();
88         assertNotNull(schemaContext);
89         assertNotNull(schemaContext.get());
90     }
91
92 }