All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ee.jakarta.tck.concurrent.common.signature.ApiCheckDriver Maven / Gradle / Ivy

/*
 * Copyright (c) 2022 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.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

/*
 * $Id$
 */
package ee.jakarta.tck.concurrent.common.signature;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintWriter;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;

public final class ApiCheckDriver extends SignatureTestDriver implements Serializable {

    private static final long serialVersionUID = 1L;

    /* flags for the Diff utility argument list */
    private static final String BASE_FLAG = "-base";

    private static final String TEST_FLAG = "-test";

    private static final String PACKAGE_NO_SUBS_FLAG = "-PackageWithoutSubpackages";

    private static final String PACKAGE_FLAG = "-package";

    private static final String EXPACKAGE_FLAG = "-expackage";

    private static final String REFLECT_FLAG = "-reflect";

    private static final String CONST_FLAG = "-constvalues";

    // ---------------------------------------- Methods from SignatureTestDriver

    @Override
    protected String normalizeFileName(final File f) {
        return f.getPath();
    }

    @Override
    protected String[] createTestArguments(final String packageListFile, final String mapFile,
            final String signatureRepositoryDir, final String packageOrClassUnderTest, final String classpath,
            final boolean bStaticMode) throws Exception {

        Class pkgListClass = Class.forName("javasoft.sqe.apiCheck.PackageList");
        Constructor pkgCtor = pkgListClass.getDeclaredConstructor(new Class[] {
                String.class
                });
        Object pkgInstance = pkgCtor.newInstance(new Object[] {
                packageListFile
                });

        Method pkgMethod = pkgListClass.getDeclaredMethod("getSubPackagesFormatted", new Class[] {
                String.class
                });

        String excludePkgs = (String) pkgMethod.invoke(pkgInstance, new Object[] {
                packageOrClassUnderTest
                });

        List sigArgsList = new LinkedList<>();

        sigArgsList.add(BASE_FLAG);
        sigArgsList.add(getSigFileInfo(packageOrClassUnderTest, mapFile, signatureRepositoryDir).getFile());

        if (classpath != null && classpath.length() > 0) {
            sigArgsList.add(TEST_FLAG);
            sigArgsList.add(classpath);
        }

        sigArgsList.add(REFLECT_FLAG);
        sigArgsList.add(CONST_FLAG);
        sigArgsList.add(PACKAGE_FLAG);
        sigArgsList.add(packageOrClassUnderTest);

        if (excludePkgs != null && excludePkgs.length() > 0) {
            sigArgsList.add(EXPACKAGE_FLAG);
            sigArgsList.add(excludePkgs);
        }

        return (String[]) (sigArgsList.toArray(new String[sigArgsList.size()]));

    } // END createTestArguments

    @Override
    protected boolean runSignatureTest(final String packageOrClassName, final String[] testArguments) throws Exception {

        Class diffClass = Class.forName("javasoft.sqe.apiCheck.Diff");
        Method mainMethod = diffClass.getDeclaredMethod("main", new Class[] {
                String[].class
                });
        mainMethod.invoke(null, new Object[] {
                testArguments
                });

        Method diffMethod = diffClass.getDeclaredMethod("diffsFound", new Class[] {});
        return (!((Boolean) diffMethod.invoke(null, new Object[] {})).booleanValue());

    } // END runSignatureTest

    @Override
    protected boolean runPackageSearch(final String packageOrClassName, final String[] testArguments) throws Exception {
        Class sigTestClass = Class.forName("com.sun.tdk.signaturetest.SignatureTest");
        Object sigTestInstance = sigTestClass.getConstructor().newInstance();

        ByteArrayOutputStream output = new ByteArrayOutputStream();

        // we want to replace the PACKAGE_FLAG with PACKAGE_NO_SUBS_FLAG
        for (int ii = 0; ii < testArguments.length; ii++) {
            if (testArguments[ii].equals(PACKAGE_FLAG)) {
                testArguments[ii] = PACKAGE_NO_SUBS_FLAG;
            }
        }

        // dump args for debugging aid
        System.out.println("\nCalling:  com.sun.tdk.signaturetest.SignatureTest() with following args:");
        for (int ii = 0; ii < testArguments.length; ii++) {
            System.out.println("\t  testArguments[" + ii + "] = " + testArguments[ii]);
        }

        Method runMethod = sigTestClass.getDeclaredMethod("run",
                new Class[] {
                        String[].class, PrintWriter.class, PrintWriter.class
                        });
        runMethod.invoke(sigTestInstance, new Object[] {
                testArguments, new PrintWriter(output, true), null
                });

        String rawMessages = output.toString();

        // currently, there is no way to determine if there are error msgs in
        // the rawmessages, so we will always dump this and call it a status.
        System.out.println("********** Status Report '" + packageOrClassName + "' **********\n");
        System.out.println(rawMessages);
        return sigTestInstance.toString().substring(7).startsWith("Passed.");
    }

    @Override
    protected boolean verifyJTAJarForNoXA(final String classpath, final String repositoryDir) throws Exception {
        // Need to find out whether implementing this method is really required now.
        // By default, signature test framework will use sigtest
        return true;
    }

} // END ApiCheckDriver




© 2015 - 2025 Weber Informatics LLC | Privacy Policy