package at.ac.tuwien.infosys.jaxb; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.util.Arrays; import org.apache.commons.io.FileUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.ac.tuwien.infosys.jaxb.test.XmlTestType; import com.pellcorp.jaxb.test.TestUtils; /** * This class contains end-to-end tests which run the schemagen.sh * executable to generate schema files from Java source code files. * * @author Waldemar Hummer */ public class SchemagenTest { private static final Logger LOGGER = LoggerFactory.getLogger(WsImportTest.class); static File tmpDir; @BeforeClass public static void startServers() throws Exception { /* disable XSD 1.1 features! */ XmlSchemaEnhancer.XSD_11_ENABLED.set(false); tmpDir = createTempDirectory(); } @AfterClass public static void cleanup() throws Exception { /* re-enable XSD 1.1 features */ XmlSchemaEnhancer.XSD_11_ENABLED.set(true); /* clean up */ for(File dir : Arrays.asList(tmpDir)) { FileUtils.deleteDirectory(dir); if(dir.exists()) { LOGGER.warn("Unable to delete temporary directory: " + tmpDir); } } } @Test public void testGenerateFiles() throws Exception { LOGGER.info("Generating to directory " + tmpDir); File rootPath = new File( WsImportTest.class.getResource("/").getFile()) /* /jaxb-impl/target/test-classes */ .getParentFile() /* /jaxb-impl/target */ .getParentFile() /* /jaxb-impl */ .getParentFile(); /* / */ LOGGER.info("Using code root path: " + rootPath); String cmds[] = {rootPath + "/bin/schemagen.sh", "-d", tmpDir.getAbsolutePath(), "-cp", rootPath + "/jaxb-impl/target/test-classes/:" + rootPath + "/jaxb-api/target/classes/", XmlTestType.class.getName()}; LOGGER.info("Running command: " + Arrays.asList(cmds)); Process p = Runtime.getRuntime().exec(cmds); int result = p.waitFor(); if(result != 0) { String stdout = TestUtils.readStream(p.getInputStream()); String stderr = TestUtils.readStream(p.getErrorStream()); String output = "STDOUT: " + stdout + "\nSTDERR: " + stderr; LOGGER.info("wsimport failed. Output: " + output + "\n------"); } File genDir = tmpDir; String schemaName = "schema1.xsd"; File schemaFile = new File(genDir, schemaName); assertTrue(schemaFile.exists()); String file1 = TestUtils.readFile(schemaFile); /* '(?s)' in regex means Pattern.DOTALL */ assertTrue(file1.matches("(?s).*:minInclusive value=\"100\".*")); assertTrue(file1.matches("(?s).*<[a-z0-9]+:documentation.*source=\"src 1\".*>doc 1</[a-z0-9]+:documentation>.*")); assertTrue(file1.matches("(?s).*<[a-z0-9]+:documentation>doc 2</[a-z0-9]+:documentation>.*")); assertTrue(file1.matches("(?s).*<[a-z0-9]+:foo xmlns:[a-z0-9]+=\"myns123\">appinfo 1</[a-z0-9]+:foo>.*")); assertTrue(file1.matches("(?s).*<[a-z0-9]+:pattern value=\"\\[a-z\\]\\+\"/>.*")); assertTrue(file1.matches("(?s).*<b>list of strings</b>.*")); assertTrue(file1.matches("(?s).*<[a-z0-9]+:element name=\"bar\" minOccurs=\"2\".*")); } private static File createTempDirectory() throws IOException { return createTempDirectory("jaxb-facets"); } private static File createTempDirectory(String prefix) throws IOException { final File temp; temp = File.createTempFile(prefix, Long.toString(System.nanoTime())); if (!(temp.delete())) { throw new IOException("Could not delete temp file: " + temp.getAbsolutePath()); } if (!(temp.mkdir())) { throw new IOException("Could not create temp directory: " + temp.getAbsolutePath()); } return temp; } }