blob: c7b5863c996ccdf1ccbb938610fb83059804875a [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.core.server;
import com.google.gwt.core.server.ServerGwtBridge.ClassInstantiatorBase;
import com.google.gwt.core.server.ServerGwtBridge.Properties;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.i18n.shared.Localizable;
import junit.framework.TestCase;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.StreamHandler;
/**
* Test for {@link ServerGwtBridge}.
*/
public class ServerGwtBridgeTest extends TestCase {
/**
* Test interface to automatically find implementation classes.
*/
public interface Bar {
}
/**
* Test implementation for {@link Bar}.
*/
public static class BarImpl implements Bar {
}
/**
* Test interface for no implementations.
*/
public interface Boo {
}
/**
* Test interface for localizations.
*/
public interface Foo extends Localizable {
String locale();
}
/**
* Test implementation class for default localization of {@link Foo}.
*/
public static class Foo_ implements Foo {
@Override
public String locale() {
return "default";
}
}
/**
* Test implementation class for en localization of {@link Foo}.
*/
public static class Foo_en implements Foo {
@Override
public String locale() {
return "en";
}
}
/**
* Test implementation class for en_US localization of {@link Foo}.
*/
public static class Foo_en_US implements Foo {
@Override
public String locale() {
return "en_US";
}
}
private final ServerGwtBridge bridge = ServerGwtBridge.getInstance();
private final String de = "de";
private final String defaultLocale = "default";
private final String en = "en";
private final String en_GB = "en_GB";
private final String en_US = "en_US";
private final String en_US_POSIX = "en_US_POSIX";
public void testBazDe() {
bridge.setGlobalProperty("locale", de);
Baz foo = bridge.create(Baz.class);
assertEquals("default", foo.locale());
}
public void testBazDefault() {
bridge.setGlobalProperty("locale", defaultLocale);
Baz foo = bridge.create(Baz.class);
assertEquals("default", foo.locale());
}
public void testBazEn() {
bridge.setGlobalProperty("locale", en);
Baz foo = bridge.create(Baz.class);
assertEquals("en", foo.locale());
}
public void testBazEnGb() {
bridge.setGlobalProperty("locale", en_GB);
Baz foo = bridge.create(Baz.class);
assertEquals("en", foo.locale());
}
public void testBazEnUs() {
bridge.setGlobalProperty("locale", en_US);
Baz foo = bridge.create(Baz.class);
assertEquals("en_US", foo.locale());
}
public void testBazEnUsPosix() {
bridge.setGlobalProperty("locale", en_US_POSIX);
Baz foo = bridge.create(Baz.class);
assertEquals("en_US", foo.locale());
}
public void testFooDe() {
bridge.setGlobalProperty("locale", de);
Foo foo = bridge.create(Foo.class);
assertEquals("default", foo.locale());
}
public void testFooDefault() {
bridge.setGlobalProperty("locale", defaultLocale);
Foo foo = bridge.create(Foo.class);
assertEquals("default", foo.locale());
}
public void testFooEn() {
bridge.setGlobalProperty("locale", en);
Foo foo = bridge.create(Foo.class);
assertEquals("en", foo.locale());
}
public void testFooEnGb() {
bridge.setGlobalProperty("locale", en_GB);
Foo foo = bridge.create(Foo.class);
assertEquals("en", foo.locale());
}
public void testFooEnUs() {
bridge.setGlobalProperty("locale", en_US);
Foo foo = bridge.create(Foo.class);
assertEquals("en_US", foo.locale());
}
public void testFooEnUsPosix() {
bridge.setGlobalProperty("locale", en_US_POSIX);
Foo foo = bridge.create(Foo.class);
assertEquals("en_US", foo.locale());
}
public void testLogging() throws IOException {
// setup the logger
Logger logger = Logger.getLogger(ServerGwtBridge.class.getName());
logger.setLevel(Level.INFO);
logger.setUseParentHandlers(false);
for (Handler handler : logger.getHandlers()) {
logger.removeHandler(handler);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StreamHandler handler = new StreamHandler(baos, new Formatter() {
private String lineSeparator = System.getProperty("line.separator", "\n");
@Override
public synchronized String format(LogRecord record) {
StringBuilder buf = new StringBuilder();
String msg = formatMessage(record);
buf.append(record.getLevel().getName()).append(": ").append(msg).append(lineSeparator);
if (record.getThrown() != null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
record.getThrown().printStackTrace(pw);
pw.close();
buf.append(sw.toString());
}
return buf.toString();
}
});
logger.addHandler(handler);
// log some things
GWT.log("msg1");
Throwable t = new RuntimeException("foo");
t.fillInStackTrace();
GWT.log("msg2", t);
handler.flush();
// check what we logged
BufferedReader reader = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(baos.toByteArray())));
assertEquals("INFO: msg1", reader.readLine());
assertEquals("INFO: msg2", reader.readLine());
assertEquals(RuntimeException.class.getName() + ": foo", reader.readLine());
assertTrue(reader.readLine().startsWith("\tat " + ServerGwtBridgeTest.class.getName()));
}
/**
* Check that when there are multiple instantiators for a given class, the
* most recently registered one has priority.
*/
public void testLastOverrides() {
ServerGwtBridge thisBridge = new ServerGwtBridge();
thisBridge.register(Object.class, new ClassInstantiatorBase() {
@SuppressWarnings("unchecked")
@Override
public <T> T create(Class<?> baseClass, Properties properties) {
return (T) tryCreate(BarImpl.class);
}
});
Object obj = thisBridge.create(Boo.class);
assertNotNull(obj);
assertTrue(obj instanceof BarImpl);
}
public void testObjectClass() {
bridge.setGlobalProperty("locale", defaultLocale);
Bar bar = bridge.create(BarImpl.class);
assertNotNull(bar);
assertTrue(bar instanceof BarImpl);
}
public void testObjectInterface() {
bridge.setGlobalProperty("locale", defaultLocale);
Bar bar = bridge.create(BarImpl.class);
assertNotNull(bar);
assertTrue(bar instanceof BarImpl);
}
public void testObjectInterfaceNoImpl() {
bridge.setGlobalProperty("locale", defaultLocale);
try {
@SuppressWarnings("unused")
Boo boo = bridge.create(Boo.class);
fail("expected exception");
} catch (RuntimeException expected) {
}
}
}