One-line fix to SelectionScript's fallback logic for non-shardable subclasses. Review at http://gwt-code-reviews.appspot.com/183801 Review by: robertvawter@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7771 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 bd10d45..d78ee8d 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
@@ -125,7 +125,7 @@ public ArtifactSet link(TreeLogger logger, LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException { ArtifactSet toReturn = link(logger, context, artifacts, true); - toReturn = link(logger, context, artifacts, false); + toReturn = link(logger, context, toReturn, false); return toReturn; }
diff --git a/user/test/com/google/gwt/core/ext/LinkerSuite.java b/user/test/com/google/gwt/core/ext/LinkerSuite.java index 0728c04..4c47a70 100644 --- a/user/test/com/google/gwt/core/ext/LinkerSuite.java +++ b/user/test/com/google/gwt/core/ext/LinkerSuite.java
@@ -16,6 +16,7 @@ package com.google.gwt.core.ext; import com.google.gwt.core.ext.linker.impl.SelectionScriptJavaScriptTest; +import com.google.gwt.core.ext.linker.impl.SelectionScriptLinkerUnitTest; import com.google.gwt.core.ext.test.IFrameLinkerTest; import com.google.gwt.core.ext.test.XSLinkerTest; import com.google.gwt.junit.tools.GWTTestSuite; @@ -23,7 +24,8 @@ import junit.framework.Test; /** - * Runs the linker tests. See the subclasses of {@link LinkerTest}. + * Runs the linker tests. See the subclasses of + * {@link com.google.gwt.core.ext.test.LinkerTest}. */ public class LinkerSuite { @@ -33,10 +35,11 @@ // $JUnit-BEGIN$ suite.addTestSuite(IFrameLinkerTest.class); suite.addTestSuite(SelectionScriptJavaScriptTest.class); + suite.addTestSuite(SelectionScriptLinkerUnitTest.class); suite.addTestSuite(XSLinkerTest.class); /* - * Note: Single-script linking is disabled by default, because - * it only works when the test is run for a single permutation. + * Note: Single-script linking is disabled by default, because it only works + * when the test is run for a single permutation. */ // suite.addTestSuite(SingleScriptLinkerTest.class); // $JUnit-END$
diff --git a/user/test/com/google/gwt/core/ext/linker/impl/MockTemplate.js b/user/test/com/google/gwt/core/ext/linker/impl/MockTemplate.js new file mode 100644 index 0000000..e16bb86 --- /dev/null +++ b/user/test/com/google/gwt/core/ext/linker/impl/MockTemplate.js
@@ -0,0 +1 @@ +// This template file is used by SelectionScriptLinkerUnitTest
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 new file mode 100644 index 0000000..6b84a5c --- /dev/null +++ b/user/test/com/google/gwt/core/ext/linker/impl/SelectionScriptLinkerUnitTest.java
@@ -0,0 +1,206 @@ +/* + * Copyright 2010 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.core.ext.linker.impl; + +import com.google.gwt.core.ext.LinkerContext; +import com.google.gwt.core.ext.TreeLogger; +import com.google.gwt.core.ext.UnableToCompleteException; +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.SelectionProperty; +import com.google.gwt.core.ext.linker.StatementRanges; +import com.google.gwt.dev.Permutation; +import com.google.gwt.dev.cfg.BindingProperty; +import com.google.gwt.dev.cfg.StaticPropertyOracle; +import com.google.gwt.dev.jjs.PermutationResult; + +import junit.framework.TestCase; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * 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 { + @Override + public SortedSet<ConfigurationProperty> getConfigurationProperties() { + return new TreeSet<ConfigurationProperty>(); + } + + @Override + public String getModuleFunctionName() { + return "test"; + } + + @Override + public long getModuleLastModified() { + return 0; + } + + @Override + public String getModuleName() { + return "test"; + } + + @Override + public SortedSet<SelectionProperty> getProperties() { + return new TreeSet<SelectionProperty>(); + } + + @Override + public boolean isOutputCompact() { + return true; + } + + @Override + public String optimizeJavaScript(TreeLogger logger, String jsProgram) { + return jsProgram; + } + } + + private static class MockPermutationResult implements PermutationResult { + private ArtifactSet artifacts = new ArtifactSet(); + + @Override + public void addArtifacts(Collection<? extends Artifact<?>> newArtifacts) { + artifacts.addAll(newArtifacts); + } + + @Override + public ArtifactSet getArtifacts() { + return artifacts; + } + + @Override + public byte[][] getJs() { + return new byte[][] { + getBytes("code for fragment 0"), getBytes("code for fragment 1")}; + } + + @Override + public Permutation getPermutation() { + return new Permutation(0, new StaticPropertyOracle( + new BindingProperty[0], new String[0], + new com.google.gwt.dev.cfg.ConfigurationProperty[0])); + } + + @Override + public byte[] getSerializedSymbolMap() { + return getBytes("symbol map"); + } + + @Override + public StatementRanges[] getStatementRanges() { + ArrayList<StatementRanges> ranges = new ArrayList<StatementRanges>(); + for (byte[] js : getJs()) { + ranges.add(new MockStatementRanges(js.length)); + } + return ranges.toArray(new StatementRanges[0]); + } + } + + private static class MockStatementRanges implements StatementRanges { + private int length; + + MockStatementRanges(int length) { + this.length = length; + } + + @Override + public int end(int i) { + return length; + } + + @Override + public int numStatements() { + return 1; + } + + @Override + public int start(int i) { + return 0; + } + } + + private static byte[] getBytes(String string) { + try { + return string.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + /** + * Test that running a non-shardable linker in simulated sharding mode does + * not lose the permutations. + */ + public void testNonShardableHasPermutations() + throws UnableToCompleteException { + ArtifactSet artifacts = new ArtifactSet(); + + StandardCompilationResult result = new StandardCompilationResult( + new MockPermutationResult()); + result.addSelectionPermutation(new TreeMap<SelectionProperty, String>()); + artifacts.add(result); + + ArtifactSet updated = new NonShardableSelectionScriptLinker().link( + TreeLogger.NULL, new MockLinkerContext(), artifacts); + + SortedSet<SelectionInformation> selectionInfos = updated.find(SelectionInformation.class); + assertEquals(1, selectionInfos.size()); + } +}