- Moved benchmarks out of the junit package and into its own
- Mucho refactoring
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1928 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/javadoc/com/google/gwt/examples/benchmarks/AllocBenchmark.java b/user/javadoc/com/google/gwt/examples/benchmarks/AllocBenchmark.java
index 208e52a..4e0d683 100644
--- a/user/javadoc/com/google/gwt/examples/benchmarks/AllocBenchmark.java
+++ b/user/javadoc/com/google/gwt/examples/benchmarks/AllocBenchmark.java
@@ -15,7 +15,7 @@
*/
package com.google.gwt.examples.benchmarks;
-import com.google.gwt.junit.client.Benchmark;
+import com.google.gwt.benchmarks.client.Benchmark;
/**
* Provides profile statistics on allocation times for different kinds of
diff --git a/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListAndVectorBenchmark.java b/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListAndVectorBenchmark.java
index 9a34662..5ed5465 100644
--- a/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListAndVectorBenchmark.java
+++ b/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListAndVectorBenchmark.java
@@ -1,12 +1,12 @@
/*
* Copyright 2007 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,22 +15,22 @@
*/
package com.google.gwt.examples.benchmarks;
-import com.google.gwt.junit.client.IntRange;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.Operator;
-import com.google.gwt.junit.client.Range;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
+import com.google.gwt.benchmarks.client.Range;
-import java.util.Vector;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
/**
- * Benchmarks common operations on both ArrayLists and Vectors.
- * This test covers appends, inserts, and removes for various sizes
- * and positions on both ArrayLists and Vectors.
- *
+ * Benchmarks common operations on both ArrayLists and Vectors. This test covers
+ * appends, inserts, and removes for various sizes and positions on both
+ * ArrayLists and Vectors.
+ *
*/
public class ArrayListAndVectorBenchmark extends Benchmark {
@@ -48,13 +48,13 @@
public static final Range positions = new Range() {
public Iterator iterator() {
- return Arrays.asList( new Position[] {BEGIN, END, NONE, VARIED } ).iterator();
+ return Arrays.asList(new Position[] {BEGIN, END, NONE, VARIED}).iterator();
}
};
public static final Range positions2 = new Range() {
public Iterator iterator() {
- return Arrays.asList( new Position[] {BEGIN, END, VARIED } ).iterator();
+ return Arrays.asList(new Position[] {BEGIN, END, VARIED}).iterator();
}
};
@@ -90,9 +90,10 @@
/**
* Appends <code>size</code> items to an empty ArrayList.
+ *
* @gwt.benchmark.param size -limit = baseRange
*/
- public void testArrayListAdds( Integer size ) {
+ public void testArrayListAdds(Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
list.add("hello");
@@ -104,10 +105,12 @@
}
/**
- * Performs <code>size</code> gets on an ArrayList of size, <code>size</code>.
+ * Performs <code>size</code> gets on an ArrayList of size,
+ * <code>size</code>.
+ *
* @gwt.benchmark.param size -limit = baseRange
*/
- public void testArrayListGets( Integer size ) {
+ public void testArrayListGets(Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
list.get(i);
@@ -119,12 +122,13 @@
}
/**
- * Performs <code>size</code> inserts at position, <code>where</code>, on an
- * empty ArrayList.
+ * Performs <code>size</code> inserts at position, <code>where</code>, on
+ * an empty ArrayList.
+ *
* @gwt.benchmark.param where = Position.positions
* @gwt.benchmark.param size -limit = insertRemoveRange
*/
- public void testArrayListInserts( Position where, Integer size ) {
+ public void testArrayListInserts(Position where, Integer size) {
insertIntoCollection(size, where, list);
}
@@ -133,8 +137,9 @@
}
/**
- * Performs <code>size</code> removes at position, <code>where</code>, on an
- * ArrayList of size, <code>size</code>.
+ * Performs <code>size</code> removes at position, <code>where</code>, on
+ * an ArrayList of size, <code>size</code>.
+ *
* @gwt.benchmark.param where = Position.positions2
* @gwt.benchmark.param size -limit = insertRemoveRange
*/
@@ -148,9 +153,10 @@
/**
* Appends <code>size</code> items to an empty Vector.
+ *
* @gwt.benchmark.param size -limit = baseRange
*/
- public void testVectorAdds( Integer size ) {
+ public void testVectorAdds(Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
vector.add("hello");
@@ -163,9 +169,10 @@
/**
* Performs <code>size</code> gets on a Vector of size, <code>size</code>.
+ *
* @gwt.benchmark.param size -limit = baseRange
*/
- public void testVectorGets( Integer size ) {
+ public void testVectorGets(Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
vector.get(i);
@@ -177,13 +184,14 @@
}
/**
- * Performs <code>size</code> inserts at position, <code>where</code>, on an
- * empty Vector.
+ * Performs <code>size</code> inserts at position, <code>where</code>, on
+ * an empty Vector.
+ *
* @gwt.benchmark.param where = Position.positions
* @gwt.benchmark.param size -limit = insertRemoveRange
*/
public void testVectorInserts(Position where, Integer size) {
- insertIntoCollection( size, where, vector );
+ insertIntoCollection(size, where, vector);
}
// Required for JUnit
@@ -191,25 +199,26 @@
}
/**
- * Performs <code>size</code> removes at position, <code>where</code>, on a
- * Vector of size, <code>size</code>.
+ * Performs <code>size</code> removes at position, <code>where</code>, on
+ * a Vector of size, <code>size</code>.
+ *
* @gwt.benchmark.param where = Position.positions2
* @gwt.benchmark.param size -limit = insertRemoveRange
*/
- public void testVectorRemoves( Position where, Integer size ) {
- removeFromCollection( size, where, vector );
+ public void testVectorRemoves(Position where, Integer size) {
+ removeFromCollection(size, where, vector);
}
// Required for JUnit
public void testVectorRemoves() {
}
- void beginArrayListAdds( Integer size ) {
+ void beginArrayListAdds(Integer size) {
list = new ArrayList();
}
- void beginArrayListGets( Integer size ) {
- createArrayList( size );
+ void beginArrayListGets(Integer size) {
+ createArrayList(size);
}
void beginArrayListInserts(Position where, Integer size) {
@@ -226,32 +235,34 @@
vector = new Vector();
}
- void beginVectorGets( Integer size ) {
- createVector( size );
+ void beginVectorGets(Integer size) {
+ createVector(size);
}
void beginVectorInserts(Position where, Integer size) {
- vector = new Vector(); index = 0;
+ vector = new Vector();
+ index = 0;
}
void beginVectorRemoves(Position where, Integer size) {
- beginVectorInserts(where,size); testVectorInserts(where,size);
+ beginVectorInserts(where, size);
+ testVectorInserts(where, size);
}
- private void createArrayList( Integer size ) {
- beginArrayListAdds( size );
- testArrayListAdds( size );
+ private void createArrayList(Integer size) {
+ beginArrayListAdds(size);
+ testArrayListAdds(size);
}
- private void createVector( Integer size ) {
- beginVectorAdds( size );
- testVectorAdds( size );
+ private void createVector(Integer size) {
+ beginVectorAdds(size);
+ testVectorAdds(size);
}
private void insertIntoCollection(Integer size, Position where, List v) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
- if (where == Position.NONE ) {
+ if (where == Position.NONE) {
v.add("hello");
} else if (where == Position.BEGIN) {
v.add(0, "hello");
@@ -278,7 +289,7 @@
v.remove(index);
index += PRIME;
int currentSize = v.size();
- if ( currentSize > 0 ) {
+ if (currentSize > 0) {
index %= v.size();
}
}
diff --git a/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListBenchmark.java b/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListBenchmark.java
index c9609ff..ffa9ada 100644
--- a/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListBenchmark.java
+++ b/user/javadoc/com/google/gwt/examples/benchmarks/ArrayListBenchmark.java
@@ -1,12 +1,12 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -14,16 +14,17 @@
* the License.
*/
package com.google.gwt.examples.benchmarks;
-import com.google.gwt.junit.client.IntRange;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.Operator;
-import com.google.gwt.junit.client.annotations.RangeField;
-import com.google.gwt.junit.client.annotations.RangeEnum;
-import com.google.gwt.junit.client.annotations.Setup;
-import java.util.List;
-import java.util.Arrays;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
+import com.google.gwt.benchmarks.client.RangeEnum;
+import com.google.gwt.benchmarks.client.RangeField;
+import com.google.gwt.benchmarks.client.Setup;
+
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
/**
* Benchmarks common operations on {@link List Lists}. This test covers
@@ -38,18 +39,16 @@
*/
protected enum Position {
- BEGIN("at the beginning"),
- EXPLICIT_END("explicitly at the end"),
- IMPLICIT_END("implicitly at the end"),
- VARIED("in varied locations");
+ BEGIN("at the beginning"), EXPLICIT_END("explicitly at the end"), IMPLICIT_END(
+ "implicitly at the end"), VARIED("in varied locations");
private String label;
/**
* Constructor for <code>Position</code>.
- *
+ *
* @param label a not <code>null</code> label describing this
- * <code>Position</code>.
+ * <code>Position</code>.
*/
Position(String label) {
this.label = label;
@@ -57,7 +56,7 @@
/**
* Returns the textual description for the position.
- *
+ *
* @return a not <code>null</code> description.
*/
public String toString() {
@@ -65,8 +64,8 @@
}
}
- protected final List<Position> explicitPositions = Arrays
- .asList(Position.BEGIN, Position.EXPLICIT_END, Position.VARIED);
+ protected final List<Position> explicitPositions = Arrays.asList(
+ Position.BEGIN, Position.EXPLICIT_END, Position.VARIED);
protected final IntRange insertRemoveRange = new IntRange(64,
Integer.MAX_VALUE, Operator.MULTIPLY, 2);
@@ -84,11 +83,12 @@
/**
* Appends <code>size</code> items to an empty {@code List}.
- *
+ *
* @param size the size of the {@code List}
*/
@Setup("beginListAdds")
- public void testListAdds(@RangeField("baseRange") Integer size) {
+ public void testListAdds(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
list.add("hello");
@@ -102,11 +102,12 @@
/**
* Performs <code>size</code> gets on a {@code List} of size,
* <code>size</code>.
- *
+ *
* @param size the size of the {@code List}
*/
@Setup("beginListGets")
- public void testListGets(@RangeField("baseRange") Integer size) {
+ public void testListGets(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
list.get(i);
@@ -118,17 +119,17 @@
}
/**
- * Performs <code>size</code> inserts at position, <code>where</code>, on an
- * empty <code>List</code>.
- *
+ * Performs <code>size</code> inserts at position, <code>where</code>, on
+ * an empty <code>List</code>.
+ *
* @param where Where the inserts happen
* @param size The size of the <code>List</code>
- *
+ *
*/
@Setup("beginListInserts")
- public void testListInserts(
- @RangeEnum(Position.class)Position where,
- @RangeField("insertRemoveRange")Integer size) {
+ public void testListInserts(@RangeEnum(Position.class)
+ Position where, @RangeField("insertRemoveRange")
+ Integer size) {
insertIntoCollection(size, where, list);
}
@@ -137,16 +138,16 @@
}
/**
- * Performs <code>size</code> removes at position, <code>where</code>, on an
- * ArrayList of size, <code>size</code>.
- *
+ * Performs <code>size</code> removes at position, <code>where</code>, on
+ * an ArrayList of size, <code>size</code>.
+ *
* @param where Where the inserts happen
* @param size The size of the <code>List</code>
*/
@Setup("beginListRemoves")
- public void testListRemoves(
- @RangeField("explicitPositions")Position where,
- @RangeField("insertRemoveRange")Integer size) {
+ public void testListRemoves(@RangeField("explicitPositions")
+ Position where, @RangeField("insertRemoveRange")
+ Integer size) {
removeFromCollection(size, where, list);
}
@@ -156,7 +157,7 @@
/**
* Creates a new empty List.
- *
+ *
* @return a not <code>null</code>, empty List
*/
protected List<String> newList() {
diff --git a/user/src/com/google/gwt/junit/benchmarks/BenchmarkReport.java b/user/src/com/google/gwt/benchmarks/BenchmarkReport.java
similarity index 94%
rename from user/src/com/google/gwt/junit/benchmarks/BenchmarkReport.java
rename to user/src/com/google/gwt/benchmarks/BenchmarkReport.java
index aa6b05f..07ea13a 100644
--- a/user/src/com/google/gwt/junit/benchmarks/BenchmarkReport.java
+++ b/user/src/com/google/gwt/benchmarks/BenchmarkReport.java
@@ -13,8 +13,11 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.benchmarks;
+package com.google.gwt.benchmarks;
+import com.google.gwt.benchmarks.client.impl.BenchmarkResults;
+import com.google.gwt.benchmarks.client.impl.Trial;
+import com.google.gwt.benchmarks.rebind.BenchmarkGenerator;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.typeinfo.HasAnnotations;
import com.google.gwt.core.ext.typeinfo.HasMetaData;
@@ -22,9 +25,6 @@
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.dev.util.Util;
-import com.google.gwt.junit.client.TestResults;
-import com.google.gwt.junit.client.Trial;
-import com.google.gwt.junit.rebind.BenchmarkGenerator;
import com.google.gwt.util.tools.Utility;
import junit.framework.TestCase;
@@ -65,11 +65,11 @@
private MetaData metaData;
- private List<TestResults> results;
+ private List<BenchmarkResults> results;
private TestCase test;
- BenchmarkXml(TestCase test, List<TestResults> results) {
+ BenchmarkXml(TestCase test, List<BenchmarkResults> results) {
this.test = test;
this.results = results;
Map<String, MetaData> methodMetaData = testMetaData.get(test.getClass().toString());
@@ -91,18 +91,26 @@
// TODO(tobyr): create target_code element
- for (TestResults result : results) {
+ for (BenchmarkResults result : results) {
benchmark.appendChild(toElement(doc, result));
}
return benchmark;
}
- private Element toElement(Document doc, TestResults result) {
+ private Element toElement(Document doc, BenchmarkResults result) {
Element resultElement = doc.createElement("result");
resultElement.setAttribute("host", result.getHost());
resultElement.setAttribute("agent", result.getAgent());
+ Throwable exception = result.getException();
+
+ if (exception != null) {
+ Element exceptionElement = doc.createElement("exception");
+ exceptionElement.appendChild(doc.createTextNode(exception.toString()));
+ resultElement.appendChild(exceptionElement);
+ }
+
List<Trial> trials = result.getTrials();
for (Trial trial : trials) {
@@ -130,14 +138,6 @@
trialElement.setAttribute("timing",
String.valueOf(trial.getRunTimeMillis()));
- Throwable exception = trial.getException();
-
- if (exception != null) {
- Element exceptionElement = doc.createElement("exception");
- exceptionElement.appendChild(doc.createTextNode(exception.toString()));
- trialElement.appendChild(exceptionElement);
- }
-
return trialElement;
}
}
@@ -225,9 +225,9 @@
// Add each test result into the report.
// Add the category for the test result, if necessary.
- for (Map.Entry<TestCase, List<TestResults>> entry : testResults.entrySet()) {
+ for (Map.Entry<TestCase, List<BenchmarkResults>> entry : testResults.entrySet()) {
TestCase test = entry.getKey();
- List<TestResults> results = entry.getValue();
+ List<BenchmarkResults> results = entry.getValue();
BenchmarkXml xml = new BenchmarkXml(test, results);
Element categoryElement = getCategoryElement(doc, report,
xml.metaData.getCategory().getClassName());
@@ -320,7 +320,7 @@
private Map<String, Map<String, MetaData>> testMetaData = new HashMap<String, Map<String, MetaData>>();
- private Map<TestCase, List<TestResults>> testResults = new HashMap<TestCase, List<TestResults>>();
+ private Map<TestCase, List<BenchmarkResults>> testResults = new HashMap<TestCase, List<BenchmarkResults>>();
private TypeOracle typeOracle;
@@ -384,10 +384,10 @@
}
}
- public void addBenchmarkResults(TestCase test, TestResults results) {
- List<TestResults> currentResults = testResults.get(test);
+ public void addBenchmarkResults(TestCase test, BenchmarkResults results) {
+ List<BenchmarkResults> currentResults = testResults.get(test);
if (currentResults == null) {
- currentResults = new ArrayList<TestResults>();
+ currentResults = new ArrayList<BenchmarkResults>();
testResults.put(test, currentResults);
}
currentResults.add(results);
diff --git a/user/src/com/google/gwt/benchmarks/BenchmarkShell.java b/user/src/com/google/gwt/benchmarks/BenchmarkShell.java
new file mode 100644
index 0000000..d556134
--- /dev/null
+++ b/user/src/com/google/gwt/benchmarks/BenchmarkShell.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.benchmarks;
+
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.impl.BenchmarkResults;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.junit.JUnitShell;
+import com.google.gwt.junit.JUnitShell.Strategy;
+import com.google.gwt.junit.client.impl.JUnitResult;
+
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+
+import java.io.File;
+import java.util.Date;
+
+/**
+ * This class is responsible for hosting BenchMarks test case execution.
+ *
+ * @see JUnitShell
+ */
+public class BenchmarkShell {
+
+ private static class BenchmarkStrategy implements Strategy {
+ public String getModuleInherit() {
+ return "com.google.gwt.benchmarks.Benchmarks";
+ }
+
+ public String getSyntheticModuleExtension() {
+ return "Benchmarks";
+ }
+
+ public void processResult(TestCase testCase, JUnitResult result) {
+ report.addBenchmarkResults(testCase, (BenchmarkResults) result);
+ }
+ }
+
+ /**
+ * Executes shutdown logic for JUnitShell
+ *
+ * Sadly, there's no simple way to know when all unit tests have finished
+ * executing. So this class is registered as a VM shutdown hook so that work
+ * can be done at the end of testing - for example, writing out the reports.
+ */
+ private static class Shutdown implements Runnable {
+
+ public void run() {
+ try {
+ String reportPath = System.getProperty(Benchmark.REPORT_PATH);
+ if (reportPath == null || reportPath.trim().equals("")) {
+ reportPath = System.getProperty("user.dir");
+ }
+ report.generate(reportPath + File.separator + "report-"
+ + new Date().getTime() + ".xml");
+ } catch (Exception e) {
+ // It really doesn't matter how we got here.
+ // Regardless of the failure, the VM is shutting down.
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * The result of benchmark runs.
+ */
+ private static BenchmarkReport report = new BenchmarkReport();
+
+ private static boolean shutdownHookSet = false;
+
+ /**
+ * Called by {@link com.google.gwt.benchmarks.rebind.BenchmarkGenerator} to
+ * add test meta data to the test report.
+ *
+ * @return The {@link BenchmarkReport} that belongs to the singleton {@link
+ * JUnitShell}, or <code>null</code> if no such singleton exists.
+ */
+ public static BenchmarkReport getReport() {
+ return report;
+ }
+
+ public static void runTest(String moduleName, TestCase testCase,
+ TestResult testResult) throws UnableToCompleteException {
+ if (!shutdownHookSet) {
+ shutdownHookSet = true;
+ Runtime.getRuntime().addShutdownHook(new Thread(new Shutdown()));
+ }
+ JUnitShell.runTest(moduleName, testCase, testResult,
+ new BenchmarkStrategy());
+ }
+
+ private BenchmarkShell() {
+ }
+}
diff --git a/user/src/com/google/gwt/benchmarks/Benchmarks.gwt.xml b/user/src/com/google/gwt/benchmarks/Benchmarks.gwt.xml
new file mode 100644
index 0000000..94af64f
--- /dev/null
+++ b/user/src/com/google/gwt/benchmarks/Benchmarks.gwt.xml
@@ -0,0 +1,30 @@
+<!-- -->
+<!-- Copyright 2008 Google Inc. -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you -->
+<!-- may not use this file except in compliance with the License. You may -->
+<!-- may obtain a copy of the License at -->
+<!-- -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0 -->
+<!-- -->
+<!-- Unless required by applicable law or agreed to in writing, software -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS, -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -->
+<!-- implied. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+
+<!-- Deferred binding rules for browser selection. -->
+<!-- -->
+<!-- Do not inherit this module directly. Running GWTTestCase under JUnit -->
+<!-- will inherit this module automatically. -->
+<module>
+ <inherits name="com.google.gwt.junit.JUnit"/>
+
+ <super-source path="translatable"/>
+
+ <source path="client"/>
+
+ <generate-with class="com.google.gwt.benchmarks.rebind.BenchmarkGenerator">
+ <when-type-assignable class="com.google.gwt.benchmarks.client.Benchmark"/>
+ </generate-with>
+
+</module>
diff --git a/user/src/com/google/gwt/junit/benchmarks/CategoryImpl.java b/user/src/com/google/gwt/benchmarks/CategoryImpl.java
similarity index 96%
rename from user/src/com/google/gwt/junit/benchmarks/CategoryImpl.java
rename to user/src/com/google/gwt/benchmarks/CategoryImpl.java
index 9d621ad..b1bf1de 100644
--- a/user/src/com/google/gwt/junit/benchmarks/CategoryImpl.java
+++ b/user/src/com/google/gwt/benchmarks/CategoryImpl.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.benchmarks;
+package com.google.gwt.benchmarks;
/**
* Benchmark Category information. Part of the overall MetaData for a Benchmark.
diff --git a/user/src/com/google/gwt/junit/benchmarks/MetaData.java b/user/src/com/google/gwt/benchmarks/MetaData.java
similarity index 97%
rename from user/src/com/google/gwt/junit/benchmarks/MetaData.java
rename to user/src/com/google/gwt/benchmarks/MetaData.java
index 043f7de..7e57c9b 100644
--- a/user/src/com/google/gwt/junit/benchmarks/MetaData.java
+++ b/user/src/com/google/gwt/benchmarks/MetaData.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.benchmarks;
+package com.google.gwt.benchmarks;
/**
* The benchmark metadata for a single benchmark method.
diff --git a/user/src/com/google/gwt/junit/client/Benchmark.java b/user/src/com/google/gwt/benchmarks/client/Benchmark.java
similarity index 73%
rename from user/src/com/google/gwt/junit/client/Benchmark.java
rename to user/src/com/google/gwt/benchmarks/client/Benchmark.java
index f5e9b6c..32d69b7 100644
--- a/user/src/com/google/gwt/junit/client/Benchmark.java
+++ b/user/src/com/google/gwt/benchmarks/client/Benchmark.java
@@ -13,7 +13,10 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
+
+import com.google.gwt.benchmarks.BenchmarkShell;
+import com.google.gwt.junit.client.GWTTestCase;
/**
* A type of {@link com.google.gwt.junit.client.GWTTestCase} which specifically
@@ -32,9 +35,8 @@
* GWT supports test methods that have parameters. GWT will execute each
* benchmark method multiple times in order to exhaustively test all the
* possible combinations of parameter values. All of your test method parameters
- * must be annotated with a {@code Range} annotation such as
- * {@link com.google.gwt.junit.client.annotations.RangeField RangeField} or
- * {@link com.google.gwt.junit.client.annotations.RangeEnum RangeEnum}.
+ * must be annotated with a {@code Range} annotation such as {@link RangeField}
+ * or {@link RangeEnum}.
*
* For example,
*
@@ -51,17 +53,14 @@
* <li>GWT automatically removes jitter from your benchmark methods by running
* them for a minimum period of time (150ms).</li>
*
- * <li>GWT supports
- * {@link com.google.gwt.junit.client.annotations.IterationTimeLimit time
- * limits} on the maximum duration of each permutation of a benchmark method.
- * With this feature, you can supply very high upper bounds on your ranges (such
- * as Integer.MAX_VALUE), which future-proofs your benchmarks against faster
- * hardware. </li>
+ * <li>GWT supports {@link IterationTimeLimit time limits} on the maximum
+ * duration of each permutation of a benchmark method. With this feature, you
+ * can supply very high upper bounds on your ranges (such as Integer.MAX_VALUE),
+ * which future-proofs your benchmarks against faster hardware. </li>
*
- * <li>GWT supports {@link com.google.gwt.junit.client.annotations.Setup Setup}
- * and {@link com.google.gwt.junit.client.annotations.Teardown Teardown} methods
- * which separate test overhead from the actual work being benchmarked. The
- * timings of these lifecycle methods are excluded from test results. </li>
+ * <li>GWT supports {@link Setup} and {@link Teardown} methods which separate
+ * test overhead from the actual work being benchmarked. The timings of these
+ * lifecycle methods are excluded from test results. </li>
* </ul>
*
* <h2>Notes</h2>
@@ -101,4 +100,21 @@
* working directory.
*/
public static final String REPORT_PATH = "com.google.gwt.junit.reportPath";
+
+ /**
+ * Runs the test via the {@link com.google.gwt.benchmarks.BenchmarkShell}
+ * environment. Do not override or call this method.
+ */
+ @Override
+ protected final void runTest() throws Throwable {
+ BenchmarkShell.runTest(getModuleName(), this, testResult);
+ }
+
+ /**
+ * Benchmarks do not support asynchronous mode.
+ */
+ protected final boolean supportsAsync() {
+ return false;
+ }
+
}
diff --git a/user/src/com/google/gwt/junit/client/Category.java b/user/src/com/google/gwt/benchmarks/client/Category.java
similarity index 94%
rename from user/src/com/google/gwt/junit/client/Category.java
rename to user/src/com/google/gwt/benchmarks/client/Category.java
index ff9c233..22d537b 100644
--- a/user/src/com/google/gwt/junit/client/Category.java
+++ b/user/src/com/google/gwt/benchmarks/client/Category.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
/**
* A named category that provides classification for
diff --git a/user/src/com/google/gwt/junit/client/IntRange.java b/user/src/com/google/gwt/benchmarks/client/IntRange.java
similarity index 88%
rename from user/src/com/google/gwt/junit/client/IntRange.java
rename to user/src/com/google/gwt/benchmarks/client/IntRange.java
index ef81343..0daf451 100644
--- a/user/src/com/google/gwt/junit/client/IntRange.java
+++ b/user/src/com/google/gwt/benchmarks/client/IntRange.java
@@ -1,10 +1,10 @@
/*
* Copyright 2007 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -13,19 +13,18 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
/**
- * A {@link com.google.gwt.junit.client.Range} that iterates over a start and
- * end value by a stepping function. Typically used by benchmarks to supply a
- * range of values over an integral parameter, such as size or length.
- *
+ * Iterates over a start and end value by a stepping function. Typically used by
+ * benchmarks to supply a range of values over an integral parameter, such as
+ * size or length.
*/
public class IntRange implements Range<Integer> {
/**
* Implementation of the Iterator.
- *
+ *
*/
private static class IntRangeIterator extends RangeIterator<Integer> {
@@ -81,7 +80,7 @@
* <code>start</code>, end at <code>end</code> and increment by the
* stepping function described by <code>operator</code> and
* <code>step</code>.
- *
+ *
* @param start Initial starting value, inclusive.
* @param end Ending value, inclusive.
* @param operator The function used to step.
diff --git a/user/src/com/google/gwt/junit/client/annotations/IterationTimeLimit.java b/user/src/com/google/gwt/benchmarks/client/IterationTimeLimit.java
similarity index 84%
rename from user/src/com/google/gwt/junit/client/annotations/IterationTimeLimit.java
rename to user/src/com/google/gwt/benchmarks/client/IterationTimeLimit.java
index 275aae1..e24276b 100644
--- a/user/src/com/google/gwt/junit/client/annotations/IterationTimeLimit.java
+++ b/user/src/com/google/gwt/benchmarks/client/IterationTimeLimit.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.annotations;
+package com.google.gwt.benchmarks.client;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@@ -21,9 +21,8 @@
/**
* Specifies a custom time limit for iterations on the decorated
- * {@link com.google.gwt.junit.client.Benchmark Benchmark} method. Methods that
- * aren't explicitly decorated with an IterationTimeLimit, receive the default
- * value.
+ * {@link Benchmark} method. Methods that aren't explicitly decorated with an
+ * IterationTimeLimit, receive the default value.
*/
@Target(ElementType.METHOD)
@Documented
diff --git a/user/src/com/google/gwt/junit/client/Operator.java b/user/src/com/google/gwt/benchmarks/client/Operator.java
similarity index 87%
rename from user/src/com/google/gwt/junit/client/Operator.java
rename to user/src/com/google/gwt/benchmarks/client/Operator.java
index 59f8fad..a4d30b4 100644
--- a/user/src/com/google/gwt/junit/client/Operator.java
+++ b/user/src/com/google/gwt/benchmarks/client/Operator.java
@@ -13,11 +13,11 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
/**
- * A mathematical operator used in {@link com.google.gwt.junit.client.Range}s
- * to indicate the stepping function.
+ * A mathematical operator used in {@link Range}s to indicate the stepping
+ * function.
*/
public final class Operator {
diff --git a/user/src/com/google/gwt/junit/client/Range.java b/user/src/com/google/gwt/benchmarks/client/Range.java
similarity index 80%
rename from user/src/com/google/gwt/junit/client/Range.java
rename to user/src/com/google/gwt/benchmarks/client/Range.java
index db00c8a..b4d21fd 100644
--- a/user/src/com/google/gwt/junit/client/Range.java
+++ b/user/src/com/google/gwt/benchmarks/client/Range.java
@@ -1,31 +1,29 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
/**
* A range of values for a Benchmark parameter.
- *
+ *
* A Range produces an Iterator that contains all of the values that a Benchmark
* parameter should be tested over.
- *
- * Range is unlikely to provide any extra semantics above what you would get
- * with java.util.Iterable, but it was introduced before GWT's JDK 1.5 support.
- *
- * @param <T> the type that this range contains
*
+ * @param <T> the type that this range contains
+ * @deprecated This class was introduced before JDK 1.5 support. Just use
+ * {@link Iterable}.
*/
public interface Range<T> extends Iterable<T> {
}
diff --git a/user/src/com/google/gwt/junit/client/annotations/RangeEnum.java b/user/src/com/google/gwt/benchmarks/client/RangeEnum.java
similarity index 90%
rename from user/src/com/google/gwt/junit/client/annotations/RangeEnum.java
rename to user/src/com/google/gwt/benchmarks/client/RangeEnum.java
index a828d39..da69913 100644
--- a/user/src/com/google/gwt/junit/client/annotations/RangeEnum.java
+++ b/user/src/com/google/gwt/benchmarks/client/RangeEnum.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.annotations;
+package com.google.gwt.benchmarks.client;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@@ -21,7 +21,7 @@
/**
* Specifies an Enum containing the entire range of values for a parameter to a
- * {@link com.google.gwt.junit.client.Benchmark} method.
+ * {@link Benchmark} method.
*/
@Target(ElementType.PARAMETER)
@Documented
diff --git a/user/src/com/google/gwt/junit/client/annotations/RangeField.java b/user/src/com/google/gwt/benchmarks/client/RangeField.java
similarity index 77%
rename from user/src/com/google/gwt/junit/client/annotations/RangeField.java
rename to user/src/com/google/gwt/benchmarks/client/RangeField.java
index 70d40db..e05b885 100644
--- a/user/src/com/google/gwt/junit/client/annotations/RangeField.java
+++ b/user/src/com/google/gwt/benchmarks/client/RangeField.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.annotations;
+package com.google.gwt.benchmarks.client;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@@ -21,10 +21,9 @@
/**
* Specifies a field containing the entire range of values for a parameter to a
- * {@link com.google.gwt.junit.client.Benchmark} method. The field must belong
- * to the same class being decorated by this annotation. The field must be
- * either an Iterable, Enum, or array whose type matches the parameter being
- * annotated.
+ * {@link Benchmark} method. The field must belong to the same class being
+ * decorated by this annotation. The field must be either an Iterable, Enum, or
+ * array whose type matches the parameter being annotated.
*
* @see RangeEnum
*/
diff --git a/user/src/com/google/gwt/junit/client/RangeIterator.java b/user/src/com/google/gwt/benchmarks/client/RangeIterator.java
similarity index 95%
rename from user/src/com/google/gwt/junit/client/RangeIterator.java
rename to user/src/com/google/gwt/benchmarks/client/RangeIterator.java
index 738ed5a..9f345cc 100644
--- a/user/src/com/google/gwt/junit/client/RangeIterator.java
+++ b/user/src/com/google/gwt/benchmarks/client/RangeIterator.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
import java.util.Iterator;
diff --git a/user/src/com/google/gwt/junit/client/annotations/Setup.java b/user/src/com/google/gwt/benchmarks/client/Setup.java
similarity index 81%
rename from user/src/com/google/gwt/junit/client/annotations/Setup.java
rename to user/src/com/google/gwt/benchmarks/client/Setup.java
index 12b37b6..6cc1d0f 100644
--- a/user/src/com/google/gwt/junit/client/annotations/Setup.java
+++ b/user/src/com/google/gwt/benchmarks/client/Setup.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.annotations;
+package com.google.gwt.benchmarks.client;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@@ -21,9 +21,9 @@
/**
* Specifies a setup method that will be executed before the annotated
- * {@link com.google.gwt.junit.client.Benchmark} test method. Setup methods are
- * automatically executed by the benchmarking framework before their matching
- * test methods. Setup measurements are excluded from final benchmark reports.
+ * {@link Benchmark} test method. Setup methods are automatically executed by
+ * the benchmarking framework before their matching test methods. Setup
+ * measurements are excluded from final benchmark reports.
*
* <p>
* For example, you might annotate a {@code Benchmark} method named
diff --git a/user/src/com/google/gwt/junit/client/annotations/Teardown.java b/user/src/com/google/gwt/benchmarks/client/Teardown.java
similarity index 80%
rename from user/src/com/google/gwt/junit/client/annotations/Teardown.java
rename to user/src/com/google/gwt/benchmarks/client/Teardown.java
index 36971b8..22bd302 100644
--- a/user/src/com/google/gwt/junit/client/annotations/Teardown.java
+++ b/user/src/com/google/gwt/benchmarks/client/Teardown.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.annotations;
+package com.google.gwt.benchmarks.client;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -21,10 +21,9 @@
/**
* Specifies a teardown method that will be executed after the annotated
- * {@link com.google.gwt.junit.client.Benchmark} test method. Teardown methods
- * are automatically executed by the benchmarking framework after their matching
- * test methods. Teardown measurements are excluded from final benchmark
- * reports.
+ * {@link Benchmark} test method. Teardown methods are automatically executed by
+ * the benchmarking framework after their matching test methods. Teardown
+ * measurements are excluded from final benchmark reports.
*
* <p>
* For example, you might annotate a {@code Benchmark} method named
diff --git a/user/src/com/google/gwt/junit/client/TestResults.java b/user/src/com/google/gwt/benchmarks/client/impl/BenchmarkResults.java
similarity index 62%
rename from user/src/com/google/gwt/junit/client/TestResults.java
rename to user/src/com/google/gwt/benchmarks/client/impl/BenchmarkResults.java
index 74ebccb..fe4c4f4 100644
--- a/user/src/com/google/gwt/junit/client/TestResults.java
+++ b/user/src/com/google/gwt/benchmarks/client/impl/BenchmarkResults.java
@@ -13,31 +13,28 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client.impl;
+import com.google.gwt.junit.client.impl.JUnitResult;
import com.google.gwt.user.client.rpc.IsSerializable;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
/**
- * Encapsulates the results of the execution of a single benchmark. A TestResult
- * is constructed transparently within a benchmark and reported back to the
- * JUnit RPC server, JUnitHost. It's then shared (via JUnitMessageQueue) with
- * JUnitShell and aggregated in BenchmarkReport with other TestResults.
+ * Encapsulates the results of the execution of a single benchmark. A
+ * BenchmarkResults is constructed transparently within a benchmark and reported
+ * back to the JUnit RPC server, JUnitHost. It's then shared (via
+ * JUnitMessageQueue) with JUnitShell and aggregated in BenchmarkReport with
+ * other BenchmarkResults.
*
* @skip
* @see com.google.gwt.junit.client.impl.JUnitHost
* @see com.google.gwt.junit.JUnitMessageQueue
* @see com.google.gwt.junit.JUnitShell
- * @see com.google.gwt.junit.benchmarks.BenchmarkReport
+ * @see com.google.gwt.benchmarks.BenchmarkReport
*/
-public class TestResults implements IsSerializable {
-
- // Computed at the server, via HTTP header.
- private String agent;
-
- private String host;
+public class BenchmarkResults extends JUnitResult implements IsSerializable {
/**
* The URL of the document on the browser (document.location). This is used to
@@ -51,19 +48,7 @@
*/
private String sourceRef;
- private List<Trial> trials;
-
- public TestResults() {
- trials = new ArrayList<Trial>();
- }
-
- public String getAgent() {
- return agent;
- }
-
- public String getHost() {
- return host;
- }
+ private List<Trial> trials = new ArrayList<Trial>();
public String getSourceRef() {
return sourceRef;
@@ -73,25 +58,18 @@
return trials;
}
- public void setAgent(String agent) {
- this.agent = agent;
- }
-
- public void setHost(String host) {
- this.host = host;
- }
-
public void setSourceRef(String sourceRef) {
this.sourceRef = sourceRef;
}
- public void setTrials(List<Trial> trials) {
- this.trials = trials;
- }
-
@Override
public String toString() {
- return "trials: " + trials + ", sourceRef: " + sourceRef + ", agent: "
- + agent + ", host: " + host;
+ return "BenchmarkResults {" + toStringInner() + "}";
}
+
+ protected String toStringInner() {
+ return super.toStringInner() + ", trials: " + trials + ", sourceRef: "
+ + sourceRef;
+ }
+
}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/junit/client/impl/IterableAdapter.java b/user/src/com/google/gwt/benchmarks/client/impl/IterableAdapter.java
similarity index 96%
rename from user/src/com/google/gwt/junit/client/impl/IterableAdapter.java
rename to user/src/com/google/gwt/benchmarks/client/impl/IterableAdapter.java
index 140c6a5..87ecd6e 100644
--- a/user/src/com/google/gwt/junit/client/impl/IterableAdapter.java
+++ b/user/src/com/google/gwt/benchmarks/client/impl/IterableAdapter.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.impl;
+package com.google.gwt.benchmarks.client.impl;
import java.util.Arrays;
diff --git a/user/src/com/google/gwt/junit/client/impl/PermutationIterator.java b/user/src/com/google/gwt/benchmarks/client/impl/PermutationIterator.java
similarity index 99%
rename from user/src/com/google/gwt/junit/client/impl/PermutationIterator.java
rename to user/src/com/google/gwt/benchmarks/client/impl/PermutationIterator.java
index 9f3ce45..2269b71 100644
--- a/user/src/com/google/gwt/junit/client/impl/PermutationIterator.java
+++ b/user/src/com/google/gwt/benchmarks/client/impl/PermutationIterator.java
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client.impl;
+package com.google.gwt.benchmarks.client.impl;
import java.util.Iterator;
import java.util.List;
diff --git a/user/src/com/google/gwt/benchmarks/client/impl/Trial.java b/user/src/com/google/gwt/benchmarks/client/impl/Trial.java
new file mode 100644
index 0000000..e89e297
--- /dev/null
+++ b/user/src/com/google/gwt/benchmarks/client/impl/Trial.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.benchmarks.client.impl;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * The result of a single trial-run of a single benchmark method. Each Trial
+ * contains the results of running a benchmark method with one set of values for
+ * its parameters. TestResults for a method will contain Trials for all
+ * permutations of the parameter values. For test methods without parameters,
+ * there is only 1 trial result.
+ *
+ * @skip
+ */
+public class Trial implements IsSerializable {
+
+ private double runTimeMillis;
+
+ private Map<String, String> variables = new HashMap<String, String>();
+
+ public double getRunTimeMillis() {
+ return runTimeMillis;
+ }
+
+ /**
+ * Returns the names and values of the variables used in the test. If there
+ * were no variables, the map is empty.
+ */
+ public Map<String, String> getVariables() {
+ return variables;
+ }
+
+ public void setRunTimeMillis(double runTimeMillis) {
+ this.runTimeMillis = runTimeMillis;
+ }
+
+ @Override
+ public String toString() {
+ return "variables: " + variables + ", runTimeMillis: " + runTimeMillis;
+ }
+}
diff --git a/user/src/com/google/gwt/benchmarks/client/package.html b/user/src/com/google/gwt/benchmarks/client/package.html
new file mode 100644
index 0000000..ee7bb32
--- /dev/null
+++ b/user/src/com/google/gwt/benchmarks/client/package.html
@@ -0,0 +1,5 @@
+<html>
+<body>
+Classes and modules used in building benchmarks.
+</body>
+</html>
diff --git a/user/src/com/google/gwt/junit/rebind/BenchmarkGenerator.java b/user/src/com/google/gwt/benchmarks/rebind/BenchmarkGenerator.java
similarity index 88%
rename from user/src/com/google/gwt/junit/rebind/BenchmarkGenerator.java
rename to user/src/com/google/gwt/benchmarks/rebind/BenchmarkGenerator.java
index 9fb05f8..6413c5d 100644
--- a/user/src/com/google/gwt/junit/rebind/BenchmarkGenerator.java
+++ b/user/src/com/google/gwt/benchmarks/rebind/BenchmarkGenerator.java
@@ -13,8 +13,19 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.rebind;
+package com.google.gwt.benchmarks.rebind;
+import com.google.gwt.benchmarks.BenchmarkShell;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IterationTimeLimit;
+import com.google.gwt.benchmarks.client.RangeEnum;
+import com.google.gwt.benchmarks.client.RangeField;
+import com.google.gwt.benchmarks.client.Setup;
+import com.google.gwt.benchmarks.client.Teardown;
+import com.google.gwt.benchmarks.client.impl.BenchmarkResults;
+import com.google.gwt.benchmarks.client.impl.IterableAdapter;
+import com.google.gwt.benchmarks.client.impl.PermutationIterator;
+import com.google.gwt.benchmarks.client.impl.Trial;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -26,13 +37,9 @@
import com.google.gwt.dev.generator.ast.Statement;
import com.google.gwt.dev.generator.ast.Statements;
import com.google.gwt.dev.generator.ast.StatementsList;
-import com.google.gwt.junit.JUnitShell;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.annotations.IterationTimeLimit;
-import com.google.gwt.junit.client.annotations.RangeEnum;
-import com.google.gwt.junit.client.annotations.RangeField;
-import com.google.gwt.junit.client.annotations.Setup;
-import com.google.gwt.junit.client.annotations.Teardown;
+import com.google.gwt.junit.rebind.JUnitTestCaseStubGenerator;
+import com.google.gwt.user.client.DeferredCommand;
+import com.google.gwt.user.client.IncrementalCommand;
import com.google.gwt.user.rebind.SourceWriter;
import java.lang.reflect.Method;
@@ -50,21 +57,30 @@
public class BenchmarkGenerator extends JUnitTestCaseStubGenerator {
private static class MutableLong {
-
long value;
}
private static final String BEGIN_PREFIX = "begin";
+ private static final String BENCHMARK_CLASS = Benchmark.class.getName();
+
private static final String BENCHMARK_PARAM_META = "gwt.benchmark.param";
+ private static final String BENCHMARK_RESULTS_CLASS = BenchmarkResults.class.getName();
+
+ private static long defaultTimeout = -1;
+
private static final String EMPTY_FUNC = "__emptyFunc";
private static final String END_PREFIX = "end";
private static final String ESCAPE_LOOP = "__escapeLoop";
- private static long defaultTimeout = -1;
+ private static final String ITERABLE_ADAPTER_CLASS = IterableAdapter.class.getName();
+
+ private static final String PERMUTATION_ITERATOR_CLASS = PermutationIterator.class.getName();
+
+ private static final String TRIAL_CLASS = Trial.class.getName();
/**
* Returns all the zero-argument JUnit test methods that do not have
@@ -118,8 +134,8 @@
if (methods.size() > 2) {
String msg = requestedClass + "." + name
- + " has more than one overloaded version.\n"
- + "It will not be included in the test case execution.";
+ + " has more than one overloaded version"
+ + "; it will not be included in the test case execution";
logger.log(TreeLogger.WARN, msg, null);
continue;
}
@@ -134,8 +150,8 @@
* test to make the benchmarks run correctly (JUnit artifact).
*/
String msg = requestedClass + "." + name
- + " does not have a zero-argument overload.\n"
- + "It will not be included in the test case execution.";
+ + " does not have a zero-argument overload"
+ + "; it will not be included in the test case execution";
logger.log(TreeLogger.WARN, msg, null);
}
// Only a zero-argument version, we don't need to process it.
@@ -161,8 +177,8 @@
if (noArgMethod == null) {
String msg = requestedClass + "." + name
- + " does not have a zero-argument overload.\n"
- + "It will not be included in the test case execution.";
+ + " does not have a zero-argument overload"
+ + "; it will not be included in the test case execution";
logger.log(TreeLogger.WARN, msg, null);
continue;
}
@@ -222,14 +238,14 @@
super.writeSource();
deprecationBranch = logger.branch(TreeLogger.TRACE,
- "Scanning Benchmarks for deprecated annotations; " + "Please see "
- + Benchmark.class.getName() + " for more information.", null);
+ "Scanning Benchmarks for deprecated annotations; please see "
+ + BENCHMARK_CLASS + " for more information", null);
generateEmptyFunc(getSourceWriter());
implementZeroArgTestMethods();
implementParameterizedTestMethods();
generateAsyncCode();
- JUnitShell.getReport().addBenchmark(logger, deprecationBranch,
+ BenchmarkShell.getReport().addBenchmark(logger, deprecationBranch,
getRequestedClass(), getTypeOracle());
}
@@ -372,7 +388,7 @@
* making it a JSNI call. This works as of 1.3 RC 2, but smarter versions of
* the compiler may be able to inline JSNI.
*
- * Things actually get pretty squirrely in general when benchmarking function
+ * Things actually get pretty squirrelly in general when benchmarking function
* call overhead, because, depending upon the benchmark, the compiler may
* inline the benchmark into our benchmark loop, negating the cost we thought
* we were measuring.
@@ -380,7 +396,7 @@
* The best way to deal with this is for users to write micro-benchmarks such
* that the micro-benchmark does significantly more work than a function call.
* For example, if micro-benchmarking a function call, perform the function
- * call 100K times within the microbenchmark itself.
+ * call 100K times within the micro-benchmark itself.
*/
private void generateEmptyFunc(SourceWriter writer) {
writer.println("private native void " + EMPTY_FUNC + "() /*-{");
@@ -474,8 +490,8 @@
deprecationBranch.log(TreeLogger.WARN, "Deprecated use of "
+ BENCHMARK_PARAM_META + " at " + method.getEnclosingType() + " in "
- + method + "; Please use the new Benchmark JDK 1.5 annotations in "
- + "com.google.gwt.junit.client.annotations.", null);
+ + method + "; please use the new Benchmark JDK 1.5 annotations in "
+ + "com.google.gwt.benchmark.client", null);
Map<String, String> params = new HashMap<String, String>();
@@ -500,8 +516,7 @@
+ cls
+ "."
+ method.getName()
- + "\n"
- + "Only the last parameter of a method can be marked with the -limit flag.";
+ + ": only the last parameter of a method can be marked with the -limit flag";
logger.log(TreeLogger.ERROR, msg, null);
throw new UnableToCompleteException();
}
@@ -552,7 +567,7 @@
for (int i = 0; i < paramNames.size(); ++i) {
String paramName = paramNames.get(i);
- sw.print("com.google.gwt.junit.client.impl.IterableAdapter.toIterable("
+ sw.print(ITERABLE_ADAPTER_CLASS + ".toIterable("
+ metaDataByParams.get(paramName) + ")");
if (i != paramNames.size() - 1) {
sw.print(",");
@@ -562,12 +577,15 @@
sw.print(" ");
}
- sw.println("final com.google.gwt.junit.client.impl.PermutationIterator permutationIt = new com.google.gwt.junit.client.impl.PermutationIterator(iterables);\n"
- + "com.google.gwt.user.client.DeferredCommand.addCommand( new com.google.gwt.user.client.IncrementalCommand() {\n"
+ sw.println("final " + PERMUTATION_ITERATOR_CLASS
+ + " permutationIt = new " + PERMUTATION_ITERATOR_CLASS
+ + "(iterables);\n" + DeferredCommand.class.getName()
+ + ".addCommand( new " + IncrementalCommand.class.getName() + "() {\n"
+ " public boolean execute() {\n"
+ " privateDelayTestFinish( 10000 );\n"
- + " if ( permutationIt.hasNext() ) {\n"
- + " com.google.gwt.junit.client.impl.PermutationIterator.Permutation permutation = permutationIt.next();\n");
+ + " if ( permutationIt.hasNext() ) {\n" + " "
+ + PERMUTATION_ITERATOR_CLASS
+ + ".Permutation permutation = permutationIt.next();\n");
for (int i = 0; i < methodParams.length; ++i) {
JParameter methodParam = methodParams[i];
@@ -589,8 +607,12 @@
new Statement(new MethodCall(method.getName(), paramNames)));
StringBuffer recordResultsCode = new StringBuffer(
- "com.google.gwt.junit.client.TestResults results = impl.getTestResults();\n"
- + "com.google.gwt.junit.client.Trial trial = new com.google.gwt.junit.client.Trial();\n"
+ BENCHMARK_RESULTS_CLASS
+ + " results = __getOrCreateTestResult();\n"
+ + TRIAL_CLASS
+ + " trial = new "
+ + TRIAL_CLASS
+ + "();\n"
+ "trial.setRunTimeMillis( "
+ testTimingName
+ " - "
@@ -664,11 +686,10 @@
Statements testBench = genBenchTarget(beginMethod, endMethod,
Collections.<String> emptyList(), testStatements);
- String recordResultsCode = "com.google.gwt.junit.client.TestResults results = impl.getTestResults();\n"
- + "com.google.gwt.junit.client.Trial trial = new com.google.gwt.junit.client.Trial();\n"
- + "trial.setRunTimeMillis( "
- + testTimingName
- + " - "
+ String recordResultsCode = BENCHMARK_RESULTS_CLASS
+ + " results = __getOrCreateTestResult();\n" + TRIAL_CLASS
+ + " trial = new " + TRIAL_CLASS + "();\n"
+ + "trial.setRunTimeMillis( " + testTimingName + " - "
+ setupTimingName + " );\n" + "results.getTrials().add( trial )";
Statements breakCode = new Statement(" break " + ESCAPE_LOOP);
diff --git a/user/src/com/google/gwt/junit/COPYING b/user/src/com/google/gwt/junit/COPYING
deleted file mode 100644
index d9a10c0..0000000
--- a/user/src/com/google/gwt/junit/COPYING
+++ /dev/null
@@ -1,176 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
diff --git a/user/src/com/google/gwt/junit/JUnit.gwt.xml b/user/src/com/google/gwt/junit/JUnit.gwt.xml
index f03417d..f351246 100644
--- a/user/src/com/google/gwt/junit/JUnit.gwt.xml
+++ b/user/src/com/google/gwt/junit/JUnit.gwt.xml
@@ -31,10 +31,8 @@
<when-type-assignable class="com.google.gwt.junit.client.GWTTestCase"/>
</generate-with>
- <generate-with class="com.google.gwt.junit.rebind.BenchmarkGenerator">
- <when-type-assignable class="com.google.gwt.junit.client.Benchmark"/>
- </generate-with>
-
<servlet path='/junithost' class='com.google.gwt.junit.server.JUnitHostImpl'/>
+ <inherits name="com.google.gwt.benchmarks.Benchmarks"/>
+
</module>
diff --git a/user/src/com/google/gwt/junit/JUnitMessageQueue.java b/user/src/com/google/gwt/junit/JUnitMessageQueue.java
index bbd3a51..51dfe31 100644
--- a/user/src/com/google/gwt/junit/JUnitMessageQueue.java
+++ b/user/src/com/google/gwt/junit/JUnitMessageQueue.java
@@ -15,7 +15,7 @@
*/
package com.google.gwt.junit;
-import com.google.gwt.junit.client.TestResults;
+import com.google.gwt.junit.client.impl.JUnitResult;
import com.google.gwt.junit.client.impl.JUnitHost.TestInfo;
import java.util.ArrayList;
@@ -65,7 +65,7 @@
private Object readTestLock = new Object();
/**
- * The lock used to synchronize access around testResults.
+ * The lock used to synchronize access around testResult.
*/
private Object resultsLock = new Object();
@@ -87,7 +87,7 @@
/**
* The results for the current test method.
*/
- private List<TestResults> testResults = new ArrayList<TestResults>();
+ private List<JUnitResult> testResult = new ArrayList<JUnitResult>();
/**
* Creates a message queue with one client.
@@ -149,13 +149,13 @@
* @param moduleName the name of the test module
* @param results the result of running the test
*/
- public void reportResults(String moduleName, TestResults results) {
+ public void reportResults(String moduleName, JUnitResult results) {
synchronized (resultsLock) {
if (!moduleName.equals(testModule)) {
// an old client is trying to report results, do nothing
return;
}
- testResults.add(results);
+ testResult.add(results);
}
}
@@ -166,9 +166,9 @@
* @return An getException thrown from a failed test, or <code>null</code>
* if the test completed without error.
*/
- List<TestResults> getResults(String moduleName) {
+ List<JUnitResult> getResults(String moduleName) {
assert (moduleName.equals(testModule));
- return testResults;
+ return testResult;
}
/**
@@ -181,7 +181,7 @@
boolean hasResult(String moduleName) {
synchronized (resultsLock) {
assert (moduleName.equals(testModule));
- return testResults.size() == numClients;
+ return testResult.size() == numClients;
}
}
@@ -219,7 +219,7 @@
this.testClass = testClass;
this.testMethod = testMethod;
++currentTestIndex;
- testResults = new ArrayList<TestResults>(numClients);
+ testResult = new ArrayList<JUnitResult>(numClients);
readTestLock.notifyAll();
}
}
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 41c11d3..35e3c53 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -26,12 +26,9 @@
import com.google.gwt.dev.cfg.Property;
import com.google.gwt.dev.shell.BrowserWidgetHost;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
-import com.google.gwt.junit.benchmarks.BenchmarkReport;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.TestResults;
import com.google.gwt.junit.client.TimeoutException;
-import com.google.gwt.junit.client.Trial;
import com.google.gwt.junit.client.impl.GWTRunner;
+import com.google.gwt.junit.client.impl.JUnitResult;
import com.google.gwt.junit.remote.BrowserManager;
import com.google.gwt.util.tools.ArgHandlerFlag;
import com.google.gwt.util.tools.ArgHandlerString;
@@ -40,10 +37,8 @@
import junit.framework.TestCase;
import junit.framework.TestResult;
-import java.io.File;
import java.rmi.Naming;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -80,27 +75,26 @@
public class JUnitShell extends GWTShell {
/**
- * Executes shutdown logic for JUnitShell
- *
- * Sadly, there's no simple way to know when all unit tests have finished
- * executing. So this class is registered as a VM shutdown hook so that work
- * can be done at the end of testing - for example, writing out the reports.
+ * A strategy for running the test.
*/
- private class Shutdown implements Runnable {
+ public interface Strategy {
+ String getModuleInherit();
- public void run() {
- try {
- String reportPath = System.getProperty(Benchmark.REPORT_PATH);
- if (reportPath == null || reportPath.trim().equals("")) {
- reportPath = System.getProperty("user.dir");
- }
- report.generate(reportPath + File.separator + "report-"
- + new Date().getTime() + ".xml");
- } catch (Exception e) {
- // It really doesn't matter how we got here.
- // Regardless of the failure, the VM is shutting down.
- e.printStackTrace();
- }
+ String getSyntheticModuleExtension();
+
+ void processResult(TestCase testCase, JUnitResult result);
+ }
+
+ private static class JUnitStrategy implements Strategy {
+ public String getModuleInherit() {
+ return "com.google.gwt.junit.JUnit";
+ }
+
+ public String getSyntheticModuleExtension() {
+ return "JUnit";
+ }
+
+ public void processResult(TestCase testCase, JUnitResult result) {
}
}
@@ -143,27 +137,20 @@
}
/**
- * Called by {@link com.google.gwt.junit.rebind.JUnitTestCaseStubGenerator} to
- * add test meta data to the test report.
- *
- * @return The {@link BenchmarkReport} that belongs to the singleton {@link
- * JUnitShell}, or <code>null</code> if no such singleton exists.
- */
- public static BenchmarkReport getReport() {
- if (unitTestShell == null) {
- return null;
- }
- return unitTestShell.report;
- }
-
- /**
* Entry point for {@link com.google.gwt.junit.client.GWTTestCase}. Gets or
* creates the singleton {@link JUnitShell} and invokes its {@link
* #runTestImpl(String, TestCase, TestResult)}.
*/
public static void runTest(String moduleName, TestCase testCase,
TestResult testResult) throws UnableToCompleteException {
- getUnitTestShell().runTestImpl(moduleName, testCase, testResult);
+ getUnitTestShell().runTestImpl(moduleName, testCase, testResult,
+ new JUnitStrategy());
+ }
+
+ public static void runTest(String moduleName, TestCase testCase,
+ TestResult testResult, Strategy strategy)
+ throws UnableToCompleteException {
+ getUnitTestShell().runTestImpl(moduleName, testCase, testResult, strategy);
}
/**
@@ -184,11 +171,7 @@
if (!shell.startUp()) {
throw new RuntimeException("Shell failed to start");
}
-
- shell.report = new BenchmarkReport();
unitTestShell = shell;
-
- Runtime.getRuntime().addShutdownHook(new Thread(shell.new Shutdown()));
}
return unitTestShell;
@@ -222,11 +205,6 @@
private int numClients = 1;
/**
- * The result of benchmark runs.
- */
- private BenchmarkReport report;
-
- /**
* What type of test we're running; Local hosted, local web, or remote web.
*/
private RunStyle runStyle = new RunStyleLocalHosted(this);
@@ -415,9 +393,11 @@
* Runs a particular test case.
*/
private void runTestImpl(String moduleName, TestCase testCase,
- TestResult testResult) throws UnableToCompleteException {
+ TestResult testResult, Strategy strategy)
+ throws UnableToCompleteException {
- String syntheticModuleName = moduleName + ".JUnit";
+ String syntheticModuleName = moduleName + "."
+ + strategy.getSyntheticModuleExtension();
boolean sameTest = syntheticModuleName.equals(currentModuleName);
if (sameTest && lastLaunchFailed) {
throw new UnableToCompleteException();
@@ -431,7 +411,7 @@
*/
ModuleDef synthetic = ModuleDefLoader.createSyntheticModule(
getTopLogger(), currentModuleName, new String[] {
- moduleName, "com.google.gwt.junit.JUnit"}, true);
+ moduleName, strategy.getModuleInherit()}, true);
// Replace any user entry points with our test runner.
synthetic.clearEntryPoints();
synthetic.addEntryPointTypeName(GWTRunner.class.getName());
@@ -466,7 +446,7 @@
return;
}
- List<TestResults> results = messageQueue.getResults(currentModuleName);
+ List<JUnitResult> results = messageQueue.getResults(currentModuleName);
if (results == null) {
return;
@@ -474,9 +454,8 @@
boolean parallelTesting = numClients > 1;
- for (TestResults result : results) {
- Trial firstTrial = result.getTrials().get(0);
- Throwable exception = firstTrial.getException();
+ for (JUnitResult result : results) {
+ Throwable exception = result.getException();
// In the case that we're running multiple clients at once, we need to
// let the user know the browser in which the failure happened
@@ -504,9 +483,7 @@
testResult.addError(testCase, exception);
}
- if (testCase instanceof Benchmark) {
- report.addBenchmarkResults(testCase, result);
- }
+ strategy.processResult(testCase, result);
}
}
diff --git a/user/src/com/google/gwt/junit/client/GWTTestCase.java b/user/src/com/google/gwt/junit/client/GWTTestCase.java
index 8a90ee8..d5d0feb 100644
--- a/user/src/com/google/gwt/junit/client/GWTTestCase.java
+++ b/user/src/com/google/gwt/junit/client/GWTTestCase.java
@@ -39,12 +39,12 @@
/*
* Object that collects the results of this test case execution.
*/
- private TestResult testResult = null;
+ protected TestResult testResult = null;
/**
* Add a checkpoint message to the current test. If this test fails, all
- * checkpoint messages will be appended to the getException description. This can
- * be useful in web mode for determining how far test execution progressed
+ * checkpoint messages will be appended to the getException description. This
+ * can be useful in web mode for determining how far test execution progressed
* before a failure occurs.
*
* @param msg the checkpoint message to add
@@ -142,9 +142,8 @@
* @param timeoutMillis how long to wait before the current test will time out
* @tip Subsequent calls to this method reset the timeout.
* @see #finishTest()
- *
- * @throws UnsupportedOperationException if this test case is a
- * {@link Benchmark}
+ *
+ * @throws UnsupportedOperationException if {@link #supportsAsync()} is false
*/
protected final void delayTestFinish(int timeoutMillis) {
// implemented in the translatable version of this class
@@ -167,10 +166,9 @@
* {@example com.google.gwt.examples.AsyncJUnitExample#testTimer()}
* </p>
*
- * @throws IllegalStateException if this test is not in asynchronous mode.
- * @throws UnsupportedOperationException if this test case is a
- * {@link Benchmark}
- *
+ * @throws IllegalStateException if this test is not in asynchronous mode
+ * @throws UnsupportedOperationException if {@link #supportsAsync()} is false
+ *
* @see #delayTestFinish(int)
*/
protected final void finishTest() {
@@ -178,10 +176,20 @@
}
/**
- * Runs the test via the {@link JUnitShell} environment.
+ * Runs the test via the {@link JUnitShell} environment. Do not override or
+ * call this method.
*/
@Override
- protected final void runTest() throws Throwable {
+ protected void runTest() throws Throwable {
JUnitShell.runTest(getModuleName(), this, testResult);
}
+
+ /**
+ * Returns true if this test case supports asynchronous mode. By default, this
+ * is set to true.
+ */
+ protected boolean supportsAsync() {
+ return true;
+ }
+
}
diff --git a/user/src/com/google/gwt/junit/client/Trial.java b/user/src/com/google/gwt/junit/client/Trial.java
deleted file mode 100644
index d30bb3d..0000000
--- a/user/src/com/google/gwt/junit/client/Trial.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.junit.client;
-
-import com.google.gwt.junit.client.impl.ExceptionWrapper;
-import com.google.gwt.user.client.rpc.IsSerializable;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * The result of a single trial-run of a single benchmark method. Each Trial
- * contains the results of running a benchmark method with one set of values for
- * its parameters. TestResults for a method will contain Trials for all
- * permutations of the parameter values. For test methods without parameters,
- * there is only 1 trial result.
- *
- * @skip
- */
-public class Trial implements IsSerializable {
-
- // Deserialized from exceptionWrapper on the server-side
- private transient Throwable exception;
-
- private ExceptionWrapper exceptionWrapper;
-
- private double runTimeMillis;
-
- private Map<String, String> variables;
-
- public Trial() {
- this.variables = new HashMap<String, String>();
- }
-
- /**
- * Creates a new Trial.
- *
- * @param runTimeMillis The amount of time spent executing the test
- * @param exceptionWrapper The wrapped getException thrown by the the last
- * test, or <code>null</code> if the last test completed
- * successfully.
- */
- public Trial(Map<String, String> variables, double runTimeMillis,
- ExceptionWrapper exceptionWrapper) {
- this.variables = variables;
- this.runTimeMillis = runTimeMillis;
- this.exceptionWrapper = exceptionWrapper;
- }
-
- public Throwable getException() {
- return exception;
- }
-
- public ExceptionWrapper getExceptionWrapper() {
- return exceptionWrapper;
- }
-
- public double getRunTimeMillis() {
- return runTimeMillis;
- }
-
- /**
- * Returns the names and values of the variables used in the test. If there
- * were no variables, the map is empty.
- */
- public Map<String, String> getVariables() {
- return variables;
- }
-
- public void setException(Throwable exception) {
- this.exception = exception;
- }
-
- public void setExceptionWrapper(ExceptionWrapper exceptionWrapper) {
- this.exceptionWrapper = exceptionWrapper;
- }
-
- public void setRunTimeMillis(double runTimeMillis) {
- this.runTimeMillis = runTimeMillis;
- }
-
- @Override
- public String toString() {
- return "variables: " + variables + ", exceptionWrapper: "
- + exceptionWrapper + ", runTimeMillis: " + runTimeMillis;
- }
-}
diff --git a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
index 7e92793..e461ed9 100644
--- a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
+++ b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
@@ -17,7 +17,6 @@
import com.google.gwt.user.client.rpc.IsSerializable;
import com.google.gwt.user.client.rpc.RemoteService;
-import com.google.gwt.junit.client.TestResults;
/**
* An interface for {@link com.google.gwt.junit.client.GWTTestCase} to
@@ -50,6 +49,11 @@
public String getTestMethod() {
return testMethod;
}
+
+ @Override
+ public String toString() {
+ return testClass + "." + testMethod;
+ }
}
/**
@@ -65,8 +69,8 @@
* run.
*
* @param moduleName the module name of this client
- * @param results The results of executing the test
+ * @param result the results of executing the test
* @return the next test to run
*/
- TestInfo reportResultsAndGetNextMethod(String moduleName, TestResults results);
+ TestInfo reportResultsAndGetNextMethod(String moduleName, JUnitResult result);
}
diff --git a/user/src/com/google/gwt/junit/client/impl/JUnitHostAsync.java b/user/src/com/google/gwt/junit/client/impl/JUnitHostAsync.java
index e27baaf..c900a18 100644
--- a/user/src/com/google/gwt/junit/client/impl/JUnitHostAsync.java
+++ b/user/src/com/google/gwt/junit/client/impl/JUnitHostAsync.java
@@ -15,7 +15,6 @@
*/
package com.google.gwt.junit.client.impl;
-import com.google.gwt.junit.client.TestResults;
import com.google.gwt.junit.client.impl.JUnitHost.TestInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -28,8 +27,8 @@
* Gets the name of next method to run.
*
* @param moduleName the module name of this client
- * @param callBack The object that will receive the name of the next method to
- * run.
+ * @param callBack the object that will receive the name of the next method to
+ * run
*/
void getFirstMethod(String moduleName, AsyncCallback<TestInfo> callBack);
@@ -38,10 +37,10 @@
* run.
*
* @param moduleName the module name of this client
- * @param results The results of the test.
- * @param callBack The object that will receive the name of the next method to
- * run.
+ * @param result the result of the test
+ * @param callBack the object that will receive the name of the next method to
+ * run
*/
- void reportResultsAndGetNextMethod(String moduleName, TestResults results,
+ void reportResultsAndGetNextMethod(String moduleName, JUnitResult result,
AsyncCallback<TestInfo> callBack);
}
diff --git a/user/src/com/google/gwt/junit/client/impl/JUnitResult.java b/user/src/com/google/gwt/junit/client/impl/JUnitResult.java
new file mode 100644
index 0000000..2f63e26
--- /dev/null
+++ b/user/src/com/google/gwt/junit/client/impl/JUnitResult.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.junit.client.impl;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+/**
+ * Encapsulates the results of the execution of a single benchmark. A TestResult
+ * is constructed transparently within a benchmark and reported back to the
+ * JUnit RPC server, JUnitHost. It's then shared (via JUnitMessageQueue) with
+ * JUnitShell and aggregated in BenchmarkReport with other TestResults.
+ *
+ * @skip
+ * @see com.google.gwt.junit.client.impl.JUnitHost
+ * @see com.google.gwt.junit.JUnitMessageQueue
+ * @see com.google.gwt.junit.JUnitShell
+ */
+public class JUnitResult implements IsSerializable {
+
+ // Computed at the server, via HTTP header.
+ private transient String agent;
+
+ // Deserialized from exceptionWrapper on the server-side
+ private transient Throwable exception;
+
+ private ExceptionWrapper exceptionWrapper;
+
+ // Computed at the server, via HTTP header.
+ private transient String host;
+
+ public String getAgent() {
+ return agent;
+ }
+
+ public Throwable getException() {
+ return exception;
+ }
+
+ public ExceptionWrapper getExceptionWrapper() {
+ return exceptionWrapper;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setAgent(String agent) {
+ this.agent = agent;
+ }
+
+ public void setException(Throwable exception) {
+ this.exception = exception;
+ }
+
+ public void setExceptionWrapper(ExceptionWrapper exceptionWrapper) {
+ this.exceptionWrapper = exceptionWrapper;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ @Override
+ public String toString() {
+ return "TestResult {" + toStringInner() + "}";
+ }
+
+ protected String toStringInner() {
+ return "exceptionWrapper: " + exceptionWrapper + ", agent: " + agent
+ + ", host: " + host;
+ }
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/junit/rebind/JUnitTestCaseStubGenerator.java b/user/src/com/google/gwt/junit/rebind/JUnitTestCaseStubGenerator.java
index 96613f8..87c1ea6 100644
--- a/user/src/com/google/gwt/junit/rebind/JUnitTestCaseStubGenerator.java
+++ b/user/src/com/google/gwt/junit/rebind/JUnitTestCaseStubGenerator.java
@@ -40,22 +40,11 @@
*/
public class JUnitTestCaseStubGenerator extends Generator {
- interface MethodFilter {
- boolean accept(JMethod method);
- }
-
/**
- * Returns the method names for the set of methods that are strictly JUnit
- * test methods (have no arguments).
- *
- * @param requestedClass
+ * An interface for filtering out methods.
*/
- public static String[] getTestMethodNames(JClassType requestedClass) {
- return getAllMethods(requestedClass, new MethodFilter() {
- public boolean accept(JMethod method) {
- return isJUnitTestMethod(method, false);
- }
- }).keySet().toArray(new String[] {});
+ protected interface MethodFilter {
+ boolean accept(JMethod method);
}
/**
@@ -70,7 +59,7 @@
* @param type the type to search (non-null)
* @return the set of matching methods (non-null)
*/
- static Map<String, List<JMethod>> getAllMethods(JClassType type,
+ protected static Map<String, List<JMethod>> getAllMethods(JClassType type,
MethodFilter filter) {
Map<String, List<JMethod>> methods = new HashMap<String, List<JMethod>>();
JClassType cls = type;
@@ -119,7 +108,7 @@
* access. The method may be static. You must choose to include or exclude
* methods which have arguments.
*/
- static boolean isJUnitTestMethod(JMethod method, boolean acceptArgs) {
+ protected static boolean isJUnitTestMethod(JMethod method, boolean acceptArgs) {
if (!method.getName().startsWith("test")) {
return false;
}
@@ -150,12 +139,25 @@
return true;
}
+ /**
+ * Returns the method names for the set of methods that are strictly JUnit
+ * test methods (have no arguments).
+ *
+ * @param requestedClass
+ */
+ private static String[] getTestMethodNames(JClassType requestedClass) {
+ return getAllMethods(requestedClass, new MethodFilter() {
+ public boolean accept(JMethod method) {
+ return isJUnitTestMethod(method, false);
+ }
+ }).keySet().toArray(new String[] {});
+ }
+
protected TreeLogger logger;
private String packageName;
private String qualifiedStubClassName;
- private String simpleStubClassName;
-
private JClassType requestedClass;
+ private String simpleStubClassName;
private SourceWriter sourceWriter;
private TypeOracle typeOracle;
diff --git a/user/src/com/google/gwt/junit/server/JUnitHostImpl.java b/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
index e9103a3..f30d477 100644
--- a/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
+++ b/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
@@ -18,10 +18,9 @@
import com.google.gwt.junit.JUnitFatalLaunchException;
import com.google.gwt.junit.JUnitMessageQueue;
import com.google.gwt.junit.JUnitShell;
-import com.google.gwt.junit.client.TestResults;
-import com.google.gwt.junit.client.Trial;
import com.google.gwt.junit.client.impl.ExceptionWrapper;
import com.google.gwt.junit.client.impl.JUnitHost;
+import com.google.gwt.junit.client.impl.JUnitResult;
import com.google.gwt.junit.client.impl.StackTraceWrapper;
import com.google.gwt.user.client.rpc.InvocationException;
import com.google.gwt.user.server.rpc.RPCServletUtils;
@@ -32,7 +31,6 @@
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
-import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -89,19 +87,12 @@
}
public TestInfo reportResultsAndGetNextMethod(String moduleName,
- TestResults results) {
+ JUnitResult result) {
+ initResult(getThreadLocalRequest(), result);
+ ExceptionWrapper ew = result.getExceptionWrapper();
+ result.setException(deserialize(ew));
JUnitMessageQueue host = getHost();
- HttpServletRequest request = getThreadLocalRequest();
- String agent = request.getHeader("User-Agent");
- results.setAgent(agent);
- String machine = request.getRemoteHost();
- results.setHost(machine);
- List<Trial> trials = results.getTrials();
- for (Trial trial : trials) {
- ExceptionWrapper ew = trial.getExceptionWrapper();
- trial.setException(deserialize(ew));
- }
- host.reportResults(moduleName, results);
+ host.reportResults(moduleName, result);
return host.getNextTestInfo(getClientId(), moduleName,
TIME_TO_WAIT_FOR_TESTNAME);
}
@@ -131,11 +122,10 @@
if (requestURI.endsWith("/junithost/loadError")) {
String moduleName = getModuleName(getPrefix(requestURI));
String requestPayload = RPCServletUtils.readContentAsUtf8(request);
- TestResults results = new TestResults();
- Trial trial = new Trial();
- trial.setException(new JUnitFatalLaunchException(requestPayload));
- results.getTrials().add(trial);
- getHost().reportResults(moduleName, results);
+ JUnitResult result = new JUnitResult();
+ initResult(request, result);
+ result.setException(new JUnitFatalLaunchException(requestPayload));
+ getHost().reportResults(moduleName, result);
} else {
super.service(request, response);
}
@@ -268,4 +258,11 @@
String prefix = requestURI.substring(0, pos);
return prefix;
}
+
+ private void initResult(HttpServletRequest request, JUnitResult result) {
+ String agent = request.getHeader("User-Agent");
+ result.setAgent(agent);
+ String machine = request.getRemoteHost();
+ result.setHost(machine);
+ }
}
diff --git a/user/src/com/google/gwt/junit/client/Category.java b/user/super/com/google/gwt/benchmarks/translatable/com/google/gwt/benchmarks/client/Benchmark.java
similarity index 67%
copy from user/src/com/google/gwt/junit/client/Category.java
copy to user/super/com/google/gwt/benchmarks/translatable/com/google/gwt/benchmarks/client/Benchmark.java
index ff9c233..d5a4636 100644
--- a/user/src/com/google/gwt/junit/client/Category.java
+++ b/user/super/com/google/gwt/benchmarks/translatable/com/google/gwt/benchmarks/client/Benchmark.java
@@ -1,25 +1,25 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
-package com.google.gwt.junit.client;
+package com.google.gwt.benchmarks.client;
+
+import com.google.gwt.benchmarks.client.impl.BenchmarkImpl;
/**
- * A named category that provides classification for
- * {@link Benchmark Benchmarks}. Categories are now deprecated.
- *
+ * This class is the translatable version of {@link Benchmark}; it is an empty
+ * shell to make debugging easier.
*/
-@Deprecated
-public interface Category {
+public abstract class Benchmark extends BenchmarkImpl {
}
diff --git a/user/super/com/google/gwt/benchmarks/translatable/com/google/gwt/benchmarks/client/impl/BenchmarkImpl.java b/user/super/com/google/gwt/benchmarks/translatable/com/google/gwt/benchmarks/client/impl/BenchmarkImpl.java
new file mode 100644
index 0000000..f134ce9
--- /dev/null
+++ b/user/super/com/google/gwt/benchmarks/translatable/com/google/gwt/benchmarks/client/impl/BenchmarkImpl.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.benchmarks.client.impl;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * The implementation class for the translatable {@link GWTTestCase}.
+ *
+ * This class is split out of {@link GWTTestCase} to make debugging work. Trying
+ * to debug the translatable {@link GWTTestCase} confuses the debugger, which
+ * tends to use the non-translatable version.
+ */
+public abstract class BenchmarkImpl extends GWTTestCase {
+
+ private static native String getDocumentLocation() /*-{
+ return $doc.location.toString();
+ }-*/;
+
+ /**
+ * Collective test results.
+ */
+ private BenchmarkResults results;
+
+ // CHECKSTYLE_OFF
+ @Override
+ protected BenchmarkResults __getOrCreateTestResult() {
+ if (results == null) {
+ results = new BenchmarkResults();
+ results.setSourceRef(getDocumentLocation());
+ }
+ return results;
+ }
+ // CHECKSTYLE_ON
+
+}
diff --git a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/GWTTestCase.java b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/GWTTestCase.java
index 511943c..d877e1c 100644
--- a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/GWTTestCase.java
+++ b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/GWTTestCase.java
@@ -17,68 +17,9 @@
import com.google.gwt.junit.client.impl.GWTTestCaseImpl;
-import junit.framework.TestCase;
-
/**
- * This class is the translatable version of {@link GWTTestCase}. It uses RPC
- * to communicate test progress back to the GWT environment, where the real test
- * test is running.
+ * This class is the translatable version of {@link GWTTestCase}; it is an
+ * empty shell to make debugging easier.
*/
-public abstract class GWTTestCase extends TestCase {
-
- /**
- * A reference to my implementation class. All substantive methods simply
- * delegate to the implementation class, to make debugging easier.
- */
- public GWTTestCaseImpl impl;
-
- public final void addCheckpoint(String msg) {
- impl.addCheckpoint(msg);
- }
-
- public boolean catchExceptions() {
- return true;
- }
-
- public final void clearCheckpoints() {
- impl.clearCheckpoints();
- }
-
- public final String[] getCheckpoints() {
- return impl.getCheckpoints();
- }
-
- public abstract String getModuleName();
-
- protected final void delayTestFinish(int timeoutMillis) {
- if (supportsAsync()) {
- impl.delayTestFinish(timeoutMillis);
- } else {
- throw new UnsupportedOperationException(
- "This test case does not support asynchronous mode.");
- }
- }
-
- protected final void finishTest() {
- if (supportsAsync()) {
- impl.finishTest();
- } else {
- throw new UnsupportedOperationException(
- "This test case does not support asynchronous mode.");
- }
- }
-
- /**
- * Returns true if this test case supports asynchronous mode. By default, this
- * is set to true. Originally introduced for Benchmarks which don't currently
- * support asynchronous mode.
- *
- * <p>
- * Note that an overrider of this method may report different answers for the
- * same test case during the same run, so it is not safe to cache the results.
- * </p>
- */
- protected boolean supportsAsync() {
- return true;
- }
+public abstract class GWTTestCase extends GWTTestCaseImpl {
}
diff --git a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
index 43704ee..e6a5bbc 100644
--- a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
+++ b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
@@ -18,7 +18,6 @@
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.junit.client.TestResults;
import com.google.gwt.junit.client.impl.JUnitHost.TestInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
@@ -148,12 +147,12 @@
*/
protected abstract GWTTestCase createNewTestCase(String testClass);
- void reportResultsAndGetNextMethod(TestResults results) {
+ void reportResultsAndGetNextMethod(JUnitResult result) {
if (serverless) {
// That's it, we're done
return;
}
- junitHost.reportResultsAndGetNextMethod(GWT.getModuleName(), results,
+ junitHost.reportResultsAndGetNextMethod(GWT.getModuleName(), result,
junitHostListener);
}
@@ -169,12 +168,17 @@
private void runTest(TestInfo testToRun) {
// Dynamically create a new test case.
- GWTTestCase testCase = createNewTestCase(testToRun.getTestClass());
- if (testCase != null) {
- testCase.setName(testToRun.getTestMethod());
+ GWTTestCaseImpl testCase = createNewTestCase(testToRun.getTestClass());
+ if (testCase == null) {
+ RuntimeException ex = new RuntimeException(testToRun
+ + ": could not instantiate the requested class");
+ JUnitResult result = new JUnitResult();
+ result.setExceptionWrapper(new ExceptionWrapper(ex));
+ reportResultsAndGetNextMethod(result);
}
- GWTTestCaseImpl impl = new GWTTestCaseImpl(testCase);
- impl.runTest();
+
+ testCase.setName(testToRun.getTestMethod());
+ testCase.__doRunTest();
}
}
diff --git a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTTestCaseImpl.java b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTTestCaseImpl.java
index 50b4fbf..942a1e3 100644
--- a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTTestCaseImpl.java
+++ b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTTestCaseImpl.java
@@ -17,13 +17,11 @@
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.junit.client.TestResults;
import com.google.gwt.junit.client.TimeoutException;
-import com.google.gwt.junit.client.Trial;
import com.google.gwt.user.client.Timer;
+import junit.framework.TestCase;
+
import java.util.ArrayList;
import java.util.List;
@@ -34,11 +32,7 @@
* to debug the translatable {@link GWTTestCase} confuses the debugger, which
* tends to use the non-translatable version.
*/
-public class GWTTestCaseImpl implements UncaughtExceptionHandler {
-
- private static native String getDocumentLocation() /*-{
- return $doc.location.toString();
- }-*/;
+public abstract class GWTTestCaseImpl extends TestCase {
/**
* A watchdog class for use with asynchronous mode. On construction,
@@ -80,19 +74,9 @@
private boolean mainTestHasRun = false;
/**
- * Collective test results.
+ * Test result.
*/
- private TestResults results = new TestResults();
-
- /**
- * The time the test began execution.
- */
- private long testBeginMillis;
-
- /**
- * My paired {@link GWTTestCase}.
- */
- private final GWTTestCase testCase;
+ private JUnitResult result;
/**
* Tracks whether this test is completely done.
@@ -104,19 +88,21 @@
*/
private KillTimer timer;
- /**
- * Constructs a new GWTTestCaseImpl that is paired one-to-one with a
- * {@link GWTTestCase}.
- *
- * @param outer The paired (enclosing) GWTTestCase.
- */
- public GWTTestCaseImpl(GWTTestCase testCase) {
- this.testCase = testCase;
- if (testCase != null) {
- // Initialize the back reference from the test case to myself.
- testCase.impl = this;
+ private final UncaughtExceptionHandler uncaughtHandler = new UncaughtExceptionHandler() {
+ /**
+ * An uncaught exception escaped to the browser; what we should do depends
+ * on what state we're in.
+ */
+ public void onUncaughtException(Throwable ex) {
+ if (mainTestHasRun && timer != null) {
+ // Asynchronous mode; uncaught exceptions cause an immediate failure.
+ assert (!testIsFinished);
+ reportResultsAndRunNextMethod(ex);
+ } else {
+ // just ignore it
+ }
}
- }
+ };
/**
* Implementation of {@link GWTTestCase#addCheckpoint(String)}.
@@ -128,98 +114,95 @@
checkPoints.add(msg);
}
+ public boolean catchExceptions() {
+ return true;
+ }
+
public void clearCheckpoints() {
checkPoints = null;
}
- /**
- * Implementation of {@link GWTTestCase#delayTestFinish(int)}.
- */
- public void delayTestFinish(int timeoutMillis) {
- if (timer != null) {
- // Cancel the pending timer
- timer.cancel();
- }
-
- // Set a new timer for the specified new timeout
- timer = new KillTimer(timeoutMillis);
- }
-
- /**
- * Implementation of {@link GWTTestCase#finishTest()}.
- */
- public void finishTest() {
- if (testIsFinished) {
- // This test is totally done already, just ignore the call.
- return;
- }
-
- if (timer == null) {
- throw new IllegalStateException(
- "This test is not in asynchronous mode; call delayTestFinish() first");
- }
-
- if (mainTestHasRun) {
- // This is a correct, successful async finish.
- reportResultsAndRunNextMethod(null);
- } else {
- // The user tried to finish the test before the main body returned!
- // Just let the test continue running normally.
- resetAsyncState();
- }
- }
-
public String[] getCheckpoints() {
if (checkPoints == null) {
return new String[0];
} else {
int len = checkPoints.size();
- String[] result = new String[len];
+ String[] retval = new String[len];
for (int i = 0; i < len; ++i) {
- result[i] = checkPoints.get(i);
+ retval[i] = checkPoints.get(i);
}
- return result;
+ return retval;
}
}
- public TestResults getTestResults() {
- return results;
- }
+ public abstract String getModuleName();
- /**
- * An uncaught exception escaped to the browser; what we should do depends on
- * what state we're in.
- */
- public void onUncaughtException(Throwable ex) {
- if (mainTestHasRun && timer != null) {
- // Asynchronous mode; uncaught exceptions cause an immediate failure.
- assert (!testIsFinished);
- reportResultsAndRunNextMethod(ex);
+ // CHECKSTYLE_OFF
+ protected JUnitResult __getOrCreateTestResult() {
+ if (result == null) {
+ result = new JUnitResult();
+ }
+ return result;
+ }
+ // CHECKSTYLE_ON
+
+ protected final void delayTestFinish(int timeoutMillis) {
+ if (supportsAsync()) {
+ if (timer != null) {
+ // Cancel the pending timer
+ timer.cancel();
+ }
+
+ // Set a new timer for the specified new timeout
+ timer = new KillTimer(timeoutMillis);
} else {
- // just ignore it
+ throw new UnsupportedOperationException(
+ "This test case does not support asynchronous mode.");
}
}
+ protected final void finishTest() {
+ if (supportsAsync()) {
+ if (testIsFinished) {
+ // This test is totally done already, just ignore the call.
+ return;
+ }
+
+ if (timer == null) {
+ throw new IllegalStateException(
+ "This test is not in asynchronous mode; call delayTestFinish() first");
+ }
+
+ if (mainTestHasRun) {
+ // This is a correct, successful async finish.
+ reportResultsAndRunNextMethod(null);
+ } else {
+ // The user tried to finish the test before the main body returned!
+ // Just let the test continue running normally.
+ resetAsyncState();
+ }
+ } else {
+ throw new UnsupportedOperationException(
+ "This test case does not support asynchronous mode.");
+ }
+ }
+
+ protected boolean supportsAsync() {
+ return false;
+ }
+
+ // CHECKSTYLE_OFF
/**
* Actually run the user's test. Called from {@link GWTRunner}.
*/
- void runTest() {
+ void __doRunTest() {
Throwable caught = null;
- testBeginMillis = System.currentTimeMillis();
- results = new TestResults();
-
- if (testCase == null) {
- reportResultsAndRunNextMethod(new RuntimeException(
- "Could not instantiate the requested class"));
- return;
- }
-
if (shouldCatchExceptions()) {
// Make sure no exceptions escape
- GWT.setUncaughtExceptionHandler(this);
+ GWT.setUncaughtExceptionHandler(uncaughtHandler);
try {
- testCase.runBare();
+ runBare();
} catch (Throwable e) {
caught = e;
}
@@ -243,6 +226,7 @@
reportResultsAndRunNextMethod(null);
}
}
+ // CHECKSTYLE_ON
/**
* Cleans up any outstanding state, reports ex to the remote runner, and kicks
@@ -251,55 +235,20 @@
* @param ex The results of this test.
*/
private void reportResultsAndRunNextMethod(Throwable ex) {
- List<Trial> trials = results.getTrials();
-
- /*
- * TODO(tobyr) - Consider making this logic polymorphic which will remove
- * instanceof test. But testCase might be null.
- *
- * If this is not a benchmark, we have to create a fake trial run
- */
- if (!(testCase instanceof Benchmark)) {
- Trial trial = new Trial();
- long testDurationMillis = System.currentTimeMillis() - testBeginMillis;
- trial.setRunTimeMillis(testDurationMillis);
-
- if (ex != null) {
- ExceptionWrapper ew = new ExceptionWrapper(ex);
- if (checkPoints != null) {
- for (int i = 0, c = checkPoints.size(); i < c; ++i) {
- ew.message += "\n" + checkPoints.get(i);
- }
+ JUnitResult myResult = __getOrCreateTestResult();
+ if (ex != null) {
+ ExceptionWrapper ew = new ExceptionWrapper(ex);
+ if (checkPoints != null) {
+ for (int i = 0, c = checkPoints.size(); i < c; ++i) {
+ ew.message += "\n" + checkPoints.get(i);
}
- trial.setExceptionWrapper(ew);
}
-
- trials.add(trial);
- } else {
- /*
- * If this was a benchmark, we need to handle exceptions specially. If an
- * exception occurred, it happened without the trial being recorded. We,
- * unfortunately, don't know the trial parameters at this point. We should
- * consider putting the exception handling code directly into the
- * generated Benchmark subclasses.
- */
- if (ex != null) {
- ExceptionWrapper ew = new ExceptionWrapper(ex);
- if (checkPoints != null) {
- for (int i = 0, c = checkPoints.size(); i < c; ++i) {
- ew.message += "\n" + checkPoints.get(i);
- }
- }
- Trial trial = new Trial();
- trial.setExceptionWrapper(ew);
- trials.add(trial);
- }
+ myResult.setExceptionWrapper(ew);
}
- results.setSourceRef(getDocumentLocation());
testIsFinished = true;
resetAsyncState();
- GWTRunner.get().reportResultsAndGetNextMethod(results);
+ GWTRunner.get().reportResultsAndGetNextMethod(myResult);
}
/**
@@ -318,8 +267,7 @@
* this method serves as a hack to avoid "throws" clause problems.
*/
private native void runBareTestCaseAvoidingExceptionDecl() /*-{
- this.@com.google.gwt.junit.client.impl.GWTTestCaseImpl::testCase
- .@junit.framework.TestCase::runBare()();
+ this.@junit.framework.TestCase::runBare()();
}-*/;
/**
@@ -332,7 +280,7 @@
*/
private boolean shouldCatchExceptions() {
try {
- return testCase.catchExceptions();
+ return catchExceptions();
} catch (Throwable e) {
return true;
}
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraySortBenchmark.java b/user/test/com/google/gwt/emultest/java/util/ArraySortBenchmark.java
index 9dbf683..abc1495 100644
--- a/user/test/com/google/gwt/emultest/java/util/ArraySortBenchmark.java
+++ b/user/test/com/google/gwt/emultest/java/util/ArraySortBenchmark.java
@@ -15,9 +15,9 @@
*/
package com.google.gwt.emultest.java.util;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.IntRange;
-import com.google.gwt.junit.client.Operator;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
import java.util.Arrays;
diff --git a/user/test/com/google/gwt/emultest/java/util/HashMapBenchmark.java b/user/test/com/google/gwt/emultest/java/util/HashMapBenchmark.java
index f35e371..50653ea 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashMapBenchmark.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashMapBenchmark.java
@@ -1,12 +1,12 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,12 +15,12 @@
*/
package com.google.gwt.emultest.java.util;
-import com.google.gwt.junit.client.Range;
-import com.google.gwt.junit.client.IntRange;
-import com.google.gwt.junit.client.Operator;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.annotations.RangeField;
-import com.google.gwt.junit.client.annotations.Setup;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
+import com.google.gwt.benchmarks.client.Range;
+import com.google.gwt.benchmarks.client.RangeField;
+import com.google.gwt.benchmarks.client.Setup;
import java.util.HashMap;
@@ -48,8 +48,8 @@
* Integers, and contain duplicate values.
*/
@Setup("beginHashMapContainsValueInt")
- public void testHashMapContainsValueInt(
- @RangeField("containsRange")Integer size) {
+ public void testHashMapContainsValueInt(@RangeField("containsRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
Integer intVal = new Integer(i);
@@ -65,8 +65,8 @@
* Strings, and contain duplicate values.
*/
@Setup("beginHashMapContainsValueString")
- public void testHashMapContainsValueString(
- @RangeField("containsRange")Integer size) {
+ public void testHashMapContainsValueString(@RangeField("containsRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
String strVal = Integer.toString(i);
@@ -82,8 +82,8 @@
* Integers, and contain duplicate values.
*/
@Setup("initMap")
- public void testHashMapDuplicateIntAdds(
- @RangeField("baseRange")Integer size) {
+ public void testHashMapDuplicateIntAdds(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
Integer intVal = new Integer(i / 10);
@@ -95,12 +95,12 @@
}
/**
- * Appends <code>size</code> items to an empty HashMap. All items are Strings,
- * and contain duplicate values.
+ * Appends <code>size</code> items to an empty HashMap. All items are
+ * Strings, and contain duplicate values.
*/
@Setup("initMap")
- public void testHashMapDuplicateStringAdds(
- @RangeField("baseRange")Integer size) {
+ public void testHashMapDuplicateStringAdds(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
String strVal = Integer.toString(i / 10);
@@ -116,7 +116,8 @@
* Integers, and do not contain duplicate values.
*/
@Setup("initMap")
- public void testHashMapIntAdds(@RangeField("baseRange")Integer size) {
+ public void testHashMapIntAdds(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
Integer intVal = new Integer(i);
@@ -132,7 +133,8 @@
* Integers, and contain duplicate values.
*/
@Setup("beginHashMapIntGets")
- public void testHashMapIntGets(@RangeField("baseRange")Integer size) {
+ public void testHashMapIntGets(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
Integer intVal = new Integer(i);
@@ -144,11 +146,12 @@
}
/**
- * Appends <code>size</code> items to an empty HashMap. All items are Strings,
- * and do not contain duplicate values.
+ * Appends <code>size</code> items to an empty HashMap. All items are
+ * Strings, and do not contain duplicate values.
*/
@Setup("initMap")
- public void testHashMapStringAdds(@RangeField("baseRange")Integer size) {
+ public void testHashMapStringAdds(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
String strVal = Integer.toString(i);
@@ -164,7 +167,8 @@
* contain duplicate values.
*/
@Setup("beginHashMapStringGets")
- public void testHashMapStringGets(@RangeField("baseRange")Integer size) {
+ public void testHashMapStringGets(@RangeField("baseRange")
+ Integer size) {
int num = size.intValue();
for (int i = 0; i < num; i++) {
String strVal = Integer.toString(i);
diff --git a/user/test/com/google/gwt/emultest/java/util/ListBenchmark.java b/user/test/com/google/gwt/emultest/java/util/ListBenchmark.java
index a61a9f6..c58675e 100644
--- a/user/test/com/google/gwt/emultest/java/util/ListBenchmark.java
+++ b/user/test/com/google/gwt/emultest/java/util/ListBenchmark.java
@@ -15,15 +15,15 @@
*/
package com.google.gwt.emultest.java.util;
-import com.google.gwt.junit.client.IntRange;
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.client.Operator;
-import com.google.gwt.junit.client.annotations.RangeField;
-import com.google.gwt.junit.client.annotations.RangeEnum;
-import com.google.gwt.junit.client.annotations.Setup;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
+import com.google.gwt.benchmarks.client.RangeEnum;
+import com.google.gwt.benchmarks.client.RangeField;
+import com.google.gwt.benchmarks.client.Setup;
-import java.util.List;
import java.util.Arrays;
+import java.util.List;
/**
* Benchmarks common operations on {@link List Lists}. This test covers
diff --git a/user/test/com/google/gwt/junit/client/BenchmarkTest.java b/user/test/com/google/gwt/junit/client/BenchmarkTest.java
index 54cb922..7540ec9 100644
--- a/user/test/com/google/gwt/junit/client/BenchmarkTest.java
+++ b/user/test/com/google/gwt/junit/client/BenchmarkTest.java
@@ -16,10 +16,13 @@
package com.google.gwt.junit.client;
-import com.google.gwt.junit.client.annotations.RangeField;
-import com.google.gwt.junit.client.annotations.RangeEnum;
-import com.google.gwt.junit.client.annotations.Setup;
-import com.google.gwt.junit.client.annotations.Teardown;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
+import com.google.gwt.benchmarks.client.RangeEnum;
+import com.google.gwt.benchmarks.client.RangeField;
+import com.google.gwt.benchmarks.client.Setup;
+import com.google.gwt.benchmarks.client.Teardown;
/**
* Basic Benchmark testing.