/******************************************************************************* * Copyright (c) 2007 - 2009 BEA Systems, Inc. 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: * wharley@bea.com - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.apt.pluggable.tests; import java.io.ByteArrayInputStream; import java.io.InputStream; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.apt.core.util.AptConfig; import org.eclipse.jdt.apt.pluggable.tests.processors.filertester.FilerTesterProc; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.builder.Problem; /** * Basic tests for the Filer interface in the IDE. * @see javax.annotation.processing.Filer */ public class FilerTests extends TestBase { public FilerTests(String name) { super(name); } public static Test suite() { return new TestSuite(FilerTests.class); } /** * Test generation of a source file, using the GenClass6 annotation * @see javax.annotation.processing.Filer#createClassFile(CharSequence, javax.lang.model.element.Element...) */ public void testCreateSourceFile() throws Throwable { // Temporary workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=201931 // Bail out on Linux String osName = System.getProperty("os.name"); if (null == osName || !osName.contains("Windows")) { return; } IJavaProject jproj = createJavaProject(_projectName); IProject proj = jproj.getProject(); IdeTestUtils.copyResources(proj, "targets/filer01a", "src/targets/filer"); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); // Check whether generated sources were generated and compiled expectingFile(proj, ".apt_generated/gen6/Generated01.java"); final String[] expectedClasses = { "targets.filer.Parent01", "gen6.Generated01" }; expectingUniqueCompiledClasses(expectedClasses); // Check whether non-source resource was generated in final round expectingFile( proj, ".apt_generated/summary.txt" ); //TODO: if a parent file is modified, // the generated file should be regenerated and recompiled. // The generated resource file should be regenerated (but not compiled). // Modify target file to remove annotation and incrementally rebuild; // generated file should be deleted. IdeTestUtils.copyResources(proj, "targets/filer01b", "src/targets/filer"); incrementalBuild(); expectingNoProblems(); final String[] expectedClasses2 = { "targets.filer.Parent01" }; expectingUniqueCompiledClasses(expectedClasses2); expectingNoFile(proj, ".apt_generated/gen6/Generated01.java"); expectingNoFile( proj, ".apt_generated/summary.txt" ); } /** * Test generation of a source file that is referenced by the parent, using the GenClass6 annotation * @see javax.annotation.processing.Filer#createSourceFile(CharSequence, javax.lang.model.element.Element...) */ public void testCreateSourceFileWithGenReference() throws Throwable { // Temporary workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=201931 // Bail out on Linux String osName = System.getProperty("os.name"); if (null == osName || !osName.contains("Windows")) { return; } IJavaProject jproj = createJavaProject(_projectName); IProject proj = jproj.getProject(); IdeTestUtils.copyResources(proj, "targets/filer02a", "src/targets/filer"); disableJava5Factories(jproj); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); // Check whether generated sources were generated and compiled expectingFile(proj, ".apt_generated/gen6/Generated02.java"); final String[] expectedClasses = { "targets.filer.Parent02", "gen6.Generated02" }; expectingUniqueCompiledClasses(expectedClasses); // Modify target file to change name of generated file and incrementally rebuild; // generated file should be deleted. IdeTestUtils.copyResources(proj, "targets/filer02b", "src/targets/filer"); incrementalBuild(); IPath parentPath = proj.getFullPath().append("src/targets/filer/Parent02.java"); expectingOnlySpecificProblemFor(parentPath, new Problem("Parent02", "gen6.Generated02 cannot be resolved to a type", parentPath, 842, 858, CategorizedProblem.CAT_TYPE, IMarker.SEVERITY_ERROR)); // This test only works if there are no Java 5 processors (e.g., apt.tests plugin) in the factory path. // If Java 5 processors are present, then gen6.Generated02 will also be recompiled, before it's deleted. final String[] expectedClasses2 = { "gen6.XxxGenerated02", "targets.filer.Parent02" }; expectingUniqueCompiledClasses(expectedClasses2); expectingNoFile(proj, ".apt_generated/gen6/Generated02.java"); } /** * Test generation of a source file that is referenced by the parent, using the GenClass6 annotation. * Processor calls getEnclosedElements(), causing the to-be-generated type to be resolved before it exists. */ public void testBug269934() throws Throwable { // Temporary workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=201931 // Bail out on Linux String osName = System.getProperty("os.name"); if (null == osName || !osName.contains("Windows")) { return; } IJavaProject jproj = createJavaProject(_projectName); IProject proj = jproj.getProject(); IdeTestUtils.copyResources(proj, "targets/filer03a", "src/targets/filer"); disableJava5Factories(jproj); AptConfig.setEnabled(jproj, true); fullBuild(); // Without the fix for bug 269934, the following lines must be uncommented for the test to pass: // IPath parentPath = proj.getFullPath().append("src/targets/filer/Parent03.java"); // Problem problem = new Problem("Parent03", "Generated03 cannot be resolved to a type", parentPath, 992, 1003, CategorizedProblem.CAT_TYPE, IMarker.SEVERITY_ERROR); // expectingOnlySpecificProblemFor(parentPath, problem); // With the fix, the following line works: expectingNoProblems(); // Check whether generated sources were generated and compiled expectingFile(proj, ".apt_generated/gen6/Generated03.java"); final String[] expectedClasses = { "targets.filer.Parent03", "gen6.Generated03" }; expectingUniqueCompiledClasses(expectedClasses); // Modify target file to and incrementally rebuild; file should be regenerated. IdeTestUtils.copyResources(proj, "targets/filer03b", "src/targets/filer"); incrementalBuild(); // Note that even with bug 269934, after an incremental build there are no problems reported. expectingNoProblems(); expectingUniqueCompiledClasses(expectedClasses); } /** * Call FilerTesterProc.testGetResource01(), which checks getResource() in SOURCE_OUTPUT location */ public void testGetResource01() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), "p", "Trigger", "package p;\n" + "import org.eclipse.jdt.apt.pluggable.tests.annotations.FilerTestTrigger;\n" + "@FilerTestTrigger(test = \"testGetResource01\", arg0 = \"g\", arg1 = \"Test.java\")" + "public class Trigger {\n" + "}" ); AptConfig.setEnabled(jproj, true); // FilerTesterProc looks for the existence and contents of this class: env.addClass(projPath.append(".apt_generated"), "g", "Test", FilerTesterProc.resource01FileContents); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } /** * Call FilerTesterProc.testGetResource02(), which checks getResource() in CLASS_OUTPUT location */ public void testGetResource02() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), "p", "Trigger", "package p;\n" + "import org.eclipse.jdt.apt.pluggable.tests.annotations.FilerTestTrigger;\n" + "@FilerTestTrigger(test = \"testGetResource02\", arg0 = \"t\", arg1 = \"Test.txt\")" + "public class Trigger {\n" + "}" ); AptConfig.setEnabled(jproj, true); // FilerTesterProc looks for the existence and contents of this file after it is copied to the output folder: IFolder textFileFolder = proj.getFolder("src/t"); textFileFolder.create(false, true, null); IFile textFile = proj.getFile(textFileFolder.getProjectRelativePath().append("Test.txt")); InputStream textSource = new ByteArrayInputStream(FilerTesterProc.resource02FileContents.getBytes()); textFile.create(textSource, false, null); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } /** * Call FilerTesterProc.testCreateNonSourceFile(), which creates a non-source output file */ public void testCreateNonSourceFile() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), "p", "Trigger", "package p;\n" + "import org.eclipse.jdt.apt.pluggable.tests.annotations.FilerTestTrigger;\n" + "@FilerTestTrigger(test = \"testCreateNonSourceFile\", arg0 = \"t\", arg1 = \"Test.txt\")" + "public class Trigger {\n" + "}" ); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } /** * Call FilerTesterProc.testNullParents(), which checks handling of null originatingElements * in the Filer.createXxx() methods. */ public void testNullParents() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), "p", "Trigger", "package p;\n" + "import org.eclipse.jdt.apt.pluggable.tests.annotations.FilerTestTrigger;\n" + "@FilerTestTrigger(test = \"testNullParents\", arg0 = \"t\", arg1 = \"Test\")" + "public class Trigger {\n" + "}" ); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); expectingFile(proj, ".apt_generated/t/Test.java"); expectingFile(proj, ".apt_generated/t/Test.txt"); final String[] expectedClasses = { "p.Trigger", "t.Test" }; expectingUniqueCompiledClasses(expectedClasses); } /** * Call FilerTesterProc.testURI, which tests the FileObject.toUri() method on * various different sorts of files */ public void testURI() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), "p", "Trigger", "package p;\n" + "import org.eclipse.jdt.apt.pluggable.tests.annotations.FilerTestTrigger;\n" + "@FilerTestTrigger(test = \"testURI\", arg0 = \"t\", arg1 = \"Test.txt\")" + "public class Trigger {\n" + "}" ); IFolder textFileFolder = proj.getFolder("src/t"); textFileFolder.create(false, true, null); IFile textFile = proj.getFile(textFileFolder.getProjectRelativePath().append("Test.txt")); InputStream textSource = new ByteArrayInputStream(FilerTesterProc.helloStr.getBytes()); textFile.create(textSource, false, null); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } /** * Call FilerTesterProc.testGetCharContentLarge(), which checks FileObject.getCharContent() * for a large (multiple buffers long) file */ public void testGetCharContentLarge() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), "p", "Trigger", "package p;\n" + "import org.eclipse.jdt.apt.pluggable.tests.annotations.FilerTestTrigger;\n" + "@FilerTestTrigger(test = \"testGetCharContentLarge\", arg0 = \"g\", arg1 = \"Test.java\")" + "public class Trigger {\n" + "}" ); AptConfig.setEnabled(jproj, true); // FilerTesterProc looks for the existence and contents of this class: env.addClass(projPath.append(".apt_generated"), "g", "Test", FilerTesterProc.largeJavaClass()); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } }