org.eclipse.pde.api.tools.builder.tests.usage.UsageTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.pde.api.tools.builder.tests.usage.UsageTest.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2014 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.pde.api.tools.builder.tests.usage;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.tests.junit.extension.TestCase;
import org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest;
import org.eclipse.pde.api.tools.builder.tests.ApiProblem;
import org.eclipse.pde.api.tools.builder.tests.ApiTestingEnvironment;
import org.eclipse.pde.api.tools.model.tests.TestSuiteHelper;
import org.eclipse.pde.api.tools.tests.util.ProjectUtils;

/**
 * Tests usage scanning in source
 * 
 * @since 1.0.0
 */
public abstract class UsageTest extends ApiBuilderTest {

    private static final String USAGE = "usage"; //$NON-NLS-1$
    protected static final String TESTING_PACKAGE = "x.y.z"; //$NON-NLS-1$
    protected static final String REPLACEMENT_PACKAGE = "x.y.z.replace"; //$NON-NLS-1$
    protected static final String REF_PROJECT_NAME = "refproject"; //$NON-NLS-1$
    protected static final String TESTING_PROJECT = "usagetests"; //$NON-NLS-1$
    protected static final String INNER_NAME1 = "inner"; //$NON-NLS-1$
    protected static final String OUTER_NAME = "outer"; //$NON-NLS-1$
    protected static final String INNER_NAME2 = "inner2"; //$NON-NLS-1$
    protected static final String OUTER_INAME = "Iouter"; //$NON-NLS-1$

    public static IPath SOURCE_PATH = new Path("src/x/y/z"); //$NON-NLS-1$

    /**
     * Constructor
     */
    public UsageTest(String name) {
        super(name);
    }

    @Override
    protected void setBuilderOptions() {
        enableUnsupportedTagOptions(false);
        enableUnsupportedAnnotationOptions(false);
        enableBaselineOptions(false);
        enableCompatibilityOptions(false);
        enableLeakOptions(false);
        enableSinceTagOptions(false);
        enableUsageOptions(true);
        enableVersionNumberOptions(false);
    }

    /**
     * Makes sure the compliance for the project is what the test says it should
     * be
     * 
     * @param projectnames
     */
    protected void ensureCompliance(String[] projectnames) {
        IJavaProject project = null;
        String compliance = null;
        for (int i = 0; i < projectnames.length; i++) {
            project = getEnv().getJavaProject(projectnames[i]);
            compliance = getTestCompliance();
            if (!compliance.equals(project.getOption(JavaCore.COMPILER_COMPLIANCE, true))) {
                getEnv().setProjectCompliance(project, compliance);
            }
        }
    }

    @Override
    protected IPath getTestSourcePath() {
        return new Path(USAGE);
    }

    @Override
    protected String getTestingProjectName() {
        return "usagetests"; //$NON-NLS-1$
    }

    /**
     * @return the tests for this class
     */
    public static Test suite() {
        TestSuite suite = new TestSuite(UsageTest.class.getName());
        collectTests(suite);
        return suite;
    }

    /**
     * Deploys a standard API usage test with the test project being created and
     * the given source is imported in the testing project into the given
     * project.
     * 
     * This method assumes that the reference and testing project have been
     * imported into the workspace already.
     * 
     * @param sourcename
     * @param inc if an incremental build should be done
     */
    protected void deployUsageTest(String typename, boolean inc) {
        try {
            IPath typepath = new Path(getTestingProjectName()).append(SOURCE_PATH).append(typename)
                    .addFileExtension("java"); //$NON-NLS-1$
            createWorkspaceFile(typepath, TestSuiteHelper.getPluginDirectoryPath().append(TEST_SOURCE_ROOT)
                    .append(getTestSourcePath()).append(typename).addFileExtension("java")); //$NON-NLS-1$
            if (inc) {
                incrementalBuild();
            } else {
                fullBuild();
            }
            expectingNoJDTProblemsFor(typepath);
            ApiProblem[] problems = getEnv().getProblemsFor(typepath, null);
            assertProblems(problems);
        } catch (Exception e) {
            e.printStackTrace();
            fail(e.getMessage());
        }
    }

    /**
     * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#setUp()
     */
    @Override
    protected void setUp() throws Exception {
        // If we have an existing environment, set it to revert rather than
        // delete the workspace to improve performance
        ApiTestingEnvironment env = getEnv();
        if (env != null) {
            env.setRevert(true);
            env.setRevertSourcePath(null);
        }
        super.setUp();

        IProject project = getEnv().getWorkspace().getRoot().getProject(getTestingProjectName());
        if (!project.exists()) {
            // populate the workspace with initial plug-ins/projects
            createExistingProjects("usageprojects", true, true, false); //$NON-NLS-1$
        }
        ensureCompliance(new String[] { getTestingProjectName() });
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        ApiTestingEnvironment env = getEnv();
        if (env != null) {
            env.setRevert(false);
        }
    }

    /**
     * Collects tests from the getAllTestClasses() method into the given suite
     * 
     * @param suite
     */
    private static void collectTests(TestSuite suite) {
        // Hack to load all classes before computing their suite of test cases
        // this allow to reset test cases subsets while running all Builder
        // tests...
        Class<?>[] classes = getAllTestClasses();

        // Reset forgotten subsets of tests
        TestCase.TESTS_PREFIX = null;
        TestCase.TESTS_NAMES = null;
        TestCase.TESTS_NUMBERS = null;
        TestCase.TESTS_RANGE = null;
        TestCase.RUN_ONLY_ID = null;

        /* tests */
        for (int i = 0, length = classes.length; i < length; i++) {
            Class<?> clazz = classes[i];
            Method suiteMethod;
            try {
                suiteMethod = clazz.getDeclaredMethod("suite", new Class[0]); //$NON-NLS-1$
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
                continue;
            }
            Object test;
            try {
                test = suiteMethod.invoke(null, new Object[0]);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                continue;
            } catch (InvocationTargetException e) {
                e.printStackTrace();
                continue;
            }
            suite.addTest((Test) test);
        }
    }

    /**
     * @return all of the child test classes of this class
     */
    private static Class<?>[] getAllTestClasses() {
        ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
        classes.add(FieldUsageTests.class);
        classes.add(MethodUsageTests.class);
        classes.add(ConstructorUsageTests.class);
        classes.add(ClassUsageTests.class);
        classes.add(InterfaceUsageTests.class);
        classes.add(UnusedApiProblemFilterTests.class);
        classes.add(DependentUsageTests.class);
        classes.add(FragmentUsageTests.class);
        if (ProjectUtils.isJava5Compatible()) {
            classes.add(Java5FieldUsageTests.class);
            classes.add(Java5MethodUsageTests.class);
            classes.add(Java5ClassUsageTests.class);
            classes.add(AnnotationUsageTests.class);
            // classes.add(EnumUsageTests.class);
        }
        return classes.toArray(new Class[classes.size()]);
    }
}