/*
 * Copyright (c) 2014, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Martin Vojtek - 2.6.0 - initial implementation
package org.eclipse.persistence.testing.jaxb.installer;

import java.io.File;
import java.util.logging.Logger;

/**
 * Tests eclipselink.zip consistency. It runs jaxb-compiler for simple xsd file
 * and asserts it has generated java classes.
 *
 * @author Martin Vojtek
 *
 */
public class JaxbCompilerTestCase extends junit.framework.TestCase {

    private static final String WORK_ITEM_RESOURCE_XSD = "org/eclipse/persistence/testing/jaxb/installer/WorkItem.xsd";

    /**
     * Tests jaxb-compiler command after unzipping eclipselink.zip.
     *
     */
    public void testJaxbCompiler() throws Exception {

        String eclipselinkUnzipDir = System.getenv("ECLIPSELINK_UNZIP_DIR");

        String jaxbCompiler = "jaxb-compiler";

        // run jaxb-compiler.cmd or jaxb-compiler.sh
        String osName = System.getProperty("os.name");
        if (null != osName && osName.startsWith("Windows")) {
            jaxbCompiler += ".cmd";
        } else {
            jaxbCompiler += ".sh";
        }

        File resourceFile = new File(Thread.currentThread().getContextClassLoader().getResource(WORK_ITEM_RESOURCE_XSD).toURI());

        File binDir = new File(eclipselinkUnzipDir + File.separator + "eclipselink" + File.separator + "bin");
        File compilerFile = new File(binDir, jaxbCompiler);

        Process process = Runtime.getRuntime().exec(new String[] { compilerFile.getAbsolutePath(), resourceFile.getAbsolutePath() }, null, binDir);
        int result = process.waitFor();

        assertTrue("Process has not completed successfully.", result == 0);

        String packagePrefix = "perf" + File.separator + "testing" + File.separator + "persistence" + File.separator + "eclipse" + File.separator + "org" + File.separator + "workitem";

        String[] files = { "package-info.java", "ObjectFactory.java", "jaxb.properties", "DoWorkItemResponse.java", "DoWorkItem.java" };

        for (String file : files) {
            assertFile(binDir, packagePrefix, file);
        }
    }

    private void assertFile(File binDir, String packagePrefix, String fileName) {
        assertTrue("File " + fileName + "does not exists.", new File(binDir + File.separator + packagePrefix, fileName).exists());
    }
}
