Added module sorting to SchemaContext. 87/4187/1
authorMartin Vitez <mvitez@cisco.com>
Mon, 13 Jan 2014 16:03:39 +0000 (17:03 +0100)
committerMartin Vitez <mvitez@cisco.com>
Mon, 13 Jan 2014 16:03:39 +0000 (17:03 +0100)
Added test.

Signed-off-by: Martin Vitez <mvitez@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java
yang/yang-parser-impl/src/test/resources/sorting-test/m1.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m2.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m3.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m4.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m5.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m6.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m7.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/sorting-test/m8.yang [new file with mode: 0644]

index 2d1da1f8336f7eaff5caf95b6cb8076f8c4ea7aa..3d595ed524aa29d32922a62f1ff57d225b2c9395 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.parser.impl;
 import java.net.URI;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -18,6 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;
 
 final class SchemaContextImpl implements SchemaContext {
     private final Set<Module> modules;
@@ -37,7 +40,8 @@ final class SchemaContextImpl implements SchemaContext {
 
     @Override
     public Set<Module> getModules() {
-        return modules;
+        List<Module> sorted = ModuleDependencySort.sort(modules.toArray(new Module[modules.size()]));
+        return new LinkedHashSet<Module>(sorted);
     }
 
     @Override
index eed8ad03084bc84536ced9a21683c32b213344ae..bb2fea413b75cdd096ec4b56d5830fa7cf713e79 100644 (file)
@@ -10,14 +10,20 @@ package org.opendaylight.yangtools.yang.parser.impl;
 import static org.junit.Assert.*;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.InputStream;
 import java.net.URI;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.junit.Before;
@@ -809,4 +815,99 @@ public class YangParserTest {
         assertEquals(6, modules.size());
     }
 
+    @Test
+    public void testSorting() throws FileNotFoundException {
+        // Correct order: m2, m4, m6, m8, m7, m6, m3, m1
+        File yangFile = new File(getClass().getResource("/sorting-test/m1.yang").getPath());
+        File dependenciesDir = new File(getClass().getResource("/sorting-test").getPath());
+        YangModelParser parser = new YangParserImpl();
+        modules = parser.parseYangModels(yangFile, dependenciesDir);
+        SchemaContext ctx = new SchemaContextImpl(modules);
+        checkOrder(modules);
+        assertSetEquals(modules, ctx.getModules());
+
+        // ##########
+        parser = new YangParserImpl();
+        final File testDir = dependenciesDir;
+        final String[] fileList = testDir.list();
+        final List<File> testFiles = new ArrayList<>();
+        if (fileList == null) {
+            throw new FileNotFoundException(dependenciesDir.getAbsolutePath());
+        }
+        for (String fileName : fileList) {
+            testFiles.add(new File(testDir, fileName));
+        }
+        Set<Module> newModules = parser.parseYangModels(testFiles);
+        assertSetEquals(newModules, modules);
+        ctx = new SchemaContextImpl(newModules);
+        assertSetEquals(newModules, ctx.getModules());
+        // ##########
+        newModules = parser.parseYangModels(testFiles, null);
+        assertSetEquals(newModules, modules);
+        ctx = new SchemaContextImpl(newModules);
+        assertSetEquals(newModules, ctx.getModules());
+        // ##########
+        List<InputStream> streams = new ArrayList<>();
+        for (File f : testFiles) {
+            streams.add(new FileInputStream(f));
+        }
+        newModules = parser.parseYangModelsFromStreams(streams);
+        assertSetEquals(newModules, modules);
+        ctx = new SchemaContextImpl(newModules);
+        assertSetEquals(newModules, ctx.getModules());
+        // ##########
+        streams.clear();
+        for (File f : testFiles) {
+            streams.add(new FileInputStream(f));
+        }
+        newModules = parser.parseYangModelsFromStreams(streams, null);
+        assertSetEquals(newModules, modules);
+        ctx = new SchemaContextImpl(newModules);
+        assertSetEquals(newModules, ctx.getModules());
+        // ##########
+        Map<File, Module> mapped = parser.parseYangModelsMapped(testFiles);
+        newModules = new LinkedHashSet<>(mapped.values());
+        assertSetEquals(newModules, modules);
+        ctx = new SchemaContextImpl(newModules);
+        assertSetEquals(newModules, ctx.getModules());
+        // ##########
+        streams.clear();
+        for (File f : testFiles) {
+            streams.add(new FileInputStream(f));
+        }
+        Map<InputStream, Module> mappedStreams = parser.parseYangModelsFromStreamsMapped(streams);
+        newModules = new LinkedHashSet<>(mappedStreams.values());
+        assertSetEquals(newModules, modules);
+        ctx = new SchemaContextImpl(newModules);
+        assertSetEquals(newModules, ctx.getModules());
+    }
+
+    private void checkOrder(Collection<Module> modules) {
+        Iterator<Module> it = modules.iterator();
+        Module m = it.next();
+        assertEquals("m2", m.getName());
+        m = it.next();
+        assertEquals("m4", m.getName());
+        m = it.next();
+        assertEquals("m6", m.getName());
+        m = it.next();
+        assertEquals("m8", m.getName());
+        m = it.next();
+        assertEquals("m7", m.getName());
+        m = it.next();
+        assertEquals("m5", m.getName());
+        m = it.next();
+        assertEquals("m3", m.getName());
+        m = it.next();
+        assertEquals("m1", m.getName());
+    }
+
+    private void assertSetEquals(Set<Module> s1, Set<Module> s2) {
+        assertEquals(s1, s2);
+        Iterator<Module> it = s1.iterator();
+        for (Module m : s2) {
+            assertEquals(m, it.next());
+        }
+    }
+
 }
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m1.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m1.yang
new file mode 100644 (file)
index 0000000..48c5e9b
--- /dev/null
@@ -0,0 +1,15 @@
+module m1 {
+
+    yang-version 1;
+    namespace "urn:test.m1";
+    prefix "m1";
+
+    import m3 {
+        prefix "m3";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m2.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m2.yang
new file mode 100644 (file)
index 0000000..0d6942a
--- /dev/null
@@ -0,0 +1,10 @@
+module m2 {
+
+    yang-version 1;
+    namespace "urn:test.m2";
+    prefix "m2";
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m3.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m3.yang
new file mode 100644 (file)
index 0000000..fd8f2da
--- /dev/null
@@ -0,0 +1,15 @@
+module m3 {
+
+    yang-version 1;
+    namespace "urn:test.m3";
+    prefix "m3";
+
+    import m5 {
+        prefix "m5";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m4.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m4.yang
new file mode 100644 (file)
index 0000000..117f36e
--- /dev/null
@@ -0,0 +1,15 @@
+module m4 {
+
+    yang-version 1;
+    namespace "urn:test.m4";
+    prefix "m4";
+
+    import m2 {
+        prefix "m2";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m5.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m5.yang
new file mode 100644 (file)
index 0000000..843cb52
--- /dev/null
@@ -0,0 +1,15 @@
+module m5 {
+
+    yang-version 1;
+    namespace "urn:test.m5";
+    prefix "m5";
+
+    import m7 {
+        prefix "m7";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m6.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m6.yang
new file mode 100644 (file)
index 0000000..26b0877
--- /dev/null
@@ -0,0 +1,15 @@
+module m6 {
+
+    yang-version 1;
+    namespace "urn:test.m6";
+    prefix "m6";
+
+    import m4 {
+        prefix "m4";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m7.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m7.yang
new file mode 100644 (file)
index 0000000..b78c40d
--- /dev/null
@@ -0,0 +1,15 @@
+module m7 {
+
+    yang-version 1;
+    namespace "urn:test.m7";
+    prefix "m7";
+
+    import m8 {
+        prefix "m8";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m8.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m8.yang
new file mode 100644 (file)
index 0000000..6518a35
--- /dev/null
@@ -0,0 +1,15 @@
+module m8 {
+
+    yang-version 1;
+    namespace "urn:test.m8";
+    prefix "m8";
+
+    import m6 {
+        prefix "m6";
+        revision-date 2014-01-13;
+    }
+
+    revision 2014-01-13 {
+    }
+
+}