blob: 79dec87c3dc9dac3ab3eac5d51e2dd44d64d81ea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.builder.tests.usage;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.pde.api.tools.internal.problems.ApiProblemFactory;
import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
import org.eclipse.pde.api.tools.model.tests.TestSuiteHelper;
import junit.framework.Test;
/**
* These tests are incremental builder tests that add / remove / change
* restrictions on elements known to be used by other bundles
* and ensure problems are updated accordingly on dependent types
*
* @since 1.0.1
*/
public class DependentUsageTests extends UsageTest {
static final String WITHOUTTAG = "withouttag"; //$NON-NLS-1$
static final String WITHTAG = "withtag"; //$NON-NLS-1$
static final IPath C_PATH = new Path("/refproject/src/c/"); //$NON-NLS-1$
static final IPath F_PATH = new Path("/refproject/src/f/"); //$NON-NLS-1$
static final IPath I_PATH = new Path("/refproject/src/i/"); //$NON-NLS-1$
static final IPath M_PATH = new Path("/refproject/src/m/"); //$NON-NLS-1$
static final IPath XYZ_PATH = new Path("/usagetests/src/x/y/z/"); //$NON-NLS-1$
static final IPath MPPATH = new Path("/refproject/src/pack/multi/part"); //$NON-NLS-1$
public DependentUsageTests(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(DependentUsageTests.class);
}
@Override
protected int getDefaultProblemId() {
return 0;
}
protected IPath getTestSourcePath(String path) {
return super.getTestSourcePath().append("dependent").append(path); //$NON-NLS-1$
}
/**
* Returns the type name from the {@link #WITHTAG} location in a test folder
* @param test the test context
* @param context the sub folder of the test where the type name should be looked up
* @param typename the type name to append to the path
* @return the path to the given type name for the {@link #WITHTAG} folder in the given test folder
*/
protected IPath getReplacementType(String test, String context, String typename) {
return TestSuiteHelper.getPluginDirectoryPath().append(TEST_SOURCE_ROOT).append(getTestSourcePath(test)).append(context).append(typename);
}
/**
* Returns the {@link IPath} to the *.java file to deploy
* @param test
* @return the path to the test source given the test name
*/
protected IPath getTestSource(String test) {
return TestSuiteHelper.getPluginDirectoryPath().append(TEST_SOURCE_ROOT).append(getTestSourcePath(test)).append(test).addFileExtension("java"); //$NON-NLS-1$
}
/**
* Deploys the test
* @param test the name of the test
* @param usepath the local workspace path to place the referencing type in
* @param refpath the workspace relative path for the ref type to be added to
* @param refname the '/' qualified name of the reference type to update
* @param addtag if the the restricted tag is to be added or removed for the test
* @throws Exception if something bad happens
*/
protected void deployTest(String test, IPath usepath, IPath refpath, String refname, boolean addtag) throws Exception {
try {
getEnv().setAutoBuilding(false);
//copy source files and build
IPath updatepath = refpath.append(refname);
IPath path = (addtag ? getReplacementType(test, WITHOUTTAG, refname) : getReplacementType(test, WITHTAG, refname));
//create the referenced file
createWorkspaceFile(updatepath, path);
//create the referencing file
createWorkspaceFile(usepath.append(test+".java"), getTestSource(test)); //$NON-NLS-1$
fullBuild();
expectingNoJDTProblems();
if(addtag) {
expectingNoProblems();
}
else {
assertProblems(getEnv().getProblems());
}
//do replacement with the alternate and build
path = (addtag ? getReplacementType(test, WITHTAG, refname) : getReplacementType(test, WITHOUTTAG, refname));
updateWorkspaceFile(updatepath, path);
incrementalBuild();
expectingNoJDTProblems();
if(addtag) {
assertProblems(getEnv().getProblems());
}
else {
expectingNoProblems();
}
}
finally {
getEnv().setAutoBuilding(true);
}
}
/**
* Tests adding an @noextend restriction to a class known to be used
* by another bundle
*
* Uses test1.java and classref.java
*/
public void testAddExtendRestriction() throws Exception {
test1(true);
}
/**
* Tests removing an @noextend restriction from a class known
* to be used by another bundle
*
* Uses test1.java and classref.java
*/
public void testRemoveExtendRestriction() throws Exception {
test1(false);
}
private void test1(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_EXTEND, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {{"classref", "test1"}}); //$NON-NLS-1$ //$NON-NLS-2$
deployTest("test1", XYZ_PATH, C_PATH, "classref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding an @noimplement restriction to an interface known
* to be used by another bundle
*
* Uses test2.java and interref.java
*/
public void testAddImplementsRestriction() throws Exception {
test2(true);
}
/**
* Tests removing an @noimplement restriction from an interface known
* to be used by another bundle
*
* Uses test2.java and interref.java
*/
public void testRemoveImplementRestriction() throws Exception {
test2(false);
}
private void test2(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_IMPLEMENT, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {{"interref", "test2"}}); //$NON-NLS-1$ //$NON-NLS-2$
deployTest("test2", XYZ_PATH, I_PATH, "interref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding an @noinstantiate restriction to a class known to be used
* by another bundle
*
* Uses test3.java and classref.java
*/
public void testAddInstantiateRestriction() throws Exception {
test3(true);
}
/**
* Tests removing an @noinstantiate restriction from a class known to be used by
* another bundle
*
* Uses test3.java and classref.java
*/
public void testRemoveInstantiateRestriction() throws Exception {
test3(false);
}
private void test3(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_INSTANTIATE, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {{"classref", "test3"}}); //$NON-NLS-1$ //$NON-NLS-2$
deployTest("test3", XYZ_PATH, C_PATH, "classref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding an @noreference restriction to a constructor known to be called
* by another bundle
*
* Uses test4.java and constref.java
*/
public void testAddReferenceConstructorRestriction() throws Exception {
test4(true);
}
/**
* Tests removing an @noreference restriction to a constructor known to be called
* by another bundle
*
* Uses test4.java and constref.java
*/
public void testRemoveReferenceConstructorRestriction() throws Exception {
test4(false);
}
private void test4(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_REFERENCE, IApiProblem.CONSTRUCTOR_METHOD)
});
setExpectedMessageArgs(new String[][] {{"constref()", "test4"}}); //$NON-NLS-1$ //$NON-NLS-2$
deployTest("test4", XYZ_PATH, M_PATH, "constref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding an @noreference restriction to a field known
* to be used by another bundle
*
* Uses test5.java and fieldref.java
*/
public void testAddReferenceFieldRestriction() throws Exception {
test5(true);
}
/**
* Tests removing an @noreference restriction to a field
* known to be used by another bundle
*
* Uses test5.java and fieldref.java
*/
public void testRemoveReferenceFieldRestriction() throws Exception {
test5(false);
}
private void test5(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_REFERENCE, IApiProblem.FIELD)
});
setExpectedMessageArgs(new String[][] {{"fieldref", "test5", "number"}}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
deployTest("test5", XYZ_PATH, F_PATH, "fieldref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding an @noreference restriction to method
* known to be used by another bundle
*
* Uses test6.java and methodref.java
*/
public void testAddReferenceMethodRestriction() throws Exception {
test6(true);
}
/**
* Tests removing an @noreference restriction to a method
* known to be used by another bundle
*
* Uses test6.java and methodref.java
*/
public void testRemoveReferenceMethodRestriction() throws Exception {
test6(false);
}
private void test6(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_REFERENCE, IApiProblem.METHOD)
});
setExpectedMessageArgs(new String[][] {{"methodref", "test6", "m1()"}}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
deployTest("test6", XYZ_PATH, M_PATH, "methodref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding an @nooverride restriction to a method
* known to be used by another bundle
*
* Uses test7.java and methodref.java
*/
public void testAddOverrideRestriction() throws Exception {
test7(true);
}
/**
* Tests removing @nooverride restriction to a method
* known to be used by another bundle
*
* Uses test7.java and methodref.java
*/
public void testRemoveOverrideRestriction() throws Exception {
test7(false);
}
private void test7(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_OVERRIDE, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {{"methodref", "test7", "m1()"}}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
deployTest("test7", XYZ_PATH, M_PATH, "methodref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding @noextend restriction to an interface
* known to be used by another bundle
*
* Uses test8.java and interref.java
*/
public void testAddExtendInterfaceRestriction() throws Exception {
test8(true);
}
/**
* Tests adding @noextend restriction to an interface
* known to be used by another bundle
*
* Uses test8.java and interref.java
*/
public void testRemoveExtendInterfaceRestriction() throws Exception {
test8(false);
}
private void test8(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_EXTEND, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {{"interref", "test8"}}); //$NON-NLS-1$ //$NON-NLS-2$
deployTest("test8", XYZ_PATH, I_PATH, "interref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding @noextend AND @noinstantiate tags to a class known to be used
* by another bundle
*
* Uses test9.java and classref.java
*/
public void testAddExtendInstantiateRestriction() throws Exception {
test9(true);
}
/**
* Tests removing @noextend AND @noinstantiate tags to a class known to be used
* by another bundle
*
* Uses test9.java and classref.java
*/
public void testRemoveExtendInstantiateRestriction() throws Exception {
test9(false);
}
private void test9(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_EXTEND, IApiProblem.NO_FLAGS),
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_INSTANTIATE, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {
{"classref", "test9"}, //$NON-NLS-1$ //$NON-NLS-2$
{"classref", "test9"} //$NON-NLS-1$ //$NON-NLS-2$
});
deployTest("test9", XYZ_PATH, C_PATH, "classref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Tests adding @noextend AND @noimplement tags to an interface known to be used
* by another bundle
*
* Uses test10.java and interref.java
*/
public void testAddExtendImplementRestriction() throws Exception {
test10(true);
}
/**
* Tests removing @noextend AND @noimplement tags to an interface known to be used
* by another bundle
*
* Uses test10.java and interref.java
*/
public void testRemoveExtendImplementRestriction() throws Exception {
test10(false);
}
private void test10(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_EXTEND, IApiProblem.NO_FLAGS),
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_IMPLEMENT, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {
{"interref", "test10"}, //$NON-NLS-1$ //$NON-NLS-2$
{"interref", "clazz"} //$NON-NLS-1$ //$NON-NLS-2$
});
deployTest("test10", XYZ_PATH, I_PATH, "interref.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* tests adding an @noextend restriction to a type in a multi-part package name
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=296375
*
* @throws Exception
*/
public void testAddExtendRestrictionMultiPartPackageName() throws Exception {
test11(true);
}
/**
* tests removing an @noextend restriction to a type in a multi-part package name
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=296375
*
* @throws Exception
*/
public void testRemoveExtendRestrictionMultiPartPackageName() throws Exception {
test11(false);
}
private void test11(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_EXTEND, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {
{"mpClassRef", "test11"} //$NON-NLS-1$ //$NON-NLS-2$
});
deployTest("test11", XYZ_PATH, MPPATH, "mpClassRef.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* tests adding an @noinstantiate restriction to a type in a multi-part package name
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=296375
*
* @throws Exception
*/
public void testAddInstantiateRestrictionMultiPartPackageName() throws Exception {
test12(true);
}
/**
* tests removing an @noinstantiate restriction to a type in a multi-part package name
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=296375
*
* @throws Exception
*/
public void testRemoveInstantiateRestrictionMultiPartPackageName() throws Exception {
test12(false);
}
private void test12(boolean addtag) throws Exception {
setExpectedProblemIds(new int[] {
ApiProblemFactory.createProblemId(IApiProblem.CATEGORY_USAGE, IElementDescriptor.TYPE, IApiProblem.ILLEGAL_INSTANTIATE, IApiProblem.NO_FLAGS)
});
setExpectedMessageArgs(new String[][] {
{"mpClassRef", "test12"} //$NON-NLS-1$ //$NON-NLS-2$
});
deployTest("test12", XYZ_PATH, MPPATH, "mpClassRef.java", addtag); //$NON-NLS-1$ //$NON-NLS-2$
}
}