BUG-4688: Rework SchemaContext module lookups
[yangtools.git] / yang / yang-model-util / src / test / java / org / opendaylight / yangtools / yang / model / util / SchemaContextProxyTest.java
1 /*
2  * Copyright (c) 2015 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.yang.model.util;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15
16 import com.google.common.collect.ImmutableSet;
17 import java.net.URI;
18 import java.util.Arrays;
19 import java.util.Collections;
20 import java.util.Date;
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Optional;
24 import java.util.Set;
25 import org.junit.Test;
26 import org.opendaylight.yangtools.concepts.SemVer;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.common.QNameModule;
29 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
32 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
35 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
36 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
37 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
38 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
39 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
40 import org.opendaylight.yangtools.yang.model.util.FilteringSchemaContextProxy.ModuleId;
41
42 public class SchemaContextProxyTest {
43
44     private static final URI NAMESPACE = URI.create("urn:opendaylight:params:xml:ns:yang:controller:config");
45     private static final Date REVISION = QName.parseRevision("2015-01-01");
46     private static final Date REVISION2 = QName.parseRevision("2015-01-15");
47
48     private static final String CONFIG_NAME = "config";
49     private static final String ROOT_NAME = "root";
50     private static final String MODULE2_NAME = "module2";
51     private static final String MODULE3_NAME = "module3";
52     private static final String MODULE4_NAME = "module4";
53     private static final String MODULE41_NAME = "module41";
54     private static final String MODULE5_NAME = "module5";
55
56     private static SchemaContext mockSchema(final Module... module) {
57         SchemaContext mock = mock(SchemaContext.class);
58         doReturn(ImmutableSet.copyOf(module)).when(mock).getModules();
59         return mock;
60     }
61
62     /*
63      * CFG(R)
64      *  | \
65      *  |  \
66      * M2 <- M3
67      */
68     @Test
69     public void testBasic() {
70         Module moduleConfig = mockModule(CONFIG_NAME);
71         Module module2 = mockModule(MODULE2_NAME);
72         Module module3 = mockModule(MODULE3_NAME);
73
74         mockModuleImport(module2, moduleConfig);
75         mockModuleImport(module3, module2, moduleConfig);
76
77         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
78
79         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
80                 moduleConfig);
81         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
82     }
83
84     /*
85      * No root or additional modules
86      *  | \
87      *  |  \
88      * M2 <- M3
89      */
90     @Test
91     public void testNull() {
92         Module moduleConfig = mockModule(CONFIG_NAME);
93         Module module2 = mockModule(MODULE2_NAME);
94         Module module3 = mockModule(MODULE3_NAME);
95
96         mockModuleImport(module2, moduleConfig);
97         mockModuleImport(module3, module2, moduleConfig);
98
99         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
100
101         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, null);
102         assertProxyContext(filteringSchemaContextProxy, null);
103     }
104
105     /*
106      *  Config
107      *  | \ (NR)
108      *  |  \
109      * M2 <- M3
110      */
111     @Test
112     public void testConfigDifferentRevisions() {
113         Module moduleConfigNullRevision = mockModule(CONFIG_NAME, null);
114         Module moduleConfig = mockModule(CONFIG_NAME, REVISION);
115         Module moduleConfig2 = mockModule(CONFIG_NAME, REVISION2);
116         Module module2 = mockModule(MODULE2_NAME);
117         Module module3 = mockModule(MODULE3_NAME);
118
119         mockModuleImport(module2, moduleConfig);
120         mockModuleImport(module3, module2, moduleConfigNullRevision);
121
122         SchemaContext schemaContext = mockSchema(moduleConfig, moduleConfig2, module2, module3);
123
124         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
125                 moduleConfig);
126         assertProxyContext(filteringSchemaContextProxy, moduleConfig, moduleConfig2, module2, module3);
127     }
128
129     /*
130      *     CFG(R)
131      *    |      \
132      *   |         \
133      * M2<-(NullRev)M3
134      */
135     @Test
136     public void testBasicNullRevision() throws Exception {
137         final Module moduleConfig = mockModule(CONFIG_NAME, QName.parseRevision("2013-04-05"));
138         final Module module2 = mockModule(MODULE2_NAME, QName.parseRevision("2014-06-17"));
139         final Module module20 = mockModule(MODULE2_NAME, null);
140         final Module module3 = mockModule(MODULE3_NAME, QName.parseRevision("2014-06-12"));
141         final Module module30 = mockModule(MODULE3_NAME, null);
142
143         mockModuleImport(module20, moduleConfig);
144         mockModuleImport(module2, moduleConfig);
145         mockModuleImport(module3, module20, moduleConfig);
146         mockModuleImport(module30, module20, moduleConfig);
147
148         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
149
150         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
151                 moduleConfig);
152
153         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
154     }
155
156     /*
157      * CFG(R)   ROOT(R)
158      *  |         \
159      *  |          \
160      * M2          M3
161      */
162     @Test
163     public void testBasicMoreRootModules() {
164         final Module moduleConfig = mockModule(CONFIG_NAME);
165         final Module moduleRoot = mockModule(ROOT_NAME);
166         final Module module2 = mockModule(MODULE2_NAME);
167         final Module module3 = mockModule(MODULE3_NAME);
168
169         mockModuleImport(module2, moduleConfig);
170         mockModuleImport(module3, moduleRoot);
171
172         SchemaContext schemaContext = mockSchema(moduleConfig, moduleRoot, module2, module3);
173
174         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleRoot,
175                 moduleConfig);
176         assertProxyContext(filteringSchemaContextProxy, moduleRoot, module3, moduleConfig, module2);
177     }
178
179     /*
180      * CFG(R)
181      *  |
182      *  |
183      * M2 <- M3
184      */
185     @Test
186     public void testChainNotDepend() {
187         Module moduleConfig = mockModule(CONFIG_NAME);
188         Module module2 = mockModule(MODULE2_NAME);
189         Module module3 = mockModule(MODULE3_NAME);
190
191         mockModuleImport(module2, moduleConfig);
192         mockModuleImport(module3, module2);
193
194         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
195
196         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
197                 moduleConfig);
198         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2);
199     }
200
201     /*
202      * CFG(R)
203      *  |
204      *  |
205      * M2 -> M3 -> M4 -> M5
206      */
207     @Test
208     public void testChainDependMulti() {
209         Module moduleConfig = mockModule(CONFIG_NAME);
210         Module module2 = mockModule(MODULE2_NAME);
211         Module module3 = mockModule(MODULE3_NAME);
212         Module module4 = mockModule(MODULE4_NAME);
213         Module module5 = mockModule(MODULE5_NAME);
214
215         mockModuleImport(module2, moduleConfig, module3);
216         mockModuleImport(module3, module4);
217         mockModuleImport(module4, module5);
218
219         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
220
221         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
222                 moduleConfig);
223         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
224     }
225
226     /*
227      * CFG(R)
228      *  |
229      *  |
230      * M2 -> M3 <- M4
231      */
232     @Test
233     public void testChainNotDependMulti() {
234         Module moduleConfig = mockModule(CONFIG_NAME);
235         Module module2 = mockModule(MODULE2_NAME);
236         Module module3 = mockModule(MODULE3_NAME);
237         Module module4 = mockModule(MODULE4_NAME);
238
239         mockModuleImport(module2, moduleConfig, module3);
240         mockModuleImport(module4, module3);
241
242         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
243
244         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
245                 moduleConfig);
246         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
247     }
248
249     /*
250      *  CFG(R)
251      *  | \ \ \
252      *  |  \ \ \
253      * M2 M3 M4 M5
254      */
255     @Test
256     public void testChainNotMulti() {
257         final Module moduleConfig = mockModule(CONFIG_NAME);
258         final Module module2 = mockModule(MODULE2_NAME);
259         final Module module3 = mockModule(MODULE3_NAME);
260         final Module module4 = mockModule(MODULE4_NAME);
261         final Module module5 = mockModule(MODULE5_NAME);
262
263         mockModuleImport(module2, moduleConfig);
264         mockModuleImport(module3, moduleConfig);
265         mockModuleImport(module4, moduleConfig);
266         mockModuleImport(module5, moduleConfig);
267
268         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
269
270         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
271                 moduleConfig);
272         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
273     }
274
275     /*
276      * CFG(R)
277      *  | \
278      *  |  \
279      * M2 <- M3 M4=M3(Different revision)
280      */
281     @Test
282     public void testBasicRevisionChange() throws Exception {
283         Module moduleConfig = mockModule(CONFIG_NAME);
284         Module module2 = mockModule(MODULE2_NAME);
285         Module module3 = mockModule(MODULE3_NAME);
286
287         Date dat = QName.parseRevision("2015-10-10");
288         Module module4 = mockModule(MODULE3_NAME, dat);
289
290         mockModuleImport(module2, moduleConfig);
291         mockModuleImport(module3, module2, moduleConfig);
292
293         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
294
295         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
296                 moduleConfig);
297         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
298     }
299
300     /*
301      * CFG(R)
302      * |
303      * M2 -(no revision)-> M3(R2) ... M3(R1)
304      */
305     @Test
306     public void testImportNoRevision() {
307         Module moduleConfig = mockModule(CONFIG_NAME, REVISION);
308         Module module2 = mockModule(MODULE2_NAME, REVISION);
309
310         Module module3  = mockModule(MODULE3_NAME, null);
311         Module module30 = mockModule(MODULE3_NAME, REVISION);
312         Module module31 = mockModule(MODULE3_NAME, REVISION2);
313         mockModuleImport(module2, moduleConfig, module3);
314
315         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module30, module31);
316
317         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
318                 moduleConfig);
319
320         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module31);
321     }
322
323     /*
324      * CFG(R)
325      * |   \
326      * |    \
327      * |    M2 -> M3
328      * |
329      * M41(S) => M4
330      */
331     @Test
332     public void testBasicSubmodule() {
333         Module moduleConfig = mockModule(CONFIG_NAME);
334         Module module2 = mockModule(MODULE2_NAME);
335         Module module3 = mockModule(MODULE3_NAME);
336         Module module4 = mockModule(MODULE4_NAME);
337         Module module41 = mockModule(MODULE41_NAME);
338
339         mockSubmodules(module4, module41);
340         mockModuleImport(module2, moduleConfig, module3);
341         mockModuleImport(module41, moduleConfig);
342
343         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
344
345         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
346                 moduleConfig);
347         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
348     }
349
350     /*
351      * M2 -> M3 -> M4 -> M5
352      */
353     @Test
354     public void testChainAdditionalModules() {
355         Module module2 = mockModule(MODULE2_NAME);
356         Module module3 = mockModule(MODULE3_NAME);
357         Module module4 = mockModule(MODULE4_NAME);
358         Module module5 = mockModule(MODULE5_NAME);
359
360         mockModuleImport(module2, module3);
361         mockModuleImport(module3, module4);
362         mockModuleImport(module4, module5);
363
364         SchemaContext schemaContext = mockSchema(module2, module3, module4, module5);
365
366         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
367                 Collections.singleton(module2), null);
368         assertProxyContext(filteringSchemaContextProxy, module2, module3, module4, module5);
369     }
370
371     /*
372      *
373      * CFG(R)
374      *  |
375      *  |       M5
376      * M2
377      *
378      * M3 -> M4
379      */
380     @Test
381     public void testChainAdditionalModulesConfig() {
382         Module moduleConfig = mockModule(CONFIG_NAME);
383         Module module2 = mockModule(MODULE2_NAME);
384
385         Module module3 = mockModule(MODULE3_NAME);
386         Module module4 = mockModule(MODULE4_NAME);
387         Module module5 = mockModule(MODULE5_NAME);
388
389         mockModuleImport(module2, moduleConfig);
390         mockModuleImport(module3, module4);
391
392         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
393
394         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
395             Collections.singleton(module3), moduleConfig);
396         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
397     }
398
399     @Test
400     public void testGetDataDefinitions() {
401         final Module moduleConfig = mockModule(CONFIG_NAME);
402         final SchemaContext schemaContext = mockSchema(moduleConfig);
403         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
404                 new HashSet<>(), moduleConfig);
405
406         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
407         final Set<DataSchemaNode> childNodes = Collections.singleton(mockedContainer);
408         doReturn(childNodes).when(moduleConfig).getChildNodes();
409
410         final Set<DataSchemaNode> dataDefinitions = filteringSchemaContextProxy.getDataDefinitions();
411         assertTrue(dataDefinitions.contains(mockedContainer));
412     }
413
414     @Test
415     public void testGetNotifications() {
416         final Module moduleConfig = mockModule(CONFIG_NAME);
417         final SchemaContext schemaContext = mockSchema(moduleConfig);
418         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
419                 new HashSet<>(), moduleConfig);
420
421         final NotificationDefinition mockedNotification = mock(NotificationDefinition.class);
422         final Set<NotificationDefinition> notifications = Collections.singleton(mockedNotification);
423         doReturn(notifications).when(moduleConfig).getNotifications();
424
425         final Set<NotificationDefinition> schemaContextProxyNotifications =
426             filteringSchemaContextProxy.getNotifications();
427         assertTrue(schemaContextProxyNotifications.contains(mockedNotification));
428     }
429
430     @Test
431     public void testGetOperations() {
432         final Module moduleConfig = mockModule(CONFIG_NAME);
433         final SchemaContext schemaContext = mockSchema(moduleConfig);
434         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
435                 new HashSet<>(), moduleConfig);
436
437         final RpcDefinition mockedRpc = mock(RpcDefinition.class);
438         final Set<RpcDefinition> rpcs = Collections.singleton(mockedRpc);
439         doReturn(rpcs).when(moduleConfig).getRpcs();
440
441         final Set<RpcDefinition> operations = filteringSchemaContextProxy.getOperations();
442         assertTrue(operations.contains(mockedRpc));
443     }
444
445     @Test
446     public void testGetExtensions() {
447         final Module moduleConfig = mockModule(CONFIG_NAME);
448         final SchemaContext schemaContext = mockSchema(moduleConfig);
449         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
450                 new HashSet<>(), moduleConfig);
451
452         final ExtensionDefinition mockedExtension = mock(ExtensionDefinition.class);
453         final List<ExtensionDefinition> extensions = Collections.singletonList(mockedExtension);
454         doReturn(extensions).when(moduleConfig).getExtensionSchemaNodes();
455
456         final Set<ExtensionDefinition> schemaContextProxyExtensions = filteringSchemaContextProxy.getExtensions();
457         assertTrue(schemaContextProxyExtensions.contains(mockedExtension));
458     }
459
460     @Test
461     public void testGetUnknownSchemaNodes() {
462         final Module moduleConfig = mockModule(CONFIG_NAME);
463         final SchemaContext schemaContext = mockSchema(moduleConfig);
464         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
465                 new HashSet<>(), moduleConfig);
466
467         final UnknownSchemaNode mockedUnknownSchemaNode = mock(UnknownSchemaNode.class);
468         final List<UnknownSchemaNode> unknownSchemaNodes = Collections.singletonList(mockedUnknownSchemaNode);
469         doReturn(unknownSchemaNodes).when(moduleConfig).getUnknownSchemaNodes();
470
471         final List<UnknownSchemaNode> schemaContextProxyUnknownSchemaNodes =
472                 filteringSchemaContextProxy.getUnknownSchemaNodes();
473         assertTrue(schemaContextProxyUnknownSchemaNodes.contains(mockedUnknownSchemaNode));
474     }
475
476     @Test
477     public void testGetTypeDefinitions() {
478         final Module moduleConfig = mockModule(CONFIG_NAME);
479         final SchemaContext schemaContext = mockSchema(moduleConfig);
480         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
481                 new HashSet<>(), moduleConfig);
482
483         final TypeDefinition<?> mockedTypeDefinition = mock(TypeDefinition.class);
484         final Set<TypeDefinition<?>> typeDefinitions = Collections.singleton(mockedTypeDefinition);
485         doReturn(typeDefinitions).when(moduleConfig).getTypeDefinitions();
486
487         final Set<TypeDefinition<?>> schemaContextProxyTypeDefinitions = filteringSchemaContextProxy
488             .getTypeDefinitions();
489         assertTrue(schemaContextProxyTypeDefinitions.contains(mockedTypeDefinition));
490     }
491
492     @Test
493     public void testGetChildNodes() {
494         final Module moduleConfig = mockModule(CONFIG_NAME);
495         final SchemaContext schemaContext = mockSchema(moduleConfig);
496         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
497                 new HashSet<>(), moduleConfig);
498
499         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
500         final Set<DataSchemaNode> childNodes = Collections.singleton(mockedContainer);
501         doReturn(childNodes).when(moduleConfig).getChildNodes();
502
503         final Set<DataSchemaNode> schemaContextProxyChildNodes = filteringSchemaContextProxy.getChildNodes();
504         assertTrue(schemaContextProxyChildNodes.contains(mockedContainer));
505     }
506
507     @Test
508     public void testGetGroupings() {
509         final Module moduleConfig = mockModule(CONFIG_NAME);
510         final SchemaContext schemaContext = mockSchema(moduleConfig);
511         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
512                 new HashSet<>(), moduleConfig);
513
514         final GroupingDefinition mockedGrouping = mock(GroupingDefinition.class);
515         final Set<GroupingDefinition> groupings = Collections.singleton(mockedGrouping);
516         doReturn(groupings).when(moduleConfig).getGroupings();
517
518         final Set<GroupingDefinition> schemaContextProxyGroupings = filteringSchemaContextProxy.getGroupings();
519         assertTrue(schemaContextProxyGroupings.contains(mockedGrouping));
520     }
521
522     @Test
523     public void testGetDataChildByName() {
524         final Module moduleConfig = mockModule(CONFIG_NAME);
525         final SchemaContext schemaContext = mockSchema(moduleConfig);
526         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext,
527                 new HashSet<>(), moduleConfig);
528
529         final QName qname = QName.create("config-namespace", "2016-08-11", "cont");
530         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
531         doReturn(mockedContainer).when(moduleConfig).getDataChildByName(any(QName.class));
532
533         final DataSchemaNode dataSchemaNode = filteringSchemaContextProxy.getDataChildByName(qname);
534         assertTrue(dataSchemaNode instanceof ContainerSchemaNode);
535     }
536
537     private static void assertProxyContext(final FilteringSchemaContextProxy filteringSchemaContextProxy,
538             final Module... expected) {
539
540         final Set<Module> modSet = expected != null ? ImmutableSet.copyOf(expected) : new HashSet<>();
541         Set<Module> modSetFiltering = filteringSchemaContextProxy.getModules();
542
543         assertEquals(modSet, modSetFiltering);
544
545         //asserting collections
546         if (expected != null) {
547             for (final Module module : expected) {
548                 assertEquals(module, filteringSchemaContextProxy.findModule(module.getName(), module.getRevision())
549                     .get());
550
551                 Set<Module> mod = filteringSchemaContextProxy.findModules(module.getNamespace());
552                 assertTrue(mod.contains(module));
553                 assertEquals(module, filteringSchemaContextProxy.findModule(module.getNamespace(),
554                     module.getRevision()).get());
555             }
556         }
557     }
558
559     private static FilteringSchemaContextProxy createProxySchemaCtx(final SchemaContext schemaContext,
560             final Set<Module> additionalModules, final Module... modules) {
561         Set<Module> modulesSet = new HashSet<>();
562         if (modules != null) {
563             modulesSet = ImmutableSet.copyOf(modules);
564         }
565
566         return new FilteringSchemaContextProxy(schemaContext, createModuleIds(modulesSet),
567                 createModuleIds(additionalModules));
568     }
569
570     private static Set<ModuleId> createModuleIds(final Set<Module> modules) {
571         Set<ModuleId> moduleIds = new HashSet<>();
572         if (modules != null) {
573             for (Module module : modules) {
574                 moduleIds.add(new ModuleId(module.getName(), module.getRevision()));
575             }
576         }
577
578         return moduleIds;
579     }
580
581     private static void mockSubmodules(final Module mainModule, final Module... submodules) {
582         Set<Module> submodulesSet = new HashSet<>();
583         submodulesSet.addAll(Arrays.asList(submodules));
584
585         doReturn(submodulesSet).when(mainModule).getSubmodules();
586     }
587
588     private static void mockModuleImport(final Module importer, final Module... imports) {
589         Set<ModuleImport> mockedImports = new HashSet<>();
590         for (final Module module : imports) {
591             mockedImports.add(new ModuleImport() {
592                 @Override
593                 public String getModuleName() {
594                     return module.getName();
595                 }
596
597                 @Override
598                 public Date getRevision() {
599                     return module.getRevision();
600                 }
601
602                 @Override
603                 public String getPrefix() {
604                     return module.getName();
605                 }
606
607                 @Override
608                 public Optional<SemVer> getSemanticVersion() {
609                     return module.getSemanticVersion();
610                 }
611
612                 @Override
613                 public String toString() {
614                     return String.format("Module: %s, revision:%s", module.getName(), module.getRevision());
615                 }
616             });
617         }
618         doReturn(mockedImports).when(importer).getImports();
619     }
620
621     //mock module with revision
622     private static Module mockModule(final String name, final Date rev) {
623
624         final Module mod = mockModule(name);
625
626         doReturn(QNameModule.create(mod.getNamespace(), rev)).when(mod).getQNameModule();
627         doReturn(rev).when(mod).getRevision();
628         doReturn(mod.getQNameModule().toString()).when(mod).toString();
629
630         return mod;
631     }
632
633     //mock module with default revision
634     private static Module mockModule(final String name) {
635
636         Module mockedModule = mock(Module.class);
637         doReturn(name).when(mockedModule).getName();
638         doReturn(REVISION).when(mockedModule).getRevision();
639         final URI newNamespace = URI.create(NAMESPACE.toString() + ":" + name);
640         doReturn(newNamespace).when(mockedModule).getNamespace();
641         doReturn(QNameModule.create(newNamespace, REVISION)).when(mockedModule).getQNameModule();
642         doReturn(new HashSet<>()).when(mockedModule).getSubmodules();
643         doReturn(mockedModule.getQNameModule().toString()).when(mockedModule).toString();
644         mockModuleImport(mockedModule);
645
646         return mockedModule;
647     }
648 }