Add a higher-level test for coverage. Review at http://gwt-code-reviews.appspot.com/1813803 Review by: skybrian@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11232 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java b/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java index 748c7dd..fd44cd1 100644 --- a/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java +++ b/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java
@@ -32,6 +32,7 @@ import com.google.gwt.dev.js.ast.JsExpression; import com.google.gwt.thirdparty.guava.common.base.Charsets; import com.google.gwt.thirdparty.guava.common.collect.HashMultimap; +import com.google.gwt.thirdparty.guava.common.collect.ImmutableSet; import com.google.gwt.thirdparty.guava.common.collect.Multimap; import com.google.gwt.thirdparty.guava.common.collect.Sets; import com.google.gwt.thirdparty.guava.common.io.Files; @@ -51,6 +52,9 @@ private static Set<String> getCoveredSourceFiles() { String filename = System.getProperty("gwt.coverage"); + if (filename.indexOf(',') != -1) { + return ImmutableSet.copyOf(filename.split(",")); + } File instrumentationFile = new File(filename); try { return Sets.newHashSet(Files.readLines(instrumentationFile, Charsets.UTF_8)); @@ -134,4 +138,4 @@ }.accept(jProgram); return instrumentableLines; } -} \ No newline at end of file +}
diff --git a/user/build.xml b/user/build.xml index 21f9801..3290ba5 100755 --- a/user/build.xml +++ b/user/build.xml
@@ -559,6 +559,23 @@ </gwt.junit> </target> + <target name="test.coverage.htmlunit" + depends="compile, compile.tests" + description="Run tests for coverage support"> + <fileset id="test.coverage.htmlunit.tests" dir="${javac.junit.out}" + includes="com/google/gwt/dev/js/client/CoverageTest.class" + excludes="" /> + <gwt.junit test.name="test.coverage.htmlunit" + test.args="${test.args} -draftCompile -out www -prod -runStyle HtmlUnit:FF3.6" + test.jvmargs="${test.jvmargs} -Dgwt.coverage=com/google/gwt/dev/js/client/CoverageTestModule.java," + test.out="${junit.out}/coverage-htmlunit" + test.cases="test.coverage.htmlunit.tests" > + <extraclasspaths> + <path refid="test.extraclasspath" /> + </extraclasspaths> + </gwt.junit> + </target> + <target name="test" depends="compile, compile.tests" description="Run all tests for this project."> @@ -593,6 +610,7 @@ <antcall target="test.draft.htmlunit"/> <antcall target="test.nometa.htmlunit"/> <antcall target="test.nongwt"/> + <antcall target="test.coverage.htmlunit"/> </parallel> </limit> </target> @@ -614,6 +632,7 @@ <antcall target="test.web.htmlunit"/> <antcall target="test.draft.htmlunit"/> <antcall target="test.nometa.htmlunit"/> + <antcall target="test.coverage.htmlunit"/> </parallel> </limit> </target>
diff --git a/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java b/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java index 2c18533..fcf5571 100644 --- a/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java +++ b/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
@@ -236,7 +236,7 @@ private static Map<String, BrowserVersion> createBrowserMap() { Map<String, BrowserVersion> browserMap = new HashMap<String, BrowserVersion>(); for (BrowserVersion browser : new BrowserVersion[] { - BrowserVersion.FIREFOX_3, BrowserVersion.INTERNET_EXPLORER_6, + BrowserVersion.FIREFOX_3, BrowserVersion.FIREFOX_3_6, BrowserVersion.INTERNET_EXPLORER_6, BrowserVersion.INTERNET_EXPLORER_7}) { browserMap.put(browser.getNickname(), browser); }
diff --git a/user/test/com/google/gwt/dev/js/CoverageTestModule.gwt.xml b/user/test/com/google/gwt/dev/js/CoverageTestModule.gwt.xml new file mode 100644 index 0000000..83e975c --- /dev/null +++ b/user/test/com/google/gwt/dev/js/CoverageTestModule.gwt.xml
@@ -0,0 +1,4 @@ +<module> + <inherits name="com.google.gwt.user.User"/> + <inherits name="com.google.gwt.json.JSON"/> +</module> \ No newline at end of file
diff --git a/user/test/com/google/gwt/dev/js/client/CoverageTest.java b/user/test/com/google/gwt/dev/js/client/CoverageTest.java new file mode 100644 index 0000000..77edb5b --- /dev/null +++ b/user/test/com/google/gwt/dev/js/client/CoverageTest.java
@@ -0,0 +1,81 @@ +/* + * Copyright 2012 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.dev.js.client; + +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONParser; +import com.google.gwt.junit.client.GWTTestCase; +import com.google.gwt.storage.client.Storage; + +import java.util.HashMap; +import java.util.Map; + +/** + * Tests coverage instrumentation. + */ +public class CoverageTest extends GWTTestCase { + private static final Map<String, Double> EXPECTED_COVERAGE = new HashMap<String, Double>() { { + put("25", 1.0); + put("26", 1.0); + put("27", 1.0); + put("29", 1.0); + put("31", 0.0); + }}; + + @Override + public String getModuleName() { + return "com.google.gwt.dev.js.CoverageTestModule"; + } + + /* + * Trigger the onbeforeunload handler. It would be nice to do this by refreshing the page or + * something, but that causes the test to fail. + */ + private static native void fireOnBeforeUnloadEvent() /*-{ + for (var i = 0; i < $wnd.frames.length; i++) { + if (typeof $wnd.frames[i].onbeforeunload === 'function') { + $wnd.frames[i].onbeforeunload(); + } + } + }-*/; + + public void testCoverageDataIsFlushedToLocalStorageOnBeforeUnload() { + Storage localStorage = Storage.getLocalStorageIfSupported(); + assertNotNull("Test browser does not support localStorage", localStorage); + // No coverage initially + assertNull("Found unexpected initial coverage", localStorage.getItem("gwt_coverage")); + + CoverageTestModule.method(); + + // Trigger the onbeforeunload handler to flush the coverage information to localStorage. + fireOnBeforeUnloadEvent(); + String coverageAsJson = localStorage.getItem("gwt_coverage"); + assertNotNull("No coverage data found", coverageAsJson); + JSONObject coverage = JSONParser.parseStrict(coverageAsJson).isObject(); + assertNotNull("Coverage data was not valid JSON", coverage); + + JSONObject fileCoverage = + coverage.get("com/google/gwt/dev/js/client/CoverageTestModule.java").isObject(); + assertNotNull(fileCoverage); + for (Map.Entry<String, Double> lineCoverage : EXPECTED_COVERAGE.entrySet()) { + assertTrue(fileCoverage.containsKey(lineCoverage.getKey())); + JSONNumber value = fileCoverage.get(lineCoverage.getKey()).isNumber(); + assertNotNull(value); + assertEquals(lineCoverage.getValue(), value.doubleValue(), 0.0001); + } + } +}
diff --git a/user/test/com/google/gwt/dev/js/client/CoverageTestModule.java b/user/test/com/google/gwt/dev/js/client/CoverageTestModule.java new file mode 100644 index 0000000..bf6d2fc --- /dev/null +++ b/user/test/com/google/gwt/dev/js/client/CoverageTestModule.java
@@ -0,0 +1,34 @@ +/* + * Copyright 2012 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.dev.js.client; + +import com.google.gwt.core.client.GWT; + +/** + * Dummy class used to verify that coverage is sane. + */ +public class CoverageTestModule { + public static void method() { + Integer x = new Integer(42); + int y = x + 10; + if (x < y) { + // This comment will be ignored + GWT.log("This line should be covered"); + } else { + GWT.log("This line should not be covered"); + } + } +}