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;
15 import com.google.common.collect.Sets;
17 import java.net.URISyntaxException;
18 import java.text.ParseException;
19 import java.util.Arrays;
20 import java.util.Date;
21 import java.util.HashSet;
23 import org.junit.BeforeClass;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.yang.common.QNameModule;
26 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
27 import org.opendaylight.yangtools.yang.model.api.Module;
28 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30 import org.opendaylight.yangtools.yang.model.util.FilteringSchemaContextProxy.ModuleId;
32 public class SchemaContextProxyTest {
34 private static URI namespace;
35 private static Date revision;
36 private static Date revision2;
38 private static final String CONFIG_NAME = "config";
39 private static final String ROOT_NAME = "root";
40 private static final String MODULE2_NAME = "module2";
41 private static final String MODULE3_NAME = "module3";
42 private static final String MODULE4_NAME = "module4";
43 private static final String MODULE41_NAME = "module41";
44 private static final String MODULE5_NAME = "module5";
45 private static final String TEST_SOURCE = "test source";
48 public static void setUp() throws ParseException, URISyntaxException {
50 namespace = new URI("urn:opendaylight:params:xml:ns:yang:controller:config");
52 revision = SimpleDateFormatUtil.getRevisionFormat().parse("2015-01-01");
53 revision2 = SimpleDateFormatUtil.getRevisionFormat().parse("2015-01-15");
56 private static SchemaContext mockSchema(final Module... module) {
57 SchemaContext mock = mock(SchemaContext.class);
58 doReturn(Sets.newHashSet(module)).when(mock).getModules();
71 public void testBasic() {
72 Module moduleConfig = mockModule(CONFIG_NAME);
73 Module module2 = mockModule(MODULE2_NAME);
74 Module module3 = mockModule(MODULE3_NAME);
76 mockModuleImport(module2, moduleConfig);
77 mockModuleImport(module3, module2, moduleConfig);
79 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
81 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
82 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
87 * No root or additional modules
94 public void testNull() {
95 Module moduleConfig = mockModule(CONFIG_NAME);
96 Module module2 = mockModule(MODULE2_NAME);
97 Module module3 = mockModule(MODULE3_NAME);
99 mockModuleImport(module2, moduleConfig);
100 mockModuleImport(module3, module2, moduleConfig);
102 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
104 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, null);
105 assertProxyContext(filteringSchemaContextProxy, null);
117 public void testConfigDifferentRevisions() {
118 Module moduleConfigNullRevision = mockModule(CONFIG_NAME, null);
119 Module moduleConfig = mockModule(CONFIG_NAME, revision);
120 Module moduleConfig2 = mockModule(CONFIG_NAME, revision2);
121 Module module2 = mockModule(MODULE2_NAME);
122 Module module3 = mockModule(MODULE3_NAME);
124 mockModuleImport(module2, moduleConfig);
125 mockModuleImport(module3, module2, moduleConfigNullRevision);
127 SchemaContext schemaContext = mockSchema(moduleConfig, moduleConfig2, module2, module3);
129 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
130 assertProxyContext(filteringSchemaContextProxy, moduleConfig, moduleConfig2, module2, module3);
142 public void testBasicNullRevision() throws Exception {
143 Module moduleConfig = mockModule(CONFIG_NAME,SimpleDateFormatUtil.getRevisionFormat().parse("2013-04-05"));
144 Module module2 = mockModule(MODULE2_NAME, SimpleDateFormatUtil.getRevisionFormat().parse("2014-06-17"));
145 Module module20 = mockModule(MODULE2_NAME, null);
146 Module module3 = mockModule(MODULE3_NAME, SimpleDateFormatUtil.getRevisionFormat().parse("2014-06-12"));
147 Module module30 = mockModule(MODULE3_NAME, null);
149 mockModuleImport(module20, moduleConfig);
150 mockModuleImport(module2, moduleConfig);
151 mockModuleImport(module3, module20, moduleConfig);
152 mockModuleImport(module30, module20, moduleConfig);
154 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
156 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
158 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
170 public void testBasicMoreRootModules() {
171 Module moduleConfig = mockModule(CONFIG_NAME);
172 Module moduleRoot = mockModule(ROOT_NAME);
173 Module module2 = mockModule(MODULE2_NAME);
174 Module module3 = mockModule(MODULE3_NAME);
176 mockModuleImport(module2, moduleConfig);
177 mockModuleImport(module3, moduleRoot);
179 SchemaContext schemaContext = mockSchema(moduleConfig, moduleRoot, module2, module3);
181 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleRoot, moduleConfig);
182 assertProxyContext(filteringSchemaContextProxy, moduleRoot, module3, moduleConfig, module2);
194 public void testChainNotDepend() {
195 Module moduleConfig = mockModule(CONFIG_NAME);
196 Module module2 = mockModule(MODULE2_NAME);
197 Module module3 = mockModule(MODULE3_NAME);
199 mockModuleImport(module2, moduleConfig);
200 mockModuleImport(module3, module2);
202 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
204 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
205 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2);
213 * M2 -> M3 -> M4 -> M5
217 public void testChainDependMulti() {
218 Module moduleConfig = mockModule(CONFIG_NAME);
219 Module module2 = mockModule(MODULE2_NAME);
220 Module module3 = mockModule(MODULE3_NAME);
221 Module module4 = mockModule(MODULE4_NAME);
222 Module module5 = mockModule(MODULE5_NAME);
224 mockModuleImport(module2, moduleConfig, module3);
225 mockModuleImport(module3, module4);
226 mockModuleImport(module4, module5);
228 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
230 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
231 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
243 public void testChainNotDependMulti() {
244 Module moduleConfig = mockModule(CONFIG_NAME);
245 Module module2 = mockModule(MODULE2_NAME);
246 Module module3 = mockModule(MODULE3_NAME);
247 Module module4 = mockModule(MODULE4_NAME);
249 mockModuleImport(module2, moduleConfig, module3);
250 mockModuleImport(module4, module3);
252 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
254 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
255 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
267 public void testChainNotMulti() {
268 Module moduleConfig = mockModule(CONFIG_NAME);
269 Module module2 = mockModule(MODULE2_NAME);
270 Module module3 = mockModule(MODULE3_NAME);
271 Module module4 = mockModule(MODULE4_NAME);
272 Module module5 = mockModule(MODULE5_NAME);
274 mockModuleImport(module2, moduleConfig);
275 mockModuleImport(module3, moduleConfig);
276 mockModuleImport(module4, moduleConfig);
277 mockModuleImport(module5, moduleConfig);
279 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
281 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
282 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
290 * M2 <- M3 M4=M3(Different revision)
294 public void testBasicRevisionChange() throws Exception {
295 Module moduleConfig = mockModule(CONFIG_NAME);
296 Module module2 = mockModule(MODULE2_NAME);
297 Module module3 = mockModule(MODULE3_NAME);
299 Date dat = SimpleDateFormatUtil.getRevisionFormat().parse("2015-10-10");
300 Module module4 = mockModule(MODULE3_NAME, dat);
302 mockModuleImport(module2, moduleConfig);
303 mockModuleImport(module3, module2, moduleConfig);
305 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
307 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
308 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
315 * M2 -(no revision)-> M3(R2) ... M3(R1)
319 public void testImportNoRevision() {
320 Module moduleConfig = mockModule(CONFIG_NAME, revision);
321 Module module2 = mockModule(MODULE2_NAME, revision);
323 Module module3 = mockModule(MODULE3_NAME, null);
324 Module module30 = mockModule(MODULE3_NAME, revision);
325 Module module31 = mockModule(MODULE3_NAME, revision2);
326 mockModuleImport(module2, moduleConfig, module3);
328 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module30, module31);
330 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
332 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module31);
346 public void testBasicSubmodule() {
347 Module moduleConfig = mockModule(CONFIG_NAME);
348 Module module2 = mockModule(MODULE2_NAME);
349 Module module3 = mockModule(MODULE3_NAME);
350 Module module4 = mockModule(MODULE4_NAME);
351 Module module41 = mockModule(MODULE41_NAME);
353 mockSubmodules(module4, module41);
354 mockModuleImport(module2, moduleConfig, module3);
355 mockModuleImport(module41, moduleConfig);
357 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
359 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
360 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
366 * M2 -> M3 -> M4 -> M5
371 public void testChainAdditionalModules() {
372 Module module2 = mockModule(MODULE2_NAME);
373 Module module3 = mockModule(MODULE3_NAME);
374 Module module4 = mockModule(MODULE4_NAME);
375 Module module5 = mockModule(MODULE5_NAME);
377 mockModuleImport(module2, module3);
378 mockModuleImport(module3, module4);
379 mockModuleImport(module4, module5);
381 SchemaContext schemaContext = mockSchema(module2, module3, module4, module5);
383 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Sets.newHashSet(module2), null);
384 assertProxyContext(filteringSchemaContextProxy, module2, module3, module4, module5);
400 public void testChainAdditionalModulesConfig() {
401 Module moduleConfig = mockModule(CONFIG_NAME);
402 Module module2 = mockModule(MODULE2_NAME);
404 Module module3 = mockModule(MODULE3_NAME);
405 Module module4 = mockModule(MODULE4_NAME);
406 Module module5 = mockModule(MODULE5_NAME);
408 mockModuleImport(module2, moduleConfig);
409 mockModuleImport(module3, module4);
411 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
413 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Sets.newHashSet(module3), moduleConfig);
414 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
417 private static void assertProxyContext(final FilteringSchemaContextProxy filteringSchemaContextProxy, final Module... expected) {
419 Set<Module> modSet = Sets.newHashSet();
423 modSet = Sets.newHashSet(expected);
426 Set<Module> modSetFiltering = filteringSchemaContextProxy.getModules();
428 assertEquals(modSet, modSetFiltering);
430 //asserting collections
432 for (final Module module : expected) {
433 assertEquals(module, filteringSchemaContextProxy.findModuleByName(module.getName(), module.getRevision()));
435 Set<Module> mod = filteringSchemaContextProxy.findModuleByNamespace(module.getNamespace());
436 assertTrue(mod.contains(module));
438 assertEquals(module, filteringSchemaContextProxy.findModuleByNamespaceAndRevision(module.getNamespace(), module.getRevision()));
440 assertEquals(module.getSource(), filteringSchemaContextProxy.getModuleSource(module).get());
445 private static FilteringSchemaContextProxy createProxySchemaCtx(final SchemaContext schemaContext,
446 final Set<Module> additionalModules, final Module... modules) {
448 Set<Module> modulesSet = new HashSet<>();
452 modulesSet = Sets.newHashSet(modules);
456 return new FilteringSchemaContextProxy(schemaContext, createModuleIds(modulesSet) , createModuleIds(additionalModules));
459 private static Set<ModuleId> createModuleIds(final Set<Module> modules) {
461 Set<ModuleId> moduleIds = Sets.newHashSet();
463 if(modules!=null && modules.size()>0) {
465 for (Module module : modules) {
467 moduleIds.add(new ModuleId(module.getName(), module.getRevision()));
474 private static void mockSubmodules(final Module mainModule, final Module... submodules) {
476 Set<Module> submodulesSet = new HashSet<>();
477 submodulesSet.addAll(Arrays.asList(submodules));
479 doReturn(submodulesSet).when(mainModule).getSubmodules();
482 private static void mockModuleImport(final Module importer, final Module... imports) {
483 Set<ModuleImport> mockedImports = Sets.newHashSet();
484 for (final Module module : imports) {
485 mockedImports.add(new ModuleImport() {
487 public String getModuleName() {
488 return module.getName();
492 public Date getRevision() {
493 return module.getRevision();
497 public String getPrefix() {
498 return module.getName();
502 public String toString() {
504 return String.format("Module: %s, revision:%s", module.getName(), module.getRevision());
508 doReturn(mockedImports).when(importer).getImports();
511 //mock module with revision
512 private static Module mockModule(final String name, final Date rev) {
514 final Module mod = mockModule(name);
516 doReturn(QNameModule.create(mod.getNamespace(), rev)).when(mod).getQNameModule();
517 doReturn(rev).when(mod).getRevision();
518 doReturn(mod.getQNameModule().toString()).when(mod).toString();
523 //mock module with default revision
524 private static Module mockModule(final String mName) {
526 Module mockedModule = mock(Module.class);
527 doReturn(mName).when(mockedModule).getName();
528 doReturn(revision).when(mockedModule).getRevision();
529 final URI newNamespace = URI.create(namespace.toString() + ":" + mName);
530 doReturn(newNamespace).when(mockedModule).getNamespace();
531 doReturn(QNameModule.create(newNamespace, revision)).when(mockedModule).getQNameModule();
532 doReturn(TEST_SOURCE).when(mockedModule).getSource();
533 doReturn(Sets.newHashSet()).when(mockedModule).getSubmodules();
534 doReturn(mockedModule.getQNameModule().toString()).when(mockedModule).toString();
535 mockModuleImport(mockedModule);