blob: 3d3b858d6af0dd049da35a361ed06dc943f803d2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Walter Harley 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:
* eclipse@cafewalter.com - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.apt.pluggable.tests;
import java.io.File;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.apt.core.util.AptConfig;
import org.eclipse.jdt.core.IJavaProject;
/**
* Performance tests for use when profiling APT
*/
public class PerformanceTests extends TestBase
{
private final static boolean VERBOSE = true;
private final static int PAUSE_EVERY = 200; // wait for indexer to catch up after creating this many files
private final static int PAUSE_TIME = 2000; // milliseconds to wait for indexer
private final static boolean INCLUDE_APT_DISABLED = true;
private final static String CMD_PROFILER_PREFIX = "java -jar c:/opt/yourkit-8.0.13/lib/yjp-controller-api-redist.jar localhost 10001";
private final static String CMD_START_CPU_PROFILING = CMD_PROFILER_PREFIX + " start-cpu-sampling noj2ee";
private final static String CMD_STOP_CPU_PROFILING = CMD_PROFILER_PREFIX + " stop-cpu-profiling";
private final static String CMD_PERF_SNAPSHOT = CMD_PROFILER_PREFIX + " capture-performance-snapshot";
private final static String CMD_HEAP_SNAPSHOT = CMD_PROFILER_PREFIX + " capture-memory-snapshot";
public PerformanceTests(String name) {
super(name);
}
public static Test suite()
{
return new TestSuite( PerformanceTests.class );
}
public void setUp() throws Exception
{
super.setUp();
}
/**
* Create files that contain annotations that won't be processed.
*/
private void createBoringFiles(int numFiles, IJavaProject jproj)
{
String srcTemplate =
"package p;\n" +
"import java.util.List;\n" +
"@SuppressWarnings(\"unchecked\")\n" +
"public class TestB%05d {\n" +
" private List l = null;\n" +
" public List getL() { return l; }\n" +
"}";
String nameTemplate = "TestB%05d";
createFiles(numFiles, nameTemplate, srcTemplate, jproj);
}
/**
* Create files that contain annotations that will be processed with a Java 6 processor.
*/
private void createInterestingFilesWithJ6(int numFiles, IJavaProject jproj)
{
String srcTemplate =
"package p;\n" +
"import org.eclipse.jdt.apt.pluggable.tests.annotations.ModelTestTrigger;\n" +
"import org.eclipse.jdt.apt.pluggable.tests.annotations.LookAt;\n" +
"import java.util.List;\n" +
"@ModelTestTrigger(test = \"testFieldType\")" +
"@SuppressWarnings(\"unused\")\n" +
"public class TestI6%05d {\n" +
" @LookAt\n" +
" private int _fInt = 0;\n" +
" @LookAt\n" +
" private String _fString = \"\";\n" +
" @LookAt\n" +
" private List<String> _fFoo = null;\n" +
"}";
String nameTemplate = "TestI6%05d";
createFiles(numFiles, nameTemplate, srcTemplate, jproj);
}
/**
* Create files that have annotations that cause other files to be generated.
*/
private void createGeneratingFiles(int numFiles, IJavaProject jproj)
{
String srcTemplate =
"package p;\n" +
"import org.eclipse.jdt.apt.pluggable.tests.annotations.GenClass6;\n" +
"@GenClass6(pkg=\"g\", name=\"Generated%05d\")\n" +
"public class TestG%05d {}";
String nameTemplate = "TestG%05d";
createFiles(numFiles, nameTemplate, srcTemplate, jproj);
}
private void createFiles(int numFiles, String nameTemplate, String srcTemplate, IJavaProject jproj)
{
IProject project = jproj.getProject();
IFolder srcFolder = project.getFolder( "src" );
IPath srcRoot = srcFolder.getFullPath();
for (int i = 1; i <= numFiles; ++i) {
String name = String.format(nameTemplate, i);
String contents = String.format(srcTemplate, i, i);
env.addClass( srcRoot, "p", name, contents ); //$NON-NLS-1$ //$NON-NLS-2$
// pause to let indexer catch up
if (i % PAUSE_EVERY == 0) {
if (VERBOSE)
System.out.println("Created " + i + " files; pausing for indexer");
try {
Thread.sleep(PAUSE_TIME);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
if (VERBOSE)
System.out.println("Done creating source files");
}
/**
* Performance with files that contain annotations that won't be processed.
*/
public void testBoringFiles() throws Exception
{
final int FILES_TO_GENERATE = 2000; // total number of files to create
// set up project with unique name
IJavaProject jproj = createJavaProject(_projectName);
IProject project = jproj.getProject();
createBoringFiles(FILES_TO_GENERATE, jproj);
Runtime run = Runtime.getRuntime();
long start;
if (INCLUDE_APT_DISABLED) {
AptConfig.setEnabled(jproj, false);
start = System.currentTimeMillis();
run.exec(CMD_START_CPU_PROFILING).waitFor();
fullBuild( project.getFullPath() );
if (VERBOSE)
System.out.println("APT disabled: full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
run.exec(CMD_PERF_SNAPSHOT).waitFor();
run.exec(CMD_STOP_CPU_PROFILING).waitFor();
expectingNoProblems();
// System.gc();
// Thread.sleep(1000);
//
// AptConfig.setEnabled(jproj, false);
// start = System.currentTimeMillis();
// fullBuild( project.getFullPath() );
// if (VERBOSE) {
// System.out.println("full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
// System.out.println("Taking heap snapshot");
// }
// run.exec(CMD_HEAP_SNAPSHOT).waitFor();
// expectingNoProblems();
}
System.gc();
Thread.sleep(1000);
AptConfig.setEnabled(jproj, true);
start = System.currentTimeMillis();
if (VERBOSE)
System.out.println("APT enabled: starting full build");
fullBuild( project.getFullPath() );
if (VERBOSE) {
System.out.println("full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
System.out.println("Taking heap snapshot");
}
run.exec(CMD_HEAP_SNAPSHOT).waitFor();
expectingNoProblems();
System.gc();
Thread.sleep(1000);
AptConfig.setEnabled(jproj, true);
start = System.currentTimeMillis();
if (VERBOSE)
System.out.println("APT enabled: starting full build");
run.exec(CMD_START_CPU_PROFILING).waitFor();
fullBuild( project.getFullPath() );
if (VERBOSE)
System.out.println("full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
run.exec(CMD_PERF_SNAPSHOT).waitFor();
run.exec(CMD_STOP_CPU_PROFILING).waitFor();
expectingNoProblems();
System.gc();
Thread.sleep(1000);
AptConfig.setEnabled(jproj, true);
start = System.currentTimeMillis();
if (VERBOSE)
System.out.println("APT enabled: starting full build");
run.exec(CMD_START_CPU_PROFILING).waitFor();
fullBuild( project.getFullPath() );
if (VERBOSE)
System.out.println("full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
run.exec(CMD_PERF_SNAPSHOT).waitFor();
run.exec(CMD_STOP_CPU_PROFILING).waitFor();
expectingNoProblems();
// Now delete the project!
if (VERBOSE)
System.out.println("Deleting workspace");
ResourcesPlugin.getWorkspace().delete(new IResource[] { project }, true, null);
}
/**
* Performance with files that contain annotations that will be processed
* with a Java 6 processor, but no file generation.
*/
public void _testInterestingFilesWithJ6() throws Exception
{
final int FILES_TO_GENERATE = 2000; // total number of files to create
// set up project with unique name
IJavaProject jproj = createJavaProject(_projectName);
IProject project = jproj.getProject();
createInterestingFilesWithJ6(FILES_TO_GENERATE, jproj);
Runtime run = Runtime.getRuntime();
long start;
if (INCLUDE_APT_DISABLED) {
AptConfig.setEnabled(jproj, false);
start = System.currentTimeMillis();
run.exec(CMD_START_CPU_PROFILING).waitFor();
fullBuild( project.getFullPath() );
if (VERBOSE)
System.out.println("APT disabled: full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
run.exec(CMD_PERF_SNAPSHOT).waitFor();
run.exec(CMD_STOP_CPU_PROFILING).waitFor();
expectingNoProblems();
// System.gc();
// Thread.sleep(1000);
//
// AptConfig.setEnabled(jproj, false);
// start = System.currentTimeMillis();
// run.exec(CMD_START_CPU_PROFILING).waitFor();
// fullBuild( project.getFullPath() );
// if (VERBOSE)
// System.out.println("APT disabled: full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
// run.exec(CMD_PERF_SNAPSHOT).waitFor();
// run.exec(CMD_STOP_CPU_PROFILING).waitFor();
// expectingNoProblems();
}
System.gc();
Thread.sleep(1000);
AptConfig.setEnabled(jproj, true);
start = System.currentTimeMillis();
if (VERBOSE)
System.out.println("APT enabled: starting full build");
run.exec(CMD_START_CPU_PROFILING).waitFor();
fullBuild( project.getFullPath() );
if (VERBOSE)
System.out.println("full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
run.exec(CMD_PERF_SNAPSHOT).waitFor();
run.exec(CMD_STOP_CPU_PROFILING).waitFor();
expectingNoProblems();
// System.gc();
// Thread.sleep(1000);
//
// AptConfig.setEnabled(jproj, true);
// start = System.currentTimeMillis();
// if (VERBOSE)
// System.out.println("APT enabled: starting full build");
// run.exec(CMD_START_CPU_PROFILING).waitFor();
// fullBuild( project.getFullPath() );
// if (VERBOSE)
// System.out.println("full build took " + ((System.currentTimeMillis() - start)/1000L) + " sec");
// run.exec(CMD_PERF_SNAPSHOT).waitFor();
// run.exec(CMD_STOP_CPU_PROFILING).waitFor();
// expectingNoProblems();
// Now delete the project!
if (VERBOSE)
System.out.println("Deleting workspace");
ResourcesPlugin.getWorkspace().delete(new IResource[] { project }, true, null);
if (VERBOSE)
System.out.println("Test complete");
}
/**
* Test with files that have meaningful processing (generation of additional types).
* Currently disabled.
*/
public void _testGeneratingLotsOfFiles() throws Exception
{
final int FILES_TO_GENERATE = 4000; // total number of files to create
// set up project with unique name
IJavaProject jproj = createJavaProject(_projectName);
IProject project = jproj.getProject();
createGeneratingFiles(FILES_TO_GENERATE, jproj);
// Set some per-project preferences
AptConfig.setEnabled(jproj, true);
long start = System.currentTimeMillis();
fullBuild( project.getFullPath() );
if (VERBOSE)
System.out.println("Done with build after " + ((System.currentTimeMillis() - start)/1000L) + " sec");
expectingNoProblems();
IPath projPath = jproj.getProject().getLocation();
for (int i = 1; i <= FILES_TO_GENERATE; ++i) {
// check that file was generated
String genFileName = String.format(".apt_generated/g/Generated%05d.java", i);
File genFile = new File(projPath.append(genFileName).toOSString());
assertTrue("Expected generated source file " + genFileName + " was not found", genFile != null && genFile.exists());
// check that generated file was compiled
String genClassName = String.format("bin/g/Generated%05d.class", i);
File genClass = new File(projPath.append(genClassName).toOSString());
assertTrue("Compiled file " + genClassName + " was not found", genClass != null && genClass.exists());
}
if (VERBOSE)
System.out.println("Done checking output");
// Now delete the project!
ResourcesPlugin.getWorkspace().delete(new IResource[] { project }, true, null);
}
}