org.eclipse.pde.ui.tests.ee.ExecutionEnvironmentTests.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.pde.ui.tests.ee.ExecutionEnvironmentTests.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.ui.tests.ee;

import java.util.Hashtable;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.core.util.IClassFileReader;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.ui.wizards.tools.UpdateClasspathJob;
import org.eclipse.pde.ui.tests.PDETestCase;
import org.eclipse.pde.ui.tests.util.ProjectUtils;

/**
 * Tests projects with a custom execution environment
 */
public class ExecutionEnvironmentTests extends PDETestCase {

    public static Test suite() {
        return new TestSuite(ExecutionEnvironmentTests.class);
    }

    /**
     * Deletes the specified project.
     * 
     * @param name
     * @throws CoreException
     */
    protected void deleteProject(String name) throws CoreException {
        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
        if (project.exists()) {
            project.delete(true, null);
        }
    }

    /**
     * Wait for builds to complete
     */
    public void waitForBuild() {
        boolean wasInterrupted = false;
        do {
            try {
                Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
                Job.getJobManager().join(ResourcesPlugin.FAMILY_MANUAL_BUILD, null);
                wasInterrupted = false;
            } catch (OperationCanceledException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                wasInterrupted = true;
            }
        } while (wasInterrupted);
    }

    /**
     * Validates that the project's option is as expected
     * 
     * @param optionName
     * @param expectedValue
     */
    protected void validateOption(IJavaProject project, String optionName, String expectedValue) {
        String option = project.getOption(optionName, true);
        assertEquals("Wrong value for option " + optionName, expectedValue, option);
    }

    /**
     * Validates the JRE class path container is as expected.
     * 
     * @param project
     * @param conatinerPath
     * @throws JavaModelException 
     */
    protected void validateSystemLibrary(IJavaProject project, IPath conatinerPath) throws JavaModelException {
        IClasspathEntry[] classpath = project.getRawClasspath();
        for (int i = 0; i < classpath.length; i++) {
            IClasspathEntry entry = classpath[i];
            if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
                IPath path = entry.getPath();
                if (JavaRuntime.JRE_CONTAINER.equals(path.segment(0))) {
                    assertEquals("Wrong system library class path container", conatinerPath, path);
                    return;
                }
            }
        }
        assertFalse("JRE container not found", true);
    }

    /**
     * Validates the target level of a generated class file.
     * 
     * @param classfile location of class file in local file system
     * @param major expected major class file version
     */
    protected void validateTargetLevel(String classfile, int major) {
        IClassFileReader reader = ToolFactory.createDefaultClassFileReader(classfile, IClassFileReader.ALL);
        assertEquals("Wrong major version", major, reader.getMajorVersion());
    }

    /**
     * Creates a plug-in project with a custom execution environment. Validates that
     * compiler compliance settings and build path are correct and that class files
     * are generated with correct target level.
     * 
     * TODO The VM this is run on must be included in the compatible JREs for the custom 
     * environment. See {@link EnvironmentAnalyzerDelegate#analyze(org.eclipse.jdt.launching.IVMInstall, IProgressMonitor)}
     * 
     * @throws Exception
     */
    public void testCustomEnvironment() throws Exception {
        try {
            IExecutionEnvironment env = JavaRuntime.getExecutionEnvironmentsManager()
                    .getEnvironment(EnvironmentAnalyzerDelegate.EE_NO_SOUND);
            IJavaProject project = ProjectUtils.createPluginProject("no.sound", env);
            assertTrue("Project was not created", project.exists());

            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);

            validateSystemLibrary(project, JavaRuntime.newJREContainerPath(env));

            // ensure class files are build with correct target level
            project.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
            waitForBuild();
            IFile file = project.getProject().getFile("/bin/no/sound/Activator.class");
            assertTrue("Activator class missing", file.exists());
            validateTargetLevel(file.getLocation().toOSString(), 47);
        } finally {
            deleteProject("no.sound");
        }
    }

    /**
     * Creates a plug-in project with a J2SE-1.4 execution environment. Validates that
     * compiler compliance settings and build path are correct and that class files
     * are generated with correct target level.
     * 
     * @throws Exception
     */
    public void testJava4Environment() throws Exception {
        try {
            IExecutionEnvironment env = JavaRuntime.getExecutionEnvironmentsManager().getEnvironment("J2SE-1.4");
            IJavaProject project = ProjectUtils.createPluginProject("j2se14.plug", env);
            assertTrue("Project was not created", project.exists());

            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_2);
            validateOption(project, JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_4);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.WARNING);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.WARNING);

            validateSystemLibrary(project, JavaRuntime.newJREContainerPath(env));

            project.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
            waitForBuild();
            IFile file = project.getProject().getFile("/bin/j2se14/plug/Activator.class");
            assertTrue("Activator class missing", file.exists());
            validateTargetLevel(file.getLocation().toOSString(), 46);
        } finally {
            deleteProject("j2se14.plug");
        }
    }

    /**
     * Creates a plug-in project without an execution environment. Validates that
     * compiler compliance settings and build path reflect default workspace settings.
     * 
     * @throws Exception
     */
    public void testNoEnvironment() throws Exception {
        try {
            IJavaProject project = ProjectUtils.createPluginProject("no.env", null);
            assertTrue("Project was not created", project.exists());

            Hashtable options = JavaCore.getOptions();
            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,
                    (String) options.get(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM));
            validateOption(project, JavaCore.COMPILER_SOURCE, (String) options.get(JavaCore.COMPILER_SOURCE));
            validateOption(project, JavaCore.COMPILER_COMPLIANCE,
                    (String) options.get(JavaCore.COMPILER_COMPLIANCE));
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER,
                    (String) options.get(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER));
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER,
                    (String) options.get(JavaCore.COMPILER_PB_ENUM_IDENTIFIER));

            validateSystemLibrary(project, JavaRuntime.newDefaultJREContainerPath());
        } finally {
            deleteProject("no.env");
        }
    }

    /**
     * Creates a plug-in project with a J2SE-1.4 execution environment. Validates that
     * compiler compliance settings and build path are correct. Modifies the compliance
     * options and then updates the class path again. Ensures that the enum and assert
     * identifier options get overwritten with minimum 'warning' severity.
     * 
     * @throws Exception
     */
    public void testMinimumComplianceOverwrite() throws Exception {
        try {
            IExecutionEnvironment env = JavaRuntime.getExecutionEnvironmentsManager().getEnvironment("J2SE-1.4");
            IJavaProject project = ProjectUtils.createPluginProject("j2se14.ignore", env);
            assertTrue("Project was not created", project.exists());

            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_2);
            validateOption(project, JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_4);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.WARNING);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.WARNING);

            validateSystemLibrary(project, JavaRuntime.newJREContainerPath(env));

            // set to ignore assert/enum options
            project.setOption(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.IGNORE);
            project.setOption(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.IGNORE);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.IGNORE);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.IGNORE);

            // updating class path should increase severity to warning
            IPluginModelBase model = PluginRegistry.findModel(project.getProject());
            UpdateClasspathJob job = new UpdateClasspathJob(new IPluginModelBase[] { model });
            job.schedule();
            job.join();

            // re-validate options
            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_2);
            validateOption(project, JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_4);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.WARNING);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.WARNING);

        } finally {
            deleteProject("j2se14.ignore");
        }
    }

    /**
     * Creates a plug-in project with a J2SE-1.4 execution environment. Validates that
     * compiler compliance settings and build path are correct. Modifies the compliance
     * options and then updates the class path again. Ensures that the enum and assert
     * identifier options do not overwrite existing 'error' severity.
     * 
     * @throws Exception
     */
    public void testMinimumComplianceNoOverwrite() throws Exception {
        try {
            IExecutionEnvironment env = JavaRuntime.getExecutionEnvironmentsManager().getEnvironment("J2SE-1.4");
            IJavaProject project = ProjectUtils.createPluginProject("j2se14.error", env);
            assertTrue("Project was not created", project.exists());

            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_2);
            validateOption(project, JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_4);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.WARNING);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.WARNING);

            validateSystemLibrary(project, JavaRuntime.newJREContainerPath(env));

            // set to ignore assert/enum options
            project.setOption(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
            project.setOption(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);

            // updating class path should increase severity to warning
            IPluginModelBase model = PluginRegistry.findModel(project.getProject());
            UpdateClasspathJob job = new UpdateClasspathJob(new IPluginModelBase[] { model });
            job.schedule();
            job.join();

            // re-validate options
            validateOption(project, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_2);
            validateOption(project, JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
            validateOption(project, JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_4);
            validateOption(project, JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
            validateOption(project, JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);

        } finally {
            deleteProject("j2se14.error");
        }
    }
}