| /* |
| * 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) { |
| } |
| } |
| } |