Fix submodule resource resolution
[mdsal.git] / binding / maven-sal-api-gen-plugin / src / test / java / org / opendaylight / mdsal / binding / yang / unified / doc / generator / maven / YangModuleInfoCompilationTest.java
index 1a0731851a2725f25a02adc87a05575d3e532056..0b7c6825537aba5960d10bdbb5c1ebcf6b69c86f 100644 (file)
@@ -7,12 +7,16 @@
  */
 package org.opendaylight.mdsal.binding.yang.unified.doc.generator.maven;
 
+import static org.hamcrest.CoreMatchers.startsWith;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.lang.reflect.Method;
@@ -23,7 +27,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
+import javax.tools.Diagnostic;
 import javax.tools.JavaCompiler;
 import javax.tools.JavaFileObject;
 import javax.tools.StandardJavaFileManager;
@@ -33,7 +39,8 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.common.YangConstants;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.sonatype.plexus.build.incremental.DefaultBuildContext;
 
@@ -99,7 +106,7 @@ public class YangModuleInfoCompilationTest {
         Object yangModuleInfo = getInstance.invoke(null);
 
         // Test getImportedModules method
-        Method getImportedModules = assertContainsMethod(yangModuleInfoClass, Set.class, "getImportedModules");
+        Method getImportedModules = assertContainsMethod(yangModuleInfoClass, ImmutableSet.class, "getImportedModules");
         Object importedModules = getImportedModules.invoke(yangModuleInfo);
         assertTrue(importedModules instanceof Set);
 
@@ -110,53 +117,64 @@ public class YangModuleInfoCompilationTest {
         for (Object importedModule : (Set<?>) importedModules) {
             assertTrue(importedModule instanceof YangModuleInfo);
             YangModuleInfo ymi = (YangModuleInfo) importedModule;
-            String name = ymi.getName();
+            String name = ymi.getName().getLocalName();
 
             switch (name) {
-            case "import-module":
-                infoImport = ymi;
-                break;
-            case "submodule1":
-                infoSub1 = ymi;
-                break;
-            case "submodule2":
-                infoSub2 = ymi;
-                break;
-            case "submodule3":
-                infoSub3 = ymi;
+                case "import-module":
+                    infoImport = ymi;
+                    break;
+                case "submodule1":
+                    infoSub1 = ymi;
+                    break;
+                case "submodule2":
+                    infoSub2 = ymi;
+                    break;
+                case "submodule3":
+                    infoSub3 = ymi;
+                    break;
+                default:
+                    // no-op
             }
         }
         assertNotNull(infoImport);
+        assertThat(infoImport.getYangTextCharSource().readFirstLine(), startsWith("module import-module"));
         assertNotNull(infoSub1);
+        assertThat(infoSub1.getYangTextCharSource().readFirstLine(), startsWith("submodule submodule1"));
         assertNotNull(infoSub2);
+        assertThat(infoSub2.getYangTextCharSource().readFirstLine(), startsWith("submodule submodule2"));
         assertNotNull(infoSub3);
+        assertThat(infoSub3.getYangTextCharSource().readFirstLine(), startsWith("submodule submodule3"));
 
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
 
-    private static void generateTestSources(final String resourceDirPath, final File sourcesOutputDir) throws Exception {
+    private static void generateTestSources(final String resourceDirPath, final File sourcesOutputDir)
+            throws Exception {
         final List<File> sourceFiles = getSourceFiles(resourceDirPath);
-        final SchemaContext context = YangParserTestUtils.parseYangSources(sourceFiles);
+        final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
         CodeGeneratorImpl codegen = new CodeGeneratorImpl();
         codegen.setBuildContext(new DefaultBuildContext());
-        codegen.generateSources(context, sourcesOutputDir, context.getModules());
+        codegen.generateSources(context, sourcesOutputDir, Set.copyOf(context.getModules()),
+            (module, representation) -> Optional.of(resourceDirPath + File.separator + module.getName()
+            + YangConstants.RFC6020_YANG_FILE_EXTENSION));
     }
 
     @Test
     public void generateTestSourcesWithAdditionalConfig() throws Exception {
         final List<File> sourceFiles = getSourceFiles("/yang-module-info");
-        final SchemaContext context = YangParserTestUtils.parseYangSources(sourceFiles);
+        final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
         CodeGeneratorImpl codegen = new CodeGeneratorImpl();
         codegen.setBuildContext(new DefaultBuildContext());
         codegen.setResourceBaseDir(null);
         codegen.setMavenProject(new MavenProject());
         codegen.setAdditionalConfig(ImmutableMap.of("test", "test"));
-        Collection<File> files = codegen.generateSources(context, null, context.getModules());
+        Collection<File> files = codegen.generateSources(context, null, Set.copyOf(context.getModules()),
+            (module, representation) -> Optional.of(module.getName()));
         assertFalse(files.isEmpty());
-        files.forEach((file -> {
+        files.forEach(file -> {
             deleteTestDir(file);
             assertFalse(file.exists());
-        }));
+        });
     }
 
     private static void testCompilation(final File sourcesOutputDir, final File compiledOutputDir) {
@@ -165,8 +183,11 @@ public class YangModuleInfoCompilationTest {
         List<File> filesList = getJavaFiles(sourcesOutputDir);
         Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList);
         Iterable<String> options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath());
-        boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call();
-        assertTrue(compiled);
+        List<Diagnostic<?>> diags = new ArrayList<>();
+        boolean compiled = compiler.getTask(null, null, diags::add, options, null, compilationUnits).call();
+        if (!compiled) {
+            fail("Compilation failed with " + diags);
+        }
     }
 
     private static List<File> getJavaFiles(final File directory) {
@@ -210,8 +231,8 @@ public class YangModuleInfoCompilationTest {
         if (file.isDirectory()) {
             File[] filesToDelete = file.listFiles();
             if (filesToDelete != null) {
-                for (File f : filesToDelete) {
-                    deleteTestDir(f);
+                for (File ftd : filesToDelete) {
+                    deleteTestDir(ftd);
                 }
             }
         }
@@ -220,14 +241,15 @@ public class YangModuleInfoCompilationTest {
         }
     }
 
-    private static Method assertContainsMethod(final Class<?> clazz, final Class<?> returnType, final String name, final Class<?>... args) {
+    private static Method assertContainsMethod(final Class<?> clazz, final Class<?> returnType, final String name,
+            final Class<?>... args) {
         try {
-            Method m = clazz.getDeclaredMethod(name, args);
-            assertEquals(returnType, m.getReturnType());
-            return m;
+            Method method = clazz.getDeclaredMethod(name, args);
+            assertEquals(returnType, method.getReturnType());
+            return method;
         } catch (NoSuchMethodException e) {
             throw new AssertionError("Method " + name + " with args " + Arrays.toString(args)
-                    + " does not exists in class " + clazz.getSimpleName());
+                    + " does not exists in class " + clazz.getSimpleName(), e);
         }
     }