SelectionScriptLinker was setting the wrong timestamp on
the generated selection script when used in production mode.
It mistakenly thought it was in dev mode.
Review at http://gwt-code-reviews.appspot.com/287801
Review by: scottb@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7824 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
index 9580913..cb62803 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
@@ -216,7 +216,7 @@
* mode, we just set it to now.
*/
long lastModified;
- if (artifacts.find(CompilationResult.class).size() == 0) {
+ if (propMapsByPermutation.isEmpty()) {
lastModified = context.getModuleLastModified();
} else {
lastModified = System.currentTimeMillis();
diff --git a/user/test/com/google/gwt/core/ext/linker/impl/SelectionScriptLinkerUnitTest.java b/user/test/com/google/gwt/core/ext/linker/impl/SelectionScriptLinkerUnitTest.java
index a1b3bf4..433c38a 100644
--- a/user/test/com/google/gwt/core/ext/linker/impl/SelectionScriptLinkerUnitTest.java
+++ b/user/test/com/google/gwt/core/ext/linker/impl/SelectionScriptLinkerUnitTest.java
@@ -22,7 +22,9 @@
import com.google.gwt.core.ext.linker.Artifact;
import com.google.gwt.core.ext.linker.ArtifactSet;
import com.google.gwt.core.ext.linker.ConfigurationProperty;
+import com.google.gwt.core.ext.linker.EmittedArtifact;
import com.google.gwt.core.ext.linker.SelectionProperty;
+import com.google.gwt.core.ext.linker.Shardable;
import com.google.gwt.core.ext.linker.StatementRanges;
import com.google.gwt.dev.Permutation;
import com.google.gwt.dev.cfg.BindingProperty;
@@ -43,54 +45,22 @@
* A regular JUnit test case for {@link SelectionScriptLinker}.
*/
public class SelectionScriptLinkerUnitTest extends TestCase {
- private static class NonShardableSelectionScriptLinker extends
- SelectionScriptLinker {
- @Override
- protected String getCompilationExtension(TreeLogger logger,
- LinkerContext context) {
- return ".js";
- }
-
- @Override
- protected String getModulePrefix(TreeLogger logger, LinkerContext context,
- String strongName) {
- return "MODULE_PREFIX";
- }
-
- @Override
- protected String getModuleSuffix(TreeLogger logger, LinkerContext context) {
- return "MODULE_SUFFIX";
- }
-
- @Override
- protected String getSelectionScriptTemplate(TreeLogger logger,
- LinkerContext context) {
- return SelectionScriptLinkerUnitTest.class.getPackage().getName().replace(
- '.', '/')
- + "/MockTemplate.js";
- }
-
- @Override
- public String getDescription() {
- return getClass().getName();
- }
- }
-
private static class MockLinkerContext implements LinkerContext {
+
public SortedSet<ConfigurationProperty> getConfigurationProperties() {
return new TreeSet<ConfigurationProperty>();
}
public String getModuleFunctionName() {
- return "test";
+ return MOCK_MODULE_NAME;
}
public long getModuleLastModified() {
- return 0;
+ return MOCK_MODULE_LAST_MODIFIED;
}
public String getModuleName() {
- return "test";
+ return MOCK_MODULE_NAME;
}
public SortedSet<SelectionProperty> getProperties() {
@@ -161,6 +131,48 @@
}
}
+ private static class NonShardableSelectionScriptLinker extends
+ SelectionScriptLinker {
+ @Override
+ public String getDescription() {
+ return getClass().getName();
+ }
+
+ @Override
+ protected String getCompilationExtension(TreeLogger logger,
+ LinkerContext context) {
+ return ".js";
+ }
+
+ @Override
+ protected String getModulePrefix(TreeLogger logger, LinkerContext context,
+ String strongName) {
+ return "MODULE_PREFIX";
+ }
+
+ @Override
+ protected String getModuleSuffix(TreeLogger logger, LinkerContext context) {
+ return "MODULE_SUFFIX";
+ }
+
+ @Override
+ protected String getSelectionScriptTemplate(TreeLogger logger,
+ LinkerContext context) {
+ return SelectionScriptLinkerUnitTest.class.getPackage().getName().replace(
+ '.', '/')
+ + "/MockTemplate.js";
+ }
+ }
+
+ @Shardable
+ private static class ShardableSelectionScriptLinker extends
+ NonShardableSelectionScriptLinker {
+ }
+
+ private static final long MOCK_MODULE_LAST_MODIFIED = 1234;
+
+ private static final String MOCK_MODULE_NAME = "test";
+
private static byte[] getBytes(String string) {
try {
return string.getBytes("UTF-8");
@@ -177,10 +189,7 @@
throws UnableToCompleteException {
ArtifactSet artifacts = new ArtifactSet();
- StandardCompilationResult result = new StandardCompilationResult(
- new MockPermutationResult());
- result.addSelectionPermutation(new TreeMap<SelectionProperty, String>());
- result.addSoftPermutation(Collections.<SelectionProperty, String> emptyMap());
+ StandardCompilationResult result = createCompilationResult();
artifacts.add(result);
ArtifactSet updated = new NonShardableSelectionScriptLinker().link(
@@ -189,4 +198,72 @@
SortedSet<SelectionInformation> selectionInfos = updated.find(SelectionInformation.class);
assertEquals(1, selectionInfos.size());
}
+
+ /**
+ * Test timestamps on the selection script. For hosted mode, it should match
+ * the module's timestamp. For dev mode, it should be current.
+ */
+ public void testTimestampOnSelectionScript() throws UnableToCompleteException {
+ // hosted
+ {
+ ArtifactSet artifacts = new ArtifactSet();
+ ArtifactSet updated = new ShardableSelectionScriptLinker().link(
+ TreeLogger.NULL, new MockLinkerContext(), artifacts, false);
+ EmittedArtifact selectionScript = findSelectionScript(updated);
+ assertEquals(MOCK_MODULE_LAST_MODIFIED, selectionScript.getLastModified());
+ }
+
+ // compiled
+ {
+ ArtifactSet artifacts = new ArtifactSet();
+ artifacts.add(createCompilationResult());
+ ArtifactSet updated = new ShardableSelectionScriptLinker().link(
+ TreeLogger.NULL, new MockLinkerContext(), artifacts, true);
+ updated = transferThinning(updated);
+ updated = new ShardableSelectionScriptLinker().link(TreeLogger.NULL,
+ new MockLinkerContext(), updated, false);
+ EmittedArtifact selectionScript = findSelectionScript(updated);
+ assertTrue(MOCK_MODULE_LAST_MODIFIED != selectionScript.getLastModified());
+ }
+ }
+
+ private StandardCompilationResult createCompilationResult() {
+ StandardCompilationResult result = new StandardCompilationResult(
+ new MockPermutationResult());
+ result.addSelectionPermutation(new TreeMap<SelectionProperty, String>());
+ result.addSoftPermutation(Collections.<SelectionProperty, String> emptyMap());
+ return result;
+ }
+
+ private EmittedArtifact findEmittedArtifact(ArtifactSet updated,
+ String partialPath) {
+ for (EmittedArtifact art : updated.find(EmittedArtifact.class)) {
+ if (art.getPartialPath().equals(partialPath)) {
+ return art;
+ }
+ }
+ return null;
+ }
+
+ private EmittedArtifact findSelectionScript(ArtifactSet updated) {
+ return findEmittedArtifact(updated, MOCK_MODULE_NAME + ".nocache.js");
+ }
+
+ /**
+ * Thin down the artifact set as if it were being transmitted back. The method
+ * in Link cannot be used because it wants a StandardLinkerContext, not an
+ * arbitrary LinkerContext.
+ */
+ @SuppressWarnings("unchecked")
+ private ArtifactSet transferThinning(ArtifactSet artifacts) {
+ ArtifactSet updated = new ArtifactSet();
+ // The raw type Artifact is to work around a Java compiler bug:
+ // http://bugs.sun.com/view_bug.do?bug_id=6548436
+ for (Artifact art : artifacts) {
+ if (art.isTransferableFromShards() || (art instanceof EmittedArtifact)) {
+ updated.add(art);
+ }
+ }
+ return updated;
+ }
}