blob: 3f8aa1118c7f180a5d137928b6e3ec89424bc3db [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 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 junit.framework.Test;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.pde.api.tools.internal.model.ApiModelFactory;
import org.eclipse.pde.api.tools.internal.problems.ApiProblemFactory;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.provisional.IApiBaselineManager;
import org.eclipse.pde.api.tools.internal.provisional.IApiFilterStore;
import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
import org.eclipse.pde.api.tools.util.tests.ResourceEventWaiter;
/**
* Tests that unused
* {@link org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemFilter}
* s are reported properly on full and incremental builds
*/
public class UnusedApiProblemFilterTests extends UsageTest {
private static final String BEFORE = "before"; //$NON-NLS-1$
private static final String AFTER = "after"; //$NON-NLS-1$
private IPath fRootPath = super.getTestSourcePath().append("filters"); //$NON-NLS-1$
private IPath fFiltersPath = new Path("/usagetests/.settings/.api_filters"); //$NON-NLS-1$
/**
* Constructor
*
* @param name
*/
public UnusedApiProblemFilterTests(String name) {
super(name);
}
/**
* Asserts a stub {@link IApiBaseline} that contains all of the workspace
* projects as API components
*
* @param name the name for the baseline
*/
protected void assertStubBaseline(String name) {
IApiBaselineManager manager = ApiPlugin.getDefault().getApiBaselineManager();
IApiBaseline baseline = manager.getDefaultApiBaseline();
if (baseline == null) {
baseline = ApiModelFactory.newApiBaseline(name);
manager.addApiBaseline(baseline);
manager.setDefaultApiBaseline(baseline.getName());
}
}
/**
* @see org.eclipse.pde.api.tools.builder.tests.usage.UsageTest#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
assertStubBaseline(BASELINE);
}
/**
* @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#tearDown()
*/
@Override
protected void tearDown() throws Exception {
removeBaseline(BASELINE);
super.tearDown();
}
/**
* Removes the baseline with the given name
*
* @param name
*/
private void removeBaseline(String name) {
IApiBaselineManager manager = ApiPlugin.getDefault().getApiBaselineManager();
IApiBaseline baseline = manager.getDefaultApiBaseline();
if (baseline != null) {
assertEquals("The given name should be the default baseline name", baseline.getName(), name); //$NON-NLS-1$
assertTrue("The baseline [" + name + "] should have been removed", manager.removeApiBaseline(name)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/*
* (non-Javadoc)
* @see
* org.eclipse.pde.api.tools.builder.tests.usage.UsageTest#setBuilderOptions
* ()
*/
@Override
protected void setBuilderOptions() {
super.setBuilderOptions();
enableLeakOptions(true);
}
/*
* (non-Javadoc)
* @see
* org.eclipse.pde.api.tools.builder.tests.usage.UsageTest#getTestSourcePath
* ()
*/
@Override
protected IPath getTestSourcePath() {
return fRootPath;
}
private IPath getBeforePath(String testname, String typename) {
return getUpdateFilePath(testname).append(BEFORE).append(typename);
}
private IPath getAfterPath(String testname, String typename) {
return getUpdateFilePath(testname).append(AFTER).append(typename);
}
private IPath getFilterFilePath(String testname) {
return getUpdateFilePath(testname).append(".api_filters"); //$NON-NLS-1$
}
private IPath getUpdatePath(String path) {
return new Path("/usagetests/src/x/y/z/").append(path); //$NON-NLS-1$
}
/**
* @return the test suite for this class
*/
public static Test suite() {
return buildTestSuite(UnusedApiProblemFilterTests.class);
}
/*
* (non-Javadoc)
* @see
* org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#getDefaultProblemId
* ()
*/
@Override
protected int getDefaultProblemId() {
return ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.METHOD, IApiProblem.UNUSED_PROBLEM_FILTERS, IApiProblem.NO_FLAGS);
}
protected void deployTest(IPath beforepath, IPath afterpath, IPath filterpath, IPath updatepath, boolean inc) throws Exception {
// add the source
createWorkspaceFile(updatepath, beforepath);
// touch the filter store to ensure it is listening...
IApiBaselineManager mgr = ApiPlugin.getDefault().getApiBaselineManager();
IApiBaseline baseline = mgr.getWorkspaceBaseline();
assertNotNull("The workspace baseline should not be null", baseline); //$NON-NLS-1$
IProject project = getEnv().getProject("usagetests"); //$NON-NLS-1$
assertNotNull("the testing project 'usagetests' must exist in the testing workspace", project); //$NON-NLS-1$
IApiComponent component = baseline.getApiComponent(project);
assertNotNull("The API component for project 'usagetests' must exist", component); //$NON-NLS-1$
IApiFilterStore store = component.getFilterStore();
assertNotNull("The filterstore for 'usagetests' must not be null", store); //$NON-NLS-1$
// wait for the event
ResourceEventWaiter waiter = new ResourceEventWaiter(fFiltersPath, IResourceChangeEvent.POST_CHANGE, IResourceDelta.CHANGED, 0);
createWorkspaceFile(fFiltersPath, filterpath);
Object event = waiter.waitForEvent();
assertNotNull("the resource changed event for the filter file was not recieved", event); //$NON-NLS-1$
expectingNoJDTProblems();
// update the source
deleteWorkspaceFile(updatepath, false);
if (afterpath != null) {
createWorkspaceFile(updatepath, afterpath);
}
if (inc) {
incrementalBuild();
} else {
fullBuild();
}
expectingNoJDTProblems();
if (getExpectedProblemIds().length > 0) {
assertProblems(getEnv().getProblems());
} else {
expectingNoProblems();
}
}
public void testUnusedFilter1F() throws Exception {
x1(false);
}
public void testUnusedFilter1I() throws Exception {
x1(true);
}
/**
* Tests that unused filters are correctly reported. This test adds the
* final modifier to a class that has a protected method leaking and
* internal type, with a filter for the problem
*
* @param inc
*/
private void x1(boolean inc) throws Exception {
String testname = "test1"; //$NON-NLS-1$
String sourcename = "testUF1.java"; //$NON-NLS-1$
setExpectedProblemIds(getDefaultProblemIdSet(1));
setExpectedMessageArgs(new String[][] { { "testUF1.m1(internal) has non-API parameter type internal" } }); //$NON-NLS-1$
deployTest(getBeforePath(testname, sourcename), getAfterPath(testname, sourcename), getFilterFilePath(testname), getUpdatePath(sourcename), inc);
}
public void testUnusedFilter2F() throws Exception {
// TODO straighten out what happens when a type with filters is deleted
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=416937
// x2(false);
}
public void testUnusedFilter2I() throws Exception {
// TODO straighten out what happens when a type with filters is deleted
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=416937
// x2(true);
}
/**
* Tests that there is problem reported for a compilation unit that has been
* deleted, which has an API problem filter
*
* @param inc
*/
void x2(boolean inc) throws Exception {
String testname = "test2"; //$NON-NLS-1$
String sourcename = "testUF2.java"; //$NON-NLS-1$
setExpectedProblemIds(getDefaultProblemIdSet(1));
setExpectedMessageArgs(new String[][] { { "testUF2.m1() has non-API return type internal" } }); //$NON-NLS-1$
deployTest(getBeforePath(testname, sourcename), null, getFilterFilePath(testname), getUpdatePath(sourcename), inc);
}
public void testUnusedFilter3F() throws Exception {
x3(false);
}
public void testUnusedFilter3I() throws Exception {
x3(true);
}
/**
* Tests that a compilation unit with more than one problem in it works
* correctly when deleting a member that had a filter
*
* @param inc
*/
private void x3(boolean inc) throws Exception {
String testname = "test3"; //$NON-NLS-1$
String sourcename = "testUF3.java"; //$NON-NLS-1$
setExpectedProblemIds(new int[] {
getDefaultProblemId(),
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.METHOD, IApiProblem.API_LEAK, IApiProblem.LEAK_METHOD_PARAMETER) });
setExpectedMessageArgs(new String[][] {
{ "testUF3.m2() has non-API return type internal" }, //$NON-NLS-1$
{ "internal", "testUF3", "m1(internal[])" } }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
deployTest(getBeforePath(testname, sourcename), getAfterPath(testname, sourcename), getFilterFilePath(testname), getUpdatePath(sourcename), inc);
}
public void testUnusedFilter4F() throws Exception {
x4(false);
}
public void testUnusedFilter4I() throws Exception {
x4(true);
}
/**
* Tests that unused filters are not reported because the workspace baseline
* has not been set - i.e. the build should short-circuit to not even check
* for filters. This test adds the final modifier to a class that has a
* protected method leaking and internal type, with a filter for the
* problem, but no API baseline set
*
* @param inc
*/
private void x4(boolean inc) throws Exception {
removeBaseline(BASELINE);
String testname = "test1"; //$NON-NLS-1$
String sourcename = "testUF1.java"; //$NON-NLS-1$
IPath path = new Path("usagetest/x/y/z").append(sourcename); //$NON-NLS-1$
expectingNoProblemsFor(path);
deployTest(getBeforePath(testname, sourcename), getAfterPath(testname, sourcename), getFilterFilePath(testname), getUpdatePath(sourcename), inc);
}
}