| /* |
| * Copyright 2011 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.sample.core.linker; |
| |
| 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.ArtifactSet; |
| import com.google.gwt.core.ext.linker.ConfigurationProperty; |
| import com.google.gwt.core.ext.linker.SelectionProperty; |
| import com.google.gwt.core.ext.linker.SyntheticArtifact; |
| import com.google.gwt.core.ext.linker.impl.SelectionInformation; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.InputStream; |
| import java.util.Scanner; |
| import java.util.SortedSet; |
| import java.util.TreeMap; |
| import java.util.TreeSet; |
| |
| /** |
| * Tests {@link SimpleAppCacheLinker}. |
| */ |
| public class SimpleAppCacheLinkerTest extends TestCase { |
| /** |
| * A {@code SimpleAppCacheLinker} mocking the addition of a static entry. |
| */ |
| public static class OneStaticFileAppCacheLinker extends SimpleAppCacheLinker { |
| |
| @Override |
| protected String[] otherCachedFiles() { |
| return new String[] {"aStaticFile"}; |
| } |
| } |
| |
| private static class MockLinkerContext implements LinkerContext { |
| |
| public SortedSet<ConfigurationProperty> getConfigurationProperties() { |
| return new TreeSet<ConfigurationProperty>(); |
| } |
| |
| public String getModuleFunctionName() { |
| return null; |
| } |
| |
| public long getModuleLastModified() { |
| return 0; |
| } |
| |
| public String getModuleName() { |
| return null; |
| } |
| |
| public SortedSet<SelectionProperty> getProperties() { |
| return new TreeSet<SelectionProperty>(); |
| } |
| |
| public boolean isOutputCompact() { |
| return true; |
| } |
| |
| public String optimizeJavaScript(TreeLogger logger, String jsProgram) { |
| return jsProgram; |
| } |
| } |
| |
| private ArtifactSet artifacts; |
| |
| private TreeLogger logger; |
| |
| @Override |
| public void setUp() { |
| artifacts = new ArtifactSet(); |
| artifacts.add(new SelectionInformation("foo", 0, new TreeMap<String, String>())); |
| logger = TreeLogger.NULL; |
| } |
| |
| public void testAddCachableArtifacts() throws UnableToCompleteException { |
| SimpleAppCacheLinker linker = new SimpleAppCacheLinker(); |
| |
| // Some cacheable artifact |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "foo.bar", new byte[0])); |
| |
| ArtifactSet result = linker.link(logger, new MockLinkerContext(), artifacts, false); |
| |
| assertEquals(3, result.size()); |
| assertHasOneManifest(result); |
| assertTrue(getManifestContents(result).contains("foo.bar")); |
| } |
| |
| public void testAddStaticFiles() throws UnableToCompleteException { |
| SimpleAppCacheLinker linker = new OneStaticFileAppCacheLinker(); |
| |
| ArtifactSet result = linker.link(logger, new MockLinkerContext(), artifacts, false); |
| |
| assertEquals(2, result.size()); |
| assertHasOneManifest(result); |
| assertTrue(getManifestContents(result).contains("aStaticFile")); |
| } |
| |
| public void testEmptyManifestDevMode() throws UnableToCompleteException { |
| // No SelectionInformation artifact |
| artifacts = new ArtifactSet(); |
| |
| SimpleAppCacheLinker linker = new SimpleAppCacheLinker(); |
| |
| // Some cacheable artifact |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "foo.bar", new byte[0])); |
| |
| ArtifactSet result = linker.link(logger, new MockLinkerContext(), artifacts, false); |
| |
| assertHasOneManifest(result); |
| assertFalse(getManifestContents(result).contains("foo.bar")); |
| } |
| |
| public void testManifestOnlyOnLastPass() throws UnableToCompleteException { |
| SimpleAppCacheLinker linker = new SimpleAppCacheLinker(); |
| |
| ArtifactSet result = linker.link(logger, new MockLinkerContext(), artifacts, true); |
| |
| assertEquals(artifacts, result); |
| |
| result = linker.link(logger, new MockLinkerContext(), artifacts, false); |
| |
| assertEquals(2, result.size()); |
| assertHasOneManifest(result); |
| } |
| |
| public void testNoNonCachableArtifacts() throws UnableToCompleteException { |
| SimpleAppCacheLinker linker = new SimpleAppCacheLinker(); |
| |
| // Some non-cacheable artifacts |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "soycReport.baz", new byte[0])); |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "foo.symbolMap", new byte[0])); |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "foo.xml.gz", new byte[0])); |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "foo.rpc.log", new byte[0])); |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "foo.gwt.rpc", new byte[0])); |
| artifacts.add(new SyntheticArtifact(SimpleAppCacheLinker.class, "rpcPolicyManifest.bar", new byte[0])); |
| |
| ArtifactSet result = linker.link(TreeLogger.NULL, new MockLinkerContext(), artifacts, false); |
| |
| assertEquals(8, result.size()); |
| assertHasOneManifest(result); |
| assertFalse(getManifestContents(result).contains("soycReport")); |
| assertFalse(getManifestContents(result).contains("symbolMap")); |
| assertFalse(getManifestContents(result).contains("xml.gz")); |
| assertFalse(getManifestContents(result).contains("rpc.log")); |
| assertFalse(getManifestContents(result).contains("gwt.rpc")); |
| assertFalse(getManifestContents(result).contains("rpcPolicyManifest")); |
| } |
| |
| private void assertHasOneManifest(ArtifactSet artifacts) { |
| int manifestCount = 0; |
| for (SyntheticArtifact artifact : artifacts.find(SyntheticArtifact.class)) { |
| if ("appcache.nocache.manifest".equals(artifact.getPartialPath())) { |
| assertEquals("appcache.nocache.manifest", artifact.getPartialPath()); |
| manifestCount++; |
| } |
| } |
| assertEquals(1, manifestCount); |
| } |
| |
| private String getArtifactContents(SyntheticArtifact artifact) throws UnableToCompleteException { |
| InputStream is = artifact.getContents(logger); |
| String contents = new Scanner(is).useDelimiter("\\A").next(); |
| return contents; |
| } |
| |
| private SyntheticArtifact getManifest(ArtifactSet artifacts) { |
| for (SyntheticArtifact artifact : artifacts.find(SyntheticArtifact.class)) { |
| if ("appcache.nocache.manifest".equals(artifact.getPartialPath())) { |
| assertEquals("appcache.nocache.manifest", artifact.getPartialPath()); |
| return artifact; |
| } |
| } |
| fail("Manifest not found"); |
| return null; |
| } |
| |
| private String getManifestContents(ArtifactSet artifacts) throws UnableToCompleteException { |
| return getArtifactContents(getManifest(artifacts)); |
| } |
| } |