/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2012-2013 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.tools.ws.ant; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; import junit.framework.Assert; import junit.framework.TestCase; import org.apache.tools.ant.types.CommandlineJava; /** * * @author lukas */ public class WsAntToolsTest extends TestCase { public WsAntToolsTest(String testName) { super(testName); } public void testWsGenForkedCommand() { String method = "setupForkCommand"; String field = "cmd"; String arg = ""; //API jars are somewhere on the classpath File tmpDir = new File(System.getProperty("java.io.tmpdir"), "wsi2test"); WsGen2 wsg2 = new WsGen2(); wsg2.setFork(true); wsg2.setDestdir(new File(tmpDir, "dest")); wsg2.setSourcedestdir(new File(tmpDir, "srcDest")); CommandlineJava cmd = (CommandlineJava) run(WsGen2.class, wsg2, method, arg, field); verifyCommand(cmd.describeCommand()); //API jars are defined using CLASSPATH environment variable (= System class loader) ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); wsg2 = new WsGen2(); wsg2.setFork(true); wsg2.setDestdir(new File(tmpDir, "dest")); wsg2.setSourcedestdir(new File(tmpDir, "srcDest")); cmd = (CommandlineJava) run(WsGen2.class, wsg2, method, arg, field); verifyCommand(cmd.describeCommand()); } finally { Thread.currentThread().setContextClassLoader(cl); } } public void testWsImportForkedCommand() { String method = "setupForkCommand"; String field = "cmd"; String arg = ""; //API jars are somewhere on the classpath File tmpDir = new File(System.getProperty("java.io.tmpdir"), "wsi2test"); WsImport2 wsi2 = new WsImport2(); wsi2.setFork(true); wsi2.setDestdir(new File(tmpDir, "dest")); wsi2.setSourcedestdir(new File(tmpDir, "srcDest")); CommandlineJava cmd = (CommandlineJava) run(WsImport2.class, wsi2, method, arg, field); verifyCommand(cmd.describeCommand()); //API jars are defined using CLASSPATH environment variable (= System class loader) ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); wsi2 = new WsImport2(); wsi2.setFork(true); wsi2.setDestdir(new File(tmpDir, "dest")); wsi2.setSourcedestdir(new File(tmpDir, "srcDest")); cmd = (CommandlineJava) run(WsImport2.class, wsi2, method, arg, field); verifyCommand(cmd.describeCommand()); } finally { Thread.currentThread().setContextClassLoader(cl); } } private Object run(Class<?> c, Object i, String method, String arg, String field) { runVoidMethod(c, i, method, arg); return getField(c, i, field); } private void verifyCommand(String command) { Assert.assertTrue("-Xbootclasspath/p not set: " + command, command.contains("-Xbootclasspath/p")); String v = System.getProperty("jaxb-api.version"); String jar = v != null ? "jaxb-api-" + v + ".jar" : "jaxb-api.jar"; jar = fixIfSNAPSHOT(jar); Assert.assertTrue(jar + " not found " + command, command.contains(jar)); v = System.getProperty("jaxws-api.version"); jar = v != null ? "jaxws-api-" + v + ".jar" : "jaxws-api.jar"; jar = fixIfSNAPSHOT(jar); Assert.assertTrue(jar + " not found " + command, command.contains(jar)); } // translate maven timestamps to SNAPSHOT: // jaxb-api-2.3.0-20150602.094817-2.jar // >> // jaxb-api-2.3.0-SNAPSHOT.jar private String fixIfSNAPSHOT(String jar) { return jar.replaceAll("(.*)-(\\d+\\.\\d+\\.\\d+)\\-?(\\d+\\.\\d+-\\d+).jar", "$1-$2-SNAPSHOT.jar"); } private void runVoidMethod(Class<?> c, Object i, String name, String arg) { Method m = null; try { m = c.getSuperclass().getDeclaredMethod(name, String.class); m.setAccessible(true); m.invoke(i, arg); } catch (Throwable t) { Logger.getLogger(WsAntToolsTest.class.getName()).log(Level.SEVERE, null, t); Assert.fail(t.getMessage()); } finally { if (m != null) { m.setAccessible(false); } } } private Object getField(Class<?> c, Object i, String name) { Field f = null; try { f = c.getSuperclass().getDeclaredField(name); f.setAccessible(true); return f.get(i); } catch (Throwable t) { Logger.getLogger(WsAntToolsTest.class.getName()).log(Level.SEVERE, null, t); Assert.fail(t.getMessage()); } finally { if (f != null) { f.setAccessible(false); } } return null; } }