2 * Copyright (c) 2015 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.html
9 package org.opendaylight.yangtools.yang.model.util;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
16 import com.google.common.collect.Sets;
18 import java.net.URISyntaxException;
19 import java.text.ParseException;
20 import java.util.Arrays;
21 import java.util.Date;
22 import java.util.HashSet;
24 import org.junit.BeforeClass;
25 import org.junit.Test;
26 import org.opendaylight.yangtools.yang.common.QNameModule;
27 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
28 import org.opendaylight.yangtools.yang.model.api.Module;
29 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
30 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
31 import org.opendaylight.yangtools.yang.model.util.FilteringSchemaContextProxy.ModuleId;
33 public class SchemaContextProxyTest {
35 private static URI namespace;
36 private static Date revision;
37 private static Date revision2;
39 private static final String CONFIG_NAME = "config";
40 private static final String ROOT_NAME = "root";
41 private static final String MODULE2_NAME = "module2";
42 private static final String MODULE3_NAME = "module3";
43 private static final String MODULE4_NAME = "module4";
44 private static final String MODULE41_NAME = "module41";
45 private static final String MODULE5_NAME = "module5";
46 private static final String TEST_SOURCE = "test source";
49 public static void setUp() throws ParseException, URISyntaxException {
51 namespace = new URI("urn:opendaylight:params:xml:ns:yang:controller:config");
53 revision = SimpleDateFormatUtil.getRevisionFormat().parse("2015-01-01");
54 revision2 = SimpleDateFormatUtil.getRevisionFormat().parse("2015-01-15");
57 private SchemaContext mockSchema(Module... module) {
59 SchemaContext mock = mock(SchemaContext.class);
60 doReturn(Sets.newHashSet(module)).when(mock).getModules();
73 public void testBasic() {
74 Module moduleConfig = mockModule(CONFIG_NAME);
75 Module module2 = mockModule(MODULE2_NAME);
76 Module module3 = mockModule(MODULE3_NAME);
78 mockModuleImport(module2, moduleConfig);
79 mockModuleImport(module3, module2, moduleConfig);
81 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
83 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
84 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
89 * No root or additional modules
96 public void testNull() {
97 Module moduleConfig = mockModule(CONFIG_NAME);
98 Module module2 = mockModule(MODULE2_NAME);
99 Module module3 = mockModule(MODULE3_NAME);
101 mockModuleImport(module2, moduleConfig);
102 mockModuleImport(module3, module2, moduleConfig);
104 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
106 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, null);
107 assertProxyContext(filteringSchemaContextProxy, null);
119 public void testConfigDifferentRevisions() {
120 Module moduleConfigNullRevision = mockModule(CONFIG_NAME, null);
121 Module moduleConfig = mockModule(CONFIG_NAME, revision);
122 Module moduleConfig2 = mockModule(CONFIG_NAME, revision2);
123 Module module2 = mockModule(MODULE2_NAME);
124 Module module3 = mockModule(MODULE3_NAME);
126 mockModuleImport(module2, moduleConfig);
127 mockModuleImport(module3, module2, moduleConfigNullRevision);
129 SchemaContext schemaContext = mockSchema(moduleConfig, moduleConfig2, module2, module3);
131 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
132 assertProxyContext(filteringSchemaContextProxy, moduleConfig, moduleConfig2, module2, module3);
144 public void testBasicNullRevision() throws Exception {
145 Module moduleConfig = mockModule(CONFIG_NAME,SimpleDateFormatUtil.getRevisionFormat().parse("2013-04-05"));
146 Module module2 = mockModule(MODULE2_NAME, SimpleDateFormatUtil.getRevisionFormat().parse("2014-06-17"));
147 Module module20 = mockModule(MODULE2_NAME, null);
148 Module module3 = mockModule(MODULE3_NAME, SimpleDateFormatUtil.getRevisionFormat().parse("2014-06-12"));
149 Module module30 = mockModule(MODULE3_NAME, null);
151 mockModuleImport(module20, moduleConfig);
152 mockModuleImport(module2, moduleConfig);
153 mockModuleImport(module3, module20, moduleConfig);
154 mockModuleImport(module30, module20, moduleConfig);
156 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
158 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
160 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
172 public void testBasicMoreRootModules() {
173 Module moduleConfig = mockModule(CONFIG_NAME);
174 Module moduleRoot = mockModule(ROOT_NAME);
175 Module module2 = mockModule(MODULE2_NAME);
176 Module module3 = mockModule(MODULE3_NAME);
178 mockModuleImport(module2, moduleConfig);
179 mockModuleImport(module3, moduleRoot);
181 SchemaContext schemaContext = mockSchema(moduleConfig, moduleRoot, module2, module3);
183 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleRoot, moduleConfig);
184 assertProxyContext(filteringSchemaContextProxy, moduleRoot, module3, moduleConfig, module2);
196 public void testChainNotDepend() {
197 Module moduleConfig = mockModule(CONFIG_NAME);
198 Module module2 = mockModule(MODULE2_NAME);
199 Module module3 = mockModule(MODULE3_NAME);
201 mockModuleImport(module2, moduleConfig);
202 mockModuleImport(module3, module2);
204 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
206 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
207 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2);
215 * M2 -> M3 -> M4 -> M5
219 public void testChainDependMulti() {
220 Module moduleConfig = mockModule(CONFIG_NAME);
221 Module module2 = mockModule(MODULE2_NAME);
222 Module module3 = mockModule(MODULE3_NAME);
223 Module module4 = mockModule(MODULE4_NAME);
224 Module module5 = mockModule(MODULE5_NAME);
226 mockModuleImport(module2, moduleConfig, module3);
227 mockModuleImport(module3, module4);
228 mockModuleImport(module4, module5);
230 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
232 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
233 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
245 public void testChainNotDependMulti() {
246 Module moduleConfig = mockModule(CONFIG_NAME);
247 Module module2 = mockModule(MODULE2_NAME);
248 Module module3 = mockModule(MODULE3_NAME);
249 Module module4 = mockModule(MODULE4_NAME);
251 mockModuleImport(module2, moduleConfig, module3);
252 mockModuleImport(module4, module3);
254 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
256 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
257 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
269 public void testChainNotMulti() {
270 Module moduleConfig = mockModule(CONFIG_NAME);
271 Module module2 = mockModule(MODULE2_NAME);
272 Module module3 = mockModule(MODULE3_NAME);
273 Module module4 = mockModule(MODULE4_NAME);
274 Module module5 = mockModule(MODULE5_NAME);
276 mockModuleImport(module2, moduleConfig);
277 mockModuleImport(module3, moduleConfig);
278 mockModuleImport(module4, moduleConfig);
279 mockModuleImport(module5, moduleConfig);
281 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
283 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
284 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
292 * M2 <- M3 M4=M3(Different revision)
296 public void testBasicRevisionChange() throws Exception {
297 Module moduleConfig = mockModule(CONFIG_NAME);
298 Module module2 = mockModule(MODULE2_NAME);
299 Module module3 = mockModule(MODULE3_NAME);
301 Date dat = SimpleDateFormatUtil.getRevisionFormat().parse("2015-10-10");
302 Module module4 = mockModule(MODULE3_NAME, dat);
304 mockModuleImport(module2, moduleConfig);
305 mockModuleImport(module3, module2, moduleConfig);
307 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
309 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
310 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
317 * M2 -(no revision)-> M3(R2) ... M3(R1)
321 public void testImportNoRevision() throws Exception {
322 Module moduleConfig = mockModule(CONFIG_NAME, revision);
323 Module module2 = mockModule(MODULE2_NAME, revision);
325 Module module3 = mockModule(MODULE3_NAME, null);
326 Module module30 = mockModule(MODULE3_NAME, revision);
327 Module module31 = mockModule(MODULE3_NAME, revision2);
328 mockModuleImport(module2, moduleConfig, module3);
330 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module30, module31);
332 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
334 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module31);
348 public void testBasicSubmodule() throws Exception {
349 Module moduleConfig = mockModule(CONFIG_NAME);
350 Module module2 = mockModule(MODULE2_NAME);
351 Module module3 = mockModule(MODULE3_NAME);
352 Module module4 = mockModule(MODULE4_NAME);
353 Module module41 = mockModule(MODULE41_NAME);
355 mockSubmodules(module4, module41);
356 mockModuleImport(module2, moduleConfig, module3);
357 mockModuleImport(module41, moduleConfig);
359 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
361 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
362 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
368 * M2 -> M3 -> M4 -> M5
373 public void testChainAdditionalModules() {
374 Module module2 = mockModule(MODULE2_NAME);
375 Module module3 = mockModule(MODULE3_NAME);
376 Module module4 = mockModule(MODULE4_NAME);
377 Module module5 = mockModule(MODULE5_NAME);
379 mockModuleImport(module2, module3);
380 mockModuleImport(module3, module4);
381 mockModuleImport(module4, module5);
383 SchemaContext schemaContext = mockSchema(module2, module3, module4, module5);
385 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Sets.newHashSet(module2), null);
386 assertProxyContext(filteringSchemaContextProxy, module2, module3, module4, module5);
402 public void testChainAdditionalModulesConfig() {
403 Module moduleConfig = mockModule(CONFIG_NAME);
404 Module module2 = mockModule(MODULE2_NAME);
406 Module module3 = mockModule(MODULE3_NAME);
407 Module module4 = mockModule(MODULE4_NAME);
408 Module module5 = mockModule(MODULE5_NAME);
410 mockModuleImport(module2, moduleConfig);
411 mockModuleImport(module3, module4);
413 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
415 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Sets.newHashSet(module3), moduleConfig);
416 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
419 private void assertProxyContext(FilteringSchemaContextProxy filteringSchemaContextProxy, Module... expected) {
421 Set<Module> modSet = Sets.newHashSet();
425 modSet = Sets.newHashSet(expected);
428 Set<Module> modSetFiltering = filteringSchemaContextProxy.getModules();
430 assertEquals(modSet, modSetFiltering);
432 //asserting collections
434 for (final Module module : expected) {
435 assertEquals(module, filteringSchemaContextProxy.findModuleByName(module.getName(), module.getRevision()));
437 Set<Module> mod = filteringSchemaContextProxy.findModuleByNamespace(module.getNamespace());
438 assertTrue(mod.contains(module));
440 assertEquals(module, filteringSchemaContextProxy.findModuleByNamespaceAndRevision(module.getNamespace(), module.getRevision()));
442 assertEquals(module.getSource(), filteringSchemaContextProxy.getModuleSource(module).get());
447 private FilteringSchemaContextProxy createProxySchemaCtx(SchemaContext schemaContext, Set<Module> additionalModules, Module... modules) {
449 Set<Module> modulesSet = new HashSet();
453 modulesSet = Sets.newHashSet(modules);
457 return new FilteringSchemaContextProxy(schemaContext, createModuleIds(modulesSet) , createModuleIds(additionalModules));
460 private Set<ModuleId> createModuleIds(Set<Module> modules) {
462 Set<ModuleId> moduleIds = Sets.newHashSet();
464 if(modules!=null && modules.size()>0) {
466 for (Module module : modules) {
468 moduleIds.add(new ModuleId(module.getName(), module.getRevision()));
475 private void mockSubmodules(Module mainModule, Module... submodules){
477 Set<Module> submodulesSet = new HashSet<>();
478 submodulesSet.addAll(Arrays.asList(submodules));
480 doReturn(submodulesSet).when(mainModule).getSubmodules();
483 private void mockModuleImport(Module importer, Module... imports) {
484 Set<ModuleImport> mockedImports = Sets.newHashSet();
485 for (final Module module : imports) {
486 mockedImports.add(new ModuleImport() {
488 public String getModuleName() {
489 return module.getName();
493 public Date getRevision() {
494 return module.getRevision();
498 public String getPrefix() {
499 return module.getName();
503 public String toString() {
505 return String.format("Module: %s, revision:%s", module.getName(), module.getRevision());
509 doReturn(mockedImports).when(importer).getImports();
512 //mock module with revision
513 private Module mockModule(String name, final Date rev){
515 final Module mod = mockModule(name);
517 doReturn(QNameModule.create(mod.getNamespace(), rev)).when(mod).getQNameModule();
518 doReturn(rev).when(mod).getRevision();
519 doReturn(mod.getQNameModule().toString()).when(mod).toString();
524 //mock module with default revision
525 private Module mockModule(String mName) {
527 Module mockedModule = mock(Module.class);
528 doReturn(mName).when(mockedModule).getName();
529 doReturn(revision).when(mockedModule).getRevision();
530 final URI newNamespace = URI.create(namespace.toString() + ":" + mName);
531 doReturn(newNamespace).when(mockedModule).getNamespace();
532 doReturn(QNameModule.create(newNamespace, revision)).when(mockedModule).getQNameModule();
533 doReturn(TEST_SOURCE).when(mockedModule).getSource();
534 doReturn(Sets.newHashSet()).when(mockedModule).getSubmodules();
535 doReturn(mockedModule.getQNameModule().toString()).when(mockedModule).toString();
536 mockModuleImport(mockedModule);