4ab054d66345b40e2eab3385272d725228e4ccf4
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-java-api-generator / src / test / java / org / opendaylight / controller / sal / java / api / generator / test / GeneratorJavaFileTest.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.controller.sal.java.api.generator.test;\r
9 \r
10 import static org.junit.Assert.*;\r
11 \r
12 import java.io.File;\r
13 import java.util.ArrayList;\r
14 import java.util.Arrays;\r
15 import java.util.HashSet;\r
16 import java.util.List;\r
17 import java.util.Set;\r
18 \r
19 import javax.tools.JavaCompiler;\r
20 import javax.tools.JavaFileObject;\r
21 import javax.tools.StandardJavaFileManager;\r
22 import javax.tools.ToolProvider;\r
23 \r
24 import org.junit.After;\r
25 import org.junit.Before;\r
26 import org.junit.Test;\r
27 import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator;\r
28 import org.opendaylight.controller.sal.binding.generator.impl.BindingGeneratorImpl;\r
29 import org.opendaylight.controller.sal.binding.generator.impl.GeneratedTypeBuilderImpl;\r
30 import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;\r
31 import org.opendaylight.controller.sal.binding.model.api.GeneratedType;\r
32 import org.opendaylight.controller.sal.binding.model.api.Type;\r
33 import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTypeBuilder;\r
34 import org.opendaylight.controller.sal.java.api.generator.GeneratorJavaFile;\r
35 import org.opendaylight.controller.sal.java.api.generator.InterfaceGenerator;\r
36 import org.opendaylight.controller.yang.model.api.Module;\r
37 import org.opendaylight.controller.yang.model.api.SchemaContext;\r
38 import org.opendaylight.controller.yang.model.parser.impl.YangModelParserImpl;\r
39 \r
40 public class GeneratorJavaFileTest {\r
41     private static final String FS = File.separator;\r
42     private static final String PATH = "test-dir";\r
43     private final File testDir = new File(PATH);\r
44 \r
45     private static final String GENERATOR_OUTPUT_PATH = "src/test/resources/src";\r
46     private static final File GENERATOR_OUTPUT = new File(GENERATOR_OUTPUT_PATH);\r
47     private static final String COMPILER_OUTPUT_PATH = "src/test/resources/bin";\r
48     private static final File COMPILER_OUTPUT = new File(COMPILER_OUTPUT_PATH);\r
49 \r
50     @Before\r
51     public void init() {\r
52         assertTrue(testDir.mkdir());\r
53         assertTrue(COMPILER_OUTPUT.mkdirs());\r
54         assertTrue(GENERATOR_OUTPUT.mkdirs());\r
55     }\r
56 \r
57     @After\r
58     public void cleanUp() {\r
59         deleteTestDir(testDir);\r
60         deleteTestDir(COMPILER_OUTPUT);\r
61         deleteTestDir(GENERATOR_OUTPUT);\r
62     }\r
63 \r
64     @Test\r
65     public void test() {\r
66         final Set<GeneratedType> types = new HashSet<GeneratedType>();\r
67         GeneratedType t1 = createGeneratedType(\r
68                 "org.opendaylight.controller.gen", "Type1");\r
69         GeneratedType t2 = createGeneratedType(\r
70                 "org.opendaylight.controller.gen", "Type2");\r
71         GeneratedType t3 = createGeneratedType(\r
72                 "org.opendaylight.controller.gen", "Type3");\r
73         types.add(t1);\r
74         types.add(t2);\r
75         types.add(t3);\r
76         GeneratorJavaFile generator = new GeneratorJavaFile(\r
77                 new InterfaceGenerator(), types);\r
78         generator.generateToFile(PATH);\r
79 \r
80         // path: test-dir/com/cisco/yang\r
81         String[] files = new File(PATH + FS + "org" + FS + "opendaylight" + FS + "controller" + FS + "gen").list();\r
82         List<String> filesList = Arrays.asList(files);\r
83 \r
84         assertEquals(3, files.length);\r
85         assertTrue(filesList.contains("Type1.java"));\r
86         assertTrue(filesList.contains("Type2.java"));\r
87         assertTrue(filesList.contains("Type3.java"));\r
88     }\r
89 \r
90     @Test\r
91     public void compilationTest() throws Exception {\r
92         final YangModelParserImpl parser = new YangModelParserImpl();\r
93         final BindingGenerator bindingGenerator = new BindingGeneratorImpl();\r
94 \r
95         File sourcesDir = new File("src/test/resources/yang");\r
96         File[] sourceFiles = sourcesDir.listFiles();\r
97         String[] sourcesDirPaths = new String[sourceFiles.length];\r
98         for (int i = 0; i < sourceFiles.length; i++) {\r
99             sourcesDirPaths[i] = sourceFiles[i].getAbsolutePath();\r
100         }\r
101         final Set<Module> modulesToBuild = parser\r
102                 .parseYangModels(sourcesDirPaths);\r
103 \r
104         final SchemaContext context = parser\r
105                 .resolveSchemaContext(modulesToBuild);\r
106         final List<Type> types = bindingGenerator.generateTypes(context);\r
107         final Set<GeneratedType> typesToGenerate = new HashSet<GeneratedType>();\r
108         final Set<GeneratedTransferObject> tosToGenerate = new HashSet<GeneratedTransferObject>();\r
109         for (Type type : types) {\r
110             if (type instanceof GeneratedType) {\r
111                 typesToGenerate.add((GeneratedType) type);\r
112             }\r
113 \r
114             if (type instanceof GeneratedTransferObject) {\r
115                 tosToGenerate.add((GeneratedTransferObject) type);\r
116             }\r
117         }\r
118 \r
119         final GeneratorJavaFile generator = new GeneratorJavaFile(\r
120                 typesToGenerate, tosToGenerate);\r
121         generator.generateToFile(GENERATOR_OUTPUT_PATH);\r
122 \r
123         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();\r
124         StandardJavaFileManager fileManager = compiler.getStandardFileManager(\r
125                 null, null, null);\r
126 \r
127         List<File> filesList = getJavaFiles(new File(GENERATOR_OUTPUT_PATH));\r
128 \r
129         Iterable<? extends JavaFileObject> compilationUnits = fileManager\r
130                 .getJavaFileObjectsFromFiles(filesList);\r
131         Iterable<String> options = Arrays.asList(new String[] { "-d",\r
132                 COMPILER_OUTPUT_PATH });\r
133         boolean compiled = compiler.getTask(null, null, null, options, null,\r
134                 compilationUnits).call();\r
135         assertTrue(compiled);\r
136     }\r
137 \r
138     private GeneratedType createGeneratedType(String pkgName, String name) {\r
139         GeneratedTypeBuilder builder = new GeneratedTypeBuilderImpl(pkgName,\r
140                 name);\r
141         return builder.toInstance();\r
142     }\r
143 \r
144     private void deleteTestDir(File file) {\r
145         if (file.isDirectory()) {\r
146             for (File f : file.listFiles()) {\r
147                 deleteTestDir(f);\r
148             }\r
149         }\r
150         if (!file.delete()) {\r
151             throw new RuntimeException("Failed to clean up after test");\r
152         }\r
153     }\r
154 \r
155     /**\r
156      * Search recursively given directory for *.java files.\r
157      *\r
158      * @param directory\r
159      *            directory to search\r
160      * @return List of java files found\r
161      */\r
162     private List<File> getJavaFiles(File directory) {\r
163         List<File> result = new ArrayList<File>();\r
164         for (File file : directory.listFiles()) {\r
165             if (file.isDirectory()) {\r
166                 result.addAll(getJavaFiles(file));\r
167             } else {\r
168                 String absPath = file.getAbsolutePath();\r
169                 if (absPath.endsWith(".java")) {\r
170                     result.add(file);\r
171                 }\r
172             }\r
173         }\r
174         return result;\r
175     }\r
176 \r
177 }\r