| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.avro.tool; |
| |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.util.Arrays; |
| |
| /** |
| * Verifies that the SpecificCompilerTool generates Java source properly |
| */ |
| public class TestSpecificCompilerTool { |
| |
| // where test input/expected output comes from |
| private static final File TEST_DIR = new File(System.getProperty("test.compile.schema.dir", "src/test/compiler")); |
| |
| // where test input comes from |
| private static final File TEST_INPUT_DIR = new File(TEST_DIR, "input"); |
| |
| // where test expected output comes from |
| private static final File TEST_EXPECTED_OUTPUT_DIR = new File(TEST_DIR, "output"); |
| private static final File TEST_EXPECTED_POSITION = new File(TEST_EXPECTED_OUTPUT_DIR, "Position.java"); |
| private static final File TEST_EXPECTED_PLAYER = new File(TEST_EXPECTED_OUTPUT_DIR, "Player.java"); |
| private static final File TEST_EXPECTED_FIELDVISIBILITYTEST = new File(TEST_EXPECTED_OUTPUT_DIR, |
| "FieldVisibilityTest.java"); |
| |
| private static final File TEST_EXPECTED_STRING_OUTPUT_DIR = new File(TEST_DIR, "output-string"); |
| private static final File TEST_EXPECTED_STRING_POSITION = new File(TEST_EXPECTED_STRING_OUTPUT_DIR, |
| "avro/examples/baseball/Position.java"); |
| private static final File TEST_EXPECTED_STRING_PLAYER = new File(TEST_EXPECTED_STRING_OUTPUT_DIR, |
| "avro/examples/baseball/Player.java"); |
| private static final File TEST_EXPECTED_STRING_FIELDTEST = new File(TEST_EXPECTED_STRING_OUTPUT_DIR, |
| "avro/examples/baseball/FieldTest.java"); |
| |
| // where test output goes |
| private static final File TEST_OUTPUT_DIR = new File("target/compiler/output"); |
| private static final File TEST_OUTPUT_PLAYER = new File(TEST_OUTPUT_DIR, "avro/examples/baseball/Player.java"); |
| private static final File TEST_OUTPUT_POSITION = new File(TEST_OUTPUT_DIR, "avro/examples/baseball/Position.java"); |
| private static final File TEST_OUTPUT_FIELDVISIBILITYTEST = new File(TEST_OUTPUT_DIR, |
| "avro/examples/baseball/FieldVisibilityTest.java"); |
| |
| private static final File TEST_OUTPUT_STRING_DIR = new File("target/compiler/output-string"); |
| private static final File TEST_OUTPUT_STRING_PLAYER = new File(TEST_OUTPUT_STRING_DIR, |
| "avro/examples/baseball/Player.java"); |
| private static final File TEST_OUTPUT_STRING_POSITION = new File(TEST_OUTPUT_STRING_DIR, |
| "avro/examples/baseball/Position.java"); |
| private static final File TEST_OUTPUT_STRING_FIELDTEST = new File(TEST_OUTPUT_STRING_DIR, |
| "avro/examples/baseball/FieldTest.java"); |
| |
| @Before |
| public void setUp() { |
| TEST_OUTPUT_DIR.delete(); |
| } |
| |
| @Test |
| public void testCompileSchemaWithFieldVisibility() throws Exception { |
| |
| TEST_OUTPUT_FIELDVISIBILITYTEST.delete(); |
| doCompile(new String[] { "-encoding", "UTF-8", "-fieldVisibility", "public_deprecated", "schema", |
| TEST_INPUT_DIR.toString() + "/fieldvisibilitytest.avsc", TEST_OUTPUT_DIR.getPath() }); |
| assertFileMatch(TEST_EXPECTED_FIELDVISIBILITYTEST, TEST_OUTPUT_FIELDVISIBILITYTEST); |
| } |
| |
| @Test |
| public void testCompileSchemaSingleFile() throws Exception { |
| |
| doCompile(new String[] { "-encoding", "UTF-8", "schema", TEST_INPUT_DIR.toString() + "/position.avsc", |
| TEST_OUTPUT_DIR.getPath() }); |
| assertFileMatch(TEST_EXPECTED_POSITION, TEST_OUTPUT_POSITION); |
| } |
| |
| @Test |
| public void testCompileSchemaTwoFiles() throws Exception { |
| |
| doCompile(new String[] { "-encoding", "UTF-8", "schema", TEST_INPUT_DIR.toString() + "/position.avsc", |
| TEST_INPUT_DIR.toString() + "/player.avsc", TEST_OUTPUT_DIR.getPath() }); |
| assertFileMatch(TEST_EXPECTED_POSITION, TEST_OUTPUT_POSITION); |
| assertFileMatch(TEST_EXPECTED_PLAYER, TEST_OUTPUT_PLAYER); |
| } |
| |
| @Test |
| public void testCompileSchemaFileAndDirectory() throws Exception { |
| |
| doCompile(new String[] { "-encoding", "UTF-8", "schema", TEST_INPUT_DIR.toString() + "/position.avsc", |
| TEST_INPUT_DIR.toString(), TEST_OUTPUT_DIR.getPath() }); |
| assertFileMatch(TEST_EXPECTED_POSITION, TEST_OUTPUT_POSITION); |
| assertFileMatch(TEST_EXPECTED_PLAYER, TEST_OUTPUT_PLAYER); |
| } |
| |
| @Test |
| public void testCompileSchemasUsingString() throws Exception { |
| |
| doCompile(new String[] { "-encoding", "UTF-8", "-string", "schema", TEST_INPUT_DIR.toString() + "/position.avsc", |
| TEST_INPUT_DIR.toString() + "/player.avsc", TEST_OUTPUT_STRING_DIR.getPath() }); |
| assertFileMatch(TEST_EXPECTED_STRING_POSITION, TEST_OUTPUT_STRING_POSITION); |
| assertFileMatch(TEST_EXPECTED_STRING_PLAYER, TEST_OUTPUT_STRING_PLAYER); |
| } |
| |
| @Test |
| public void testCompileSchemasWithVariousFieldTypes() throws Exception { |
| |
| doCompile(new String[] { "-encoding", "UTF-8", "-string", "schema", TEST_INPUT_DIR.toString() + "/fieldtest.avsc", |
| TEST_INPUT_DIR.toString() + "/fieldtest.avsc", TEST_OUTPUT_STRING_DIR.getPath() }); |
| assertFileMatch(TEST_EXPECTED_STRING_FIELDTEST, TEST_OUTPUT_STRING_FIELDTEST); |
| } |
| |
| // Runs the actual compiler tool with the given input args |
| private void doCompile(String[] args) throws Exception { |
| SpecificCompilerTool tool = new SpecificCompilerTool(); |
| tool.run(null, null, null, Arrays.asList((args))); |
| } |
| |
| /** |
| * Verify that the generated Java files match the expected. This approach has |
| * room for improvement, since we're currently just verify that the text |
| * matches, which can be brittle if the code generation formatting or method |
| * ordering changes for example. A better approach would be to compile the |
| * sources and do a deeper comparison. |
| * |
| * See |
| * https://download.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html |
| */ |
| private static void assertFileMatch(File expected, File found) throws IOException { |
| Assert.assertEquals("Found file: " + found + " does not match expected file: " + expected, readFile(expected), |
| readFile(found)); |
| } |
| |
| /** |
| * Not the best implementation, but does the job. Building full strings of the |
| * file content and comparing provides nice diffs via JUnit when failures occur. |
| */ |
| private static String readFile(File file) throws IOException { |
| BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); |
| StringBuilder sb = new StringBuilder(); |
| String line = null; |
| boolean first = true; |
| while ((line = reader.readLine()) != null) { |
| if (!first) { |
| sb.append("\n"); |
| first = false; |
| } |
| sb.append(line); |
| } |
| reader.close(); |
| return sb.toString(); |
| } |
| } |