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
8 package org.opendaylight.yangtools.yang.model.util;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.Mockito.doReturn;
13 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.concepts.SemVer;
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 static SchemaContext mockSchema(final Module... module) {
58 SchemaContext mock = mock(SchemaContext.class);
59 doReturn(Sets.newHashSet(module)).when(mock).getModules();
72 public void testBasic() {
73 Module moduleConfig = mockModule(CONFIG_NAME);
74 Module module2 = mockModule(MODULE2_NAME);
75 Module module3 = mockModule(MODULE3_NAME);
77 mockModuleImport(module2, moduleConfig);
78 mockModuleImport(module3, module2, moduleConfig);
80 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
82 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
83 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
88 * No root or additional modules
95 public void testNull() {
96 Module moduleConfig = mockModule(CONFIG_NAME);
97 Module module2 = mockModule(MODULE2_NAME);
98 Module module3 = mockModule(MODULE3_NAME);
100 mockModuleImport(module2, moduleConfig);
101 mockModuleImport(module3, module2, moduleConfig);
103 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
105 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, null);
106 assertProxyContext(filteringSchemaContextProxy, null);
118 public void testConfigDifferentRevisions() {
119 Module moduleConfigNullRevision = mockModule(CONFIG_NAME, null);
120 Module moduleConfig = mockModule(CONFIG_NAME, revision);
121 Module moduleConfig2 = mockModule(CONFIG_NAME, revision2);
122 Module module2 = mockModule(MODULE2_NAME);
123 Module module3 = mockModule(MODULE3_NAME);
125 mockModuleImport(module2, moduleConfig);
126 mockModuleImport(module3, module2, moduleConfigNullRevision);
128 SchemaContext schemaContext = mockSchema(moduleConfig, moduleConfig2, module2, module3);
130 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
131 assertProxyContext(filteringSchemaContextProxy, moduleConfig, moduleConfig2, module2, module3);
143 public void testBasicNullRevision() throws Exception {
144 Module moduleConfig = mockModule(CONFIG_NAME,SimpleDateFormatUtil.getRevisionFormat().parse("2013-04-05"));
145 Module module2 = mockModule(MODULE2_NAME, SimpleDateFormatUtil.getRevisionFormat().parse("2014-06-17"));
146 Module module20 = mockModule(MODULE2_NAME, null);
147 Module module3 = mockModule(MODULE3_NAME, SimpleDateFormatUtil.getRevisionFormat().parse("2014-06-12"));
148 Module module30 = mockModule(MODULE3_NAME, null);
150 mockModuleImport(module20, moduleConfig);
151 mockModuleImport(module2, moduleConfig);
152 mockModuleImport(module3, module20, moduleConfig);
153 mockModuleImport(module30, module20, moduleConfig);
155 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
157 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
159 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
171 public void testBasicMoreRootModules() {
172 Module moduleConfig = mockModule(CONFIG_NAME);
173 Module moduleRoot = mockModule(ROOT_NAME);
174 Module module2 = mockModule(MODULE2_NAME);
175 Module module3 = mockModule(MODULE3_NAME);
177 mockModuleImport(module2, moduleConfig);
178 mockModuleImport(module3, moduleRoot);
180 SchemaContext schemaContext = mockSchema(moduleConfig, moduleRoot, module2, module3);
182 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleRoot, moduleConfig);
183 assertProxyContext(filteringSchemaContextProxy, moduleRoot, module3, moduleConfig, module2);
195 public void testChainNotDepend() {
196 Module moduleConfig = mockModule(CONFIG_NAME);
197 Module module2 = mockModule(MODULE2_NAME);
198 Module module3 = mockModule(MODULE3_NAME);
200 mockModuleImport(module2, moduleConfig);
201 mockModuleImport(module3, module2);
203 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
205 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
206 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2);
214 * M2 -> M3 -> M4 -> M5
218 public void testChainDependMulti() {
219 Module moduleConfig = mockModule(CONFIG_NAME);
220 Module module2 = mockModule(MODULE2_NAME);
221 Module module3 = mockModule(MODULE3_NAME);
222 Module module4 = mockModule(MODULE4_NAME);
223 Module module5 = mockModule(MODULE5_NAME);
225 mockModuleImport(module2, moduleConfig, module3);
226 mockModuleImport(module3, module4);
227 mockModuleImport(module4, module5);
229 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
231 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
232 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
240 * M2 -> M3 <- M4
244 public void testChainNotDependMulti() {
245 Module moduleConfig = mockModule(CONFIG_NAME);
246 Module module2 = mockModule(MODULE2_NAME);
247 Module module3 = mockModule(MODULE3_NAME);
248 Module module4 = mockModule(MODULE4_NAME);
250 mockModuleImport(module2, moduleConfig, module3);
251 mockModuleImport(module4, module3);
253 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
255 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
256 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
268 public void testChainNotMulti() {
269 Module moduleConfig = mockModule(CONFIG_NAME);
270 Module module2 = mockModule(MODULE2_NAME);
271 Module module3 = mockModule(MODULE3_NAME);
272 Module module4 = mockModule(MODULE4_NAME);
273 Module module5 = mockModule(MODULE5_NAME);
275 mockModuleImport(module2, moduleConfig);
276 mockModuleImport(module3, moduleConfig);
277 mockModuleImport(module4, moduleConfig);
278 mockModuleImport(module5, moduleConfig);
280 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
282 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
283 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
291 * M2 <- M3 M4=M3(Different revision)
295 public void testBasicRevisionChange() throws Exception {
296 Module moduleConfig = mockModule(CONFIG_NAME);
297 Module module2 = mockModule(MODULE2_NAME);
298 Module module3 = mockModule(MODULE3_NAME);
300 Date dat = SimpleDateFormatUtil.getRevisionFormat().parse("2015-10-10");
301 Module module4 = mockModule(MODULE3_NAME, dat);
303 mockModuleImport(module2, moduleConfig);
304 mockModuleImport(module3, module2, moduleConfig);
306 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
308 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
309 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
316 * M2 -(no revision)-> M3(R2) ... M3(R1)
320 public void testImportNoRevision() {
321 Module moduleConfig = mockModule(CONFIG_NAME, revision);
322 Module module2 = mockModule(MODULE2_NAME, revision);
324 Module module3 = mockModule(MODULE3_NAME, null);
325 Module module30 = mockModule(MODULE3_NAME, revision);
326 Module module31 = mockModule(MODULE3_NAME, revision2);
327 mockModuleImport(module2, moduleConfig, module3);
329 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module30, module31);
331 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
333 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module31);
347 public void testBasicSubmodule() {
348 Module moduleConfig = mockModule(CONFIG_NAME);
349 Module module2 = mockModule(MODULE2_NAME);
350 Module module3 = mockModule(MODULE3_NAME);
351 Module module4 = mockModule(MODULE4_NAME);
352 Module module41 = mockModule(MODULE41_NAME);
354 mockSubmodules(module4, module41);
355 mockModuleImport(module2, moduleConfig, module3);
356 mockModuleImport(module41, moduleConfig);
358 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
360 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleConfig);
361 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
367 * M2 -> M3 -> M4 -> M5
372 public void testChainAdditionalModules() {
373 Module module2 = mockModule(MODULE2_NAME);
374 Module module3 = mockModule(MODULE3_NAME);
375 Module module4 = mockModule(MODULE4_NAME);
376 Module module5 = mockModule(MODULE5_NAME);
378 mockModuleImport(module2, module3);
379 mockModuleImport(module3, module4);
380 mockModuleImport(module4, module5);
382 SchemaContext schemaContext = mockSchema(module2, module3, module4, module5);
384 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Sets.newHashSet(module2), null);
385 assertProxyContext(filteringSchemaContextProxy, module2, module3, module4, module5);
401 public void testChainAdditionalModulesConfig() {
402 Module moduleConfig = mockModule(CONFIG_NAME);
403 Module module2 = mockModule(MODULE2_NAME);
405 Module module3 = mockModule(MODULE3_NAME);
406 Module module4 = mockModule(MODULE4_NAME);
407 Module module5 = mockModule(MODULE5_NAME);
409 mockModuleImport(module2, moduleConfig);
410 mockModuleImport(module3, module4);
412 SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
414 FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Sets.newHashSet(module3), moduleConfig);
415 assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
418 private static void assertProxyContext(final FilteringSchemaContextProxy filteringSchemaContextProxy, final Module... expected) {
420 Set<Module> modSet = Sets.newHashSet();
422 if (expected!=null) {
424 modSet = Sets.newHashSet(expected);
427 Set<Module> modSetFiltering = filteringSchemaContextProxy.getModules();
429 assertEquals(modSet, modSetFiltering);
431 //asserting collections
432 if (expected!=null) {
433 for (final Module module : expected) {
434 assertEquals(module, filteringSchemaContextProxy.findModuleByName(module.getName(), module.getRevision()));
436 Set<Module> mod = filteringSchemaContextProxy.findModuleByNamespace(module.getNamespace());
437 assertTrue(mod.contains(module));
439 assertEquals(module, filteringSchemaContextProxy.findModuleByNamespaceAndRevision(module.getNamespace(), module.getRevision()));
441 assertEquals(module.getSource(), filteringSchemaContextProxy.getModuleSource(module).get());
446 private static FilteringSchemaContextProxy createProxySchemaCtx(final SchemaContext schemaContext,
447 final Set<Module> additionalModules, final Module... modules) {
449 Set<Module> modulesSet = new HashSet<>();
453 modulesSet = Sets.newHashSet(modules);
457 return new FilteringSchemaContextProxy(schemaContext, createModuleIds(modulesSet) , createModuleIds(additionalModules));
460 private static Set<ModuleId> createModuleIds(final 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 static void mockSubmodules(final Module mainModule, final Module... submodules) {
477 Set<Module> submodulesSet = new HashSet<>();
478 submodulesSet.addAll(Arrays.asList(submodules));
480 doReturn(submodulesSet).when(mainModule).getSubmodules();
483 private static void mockModuleImport(final Module importer, final 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 SemVer getSemanticVersion() {
504 return module.getSemanticVersion();
508 public String toString() {
510 return String.format("Module: %s, revision:%s", module.getName(), module.getRevision());
514 doReturn(mockedImports).when(importer).getImports();
517 //mock module with revision
518 private static Module mockModule(final String name, final Date rev) {
520 final Module mod = mockModule(name);
522 doReturn(QNameModule.create(mod.getNamespace(), rev)).when(mod).getQNameModule();
523 doReturn(rev).when(mod).getRevision();
524 doReturn(mod.getQNameModule().toString()).when(mod).toString();
529 //mock module with default revision
530 private static Module mockModule(final String mName) {
532 Module mockedModule = mock(Module.class);
533 doReturn(mName).when(mockedModule).getName();
534 doReturn(revision).when(mockedModule).getRevision();
535 final URI newNamespace = URI.create(namespace.toString() + ":" + mName);
536 doReturn(newNamespace).when(mockedModule).getNamespace();
537 doReturn(QNameModule.create(newNamespace, revision)).when(mockedModule).getQNameModule();
538 doReturn(TEST_SOURCE).when(mockedModule).getSource();
539 doReturn(Sets.newHashSet()).when(mockedModule).getSubmodules();
540 doReturn(mockedModule.getQNameModule().toString()).when(mockedModule).toString();
541 mockModuleImport(mockedModule);