blob: fb826f7d692fe31a1c43458337afba3697a94d7c [file] [log] [blame]
/*
* 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));
}
}