/* * Copyright 2009 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.dev.shell; import com.google.gwt.dev.util.TemporaryBufferStream; import com.google.gwt.dev.shell.BrowserChannel.MessageType; import com.google.gwt.dev.shell.BrowserChannel.Value; import com.google.gwt.dev.shell.BrowserChannel.SessionHandler.SpecialDispatchId; import com.google.gwt.dev.shell.BrowserChannel.Value.ValueType; import com.google.gwt.dev.shell.BrowserChannel.CheckVersionsMessage; import com.google.gwt.dev.shell.BrowserChannel.ChooseTransportMessage; import com.google.gwt.dev.shell.BrowserChannel.FatalErrorMessage; import com.google.gwt.dev.shell.BrowserChannel.FreeMessage; import com.google.gwt.dev.shell.BrowserChannel.InvokeOnClientMessage; import com.google.gwt.dev.shell.BrowserChannel.InvokeOnServerMessage; import com.google.gwt.dev.shell.BrowserChannel.InvokeSpecialMessage; import com.google.gwt.dev.shell.BrowserChannel.JavaObjectRef; import com.google.gwt.dev.shell.BrowserChannel.LoadJsniMessage; import com.google.gwt.dev.shell.BrowserChannel.LoadModuleMessage; import com.google.gwt.dev.shell.BrowserChannel.OldLoadModuleMessage; import com.google.gwt.dev.shell.BrowserChannel.ProtocolVersionMessage; import com.google.gwt.dev.shell.BrowserChannel.QuitMessage; import com.google.gwt.dev.shell.BrowserChannel.RequestIconMessage; import com.google.gwt.dev.shell.BrowserChannel.ReturnMessage; import com.google.gwt.dev.shell.BrowserChannel.SwitchTransportMessage; import com.google.gwt.dev.shell.BrowserChannel.UserAgentIconMessage; import junit.framework.TestCase; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; /** * Test for {@link BrowserChannel}. */ public class BrowserChannelTest extends TestCase { // TODO(jat): add more tests for Value types private TemporaryBufferStream bufferStream = new TemporaryBufferStream(); private DataInputStream iStr = new DataInputStream( bufferStream.getInputStream()); private DataOutputStream oStr = new DataOutputStream( bufferStream.getOutputStream()); private TestBrowserChannel channel; public void testBooleanValue() throws IOException { Value val = new Value(); val.setBoolean(true); channel.writeValue(oStr, val); val = channel.readValue(iStr); assertEquals(ValueType.BOOLEAN, val.getType()); assertEquals(true, val.getBoolean()); val.setBoolean(false); channel.writeValue(oStr, val); val = channel.readValue(iStr); assertEquals(ValueType.BOOLEAN, val.getType()); assertEquals(false, val.getBoolean()); } public void testCheckVersions() throws IOException, BrowserChannelException { int minVersion = BrowserChannel.PROTOCOL_VERSION_OLDEST; int maxVersion = BrowserChannel.PROTOCOL_VERSION_CURRENT; String hostedHtmlVersion = HostedHtmlVersion.EXPECTED_GWT_ONLOAD_VERSION; new CheckVersionsMessage(channel, minVersion, maxVersion, hostedHtmlVersion).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.CHECK_VERSIONS, type); CheckVersionsMessage message = CheckVersionsMessage.receive(channel); assertEquals(minVersion, message.getMinVersion()); assertEquals(maxVersion, message.getMaxVersion()); assertEquals(hostedHtmlVersion, message.getHostedHtmlVersion()); } public void testChooseTransport() throws IOException, BrowserChannelException { String[] transports = new String[] { "shm" }; new ChooseTransportMessage(channel, transports).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.CHOOSE_TRANSPORT, type); ChooseTransportMessage message = ChooseTransportMessage.receive(channel); String[] transportsRecv = message.getTransports(); assertTrue(Arrays.equals(transports, transportsRecv)); } public void testFatalErrorMessage() throws IOException, BrowserChannelException { String error = "Fatal error"; new FatalErrorMessage(channel, error).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.FATAL_ERROR, type); FatalErrorMessage message = FatalErrorMessage.receive(channel); assertEquals(error, message.getError()); } public void testFreeMessage() throws IOException, BrowserChannelException { int[] ids = new int[] { 42, 1024 }; new FreeMessage(channel, ids).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.FREE_VALUE, type); FreeMessage message = FreeMessage.receive(channel); int[] idsRecv = message.getIds(); assertTrue(Arrays.equals(ids, idsRecv)); } public void testInvokeOnClientMessage() throws IOException, BrowserChannelException { String methodName = "fooMethod"; Value thisRef = new Value(); thisRef.setJavaObject(new JavaObjectRef(42)); Value[] args = new Value[] { new Value(), new Value(), }; args[0].setInt(0); args[1].setInt(1); new InvokeOnClientMessage(channel, methodName, thisRef, args).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.INVOKE, type); InvokeOnClientMessage message = InvokeOnClientMessage.receive(channel); assertEquals(methodName, message.getMethodName()); Value thisRefRecv = message.getThis(); assertEquals(ValueType.JAVA_OBJECT, thisRefRecv.getType()); assertEquals(42, thisRefRecv.getJavaObject().getRefid()); Value[] argsRecv = message.getArgs(); assertEquals(2, argsRecv.length); for (int i = 0; i < 2; ++i) { assertEquals(ValueType.INT, argsRecv[i].getType()); assertEquals(i, argsRecv[i].getInt()); } } public void testInvokeOnServerMessage() throws IOException, BrowserChannelException { int methodId = -1; Value thisRef = new Value(); thisRef.setJavaObject(new JavaObjectRef(42)); Value[] args = new Value[] { new Value(), new Value(), }; args[0].setInt(0); args[1].setInt(1); new InvokeOnServerMessage(channel, methodId, thisRef, args).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.INVOKE, type); InvokeOnServerMessage message = InvokeOnServerMessage.receive(channel); assertEquals(methodId, message.getMethodDispatchId()); Value thisRefRecv = message.getThis(); assertEquals(ValueType.JAVA_OBJECT, thisRefRecv.getType()); assertEquals(42, thisRefRecv.getJavaObject().getRefid()); Value[] argsRecv = message.getArgs(); assertEquals(2, argsRecv.length); for (int i = 0; i < 2; ++i) { assertEquals(ValueType.INT, argsRecv[i].getType()); assertEquals(i, argsRecv[i].getInt()); } } public void testInvokeSpecialMessage() throws IOException, BrowserChannelException { Value[] args = new Value[] { new Value(), new Value(), }; args[0].setInt(0); args[1].setInt(1); new InvokeSpecialMessage(channel, SpecialDispatchId.HasMethod, args).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.INVOKE_SPECIAL, type); InvokeSpecialMessage message = InvokeSpecialMessage.receive(channel); assertEquals(SpecialDispatchId.HasMethod, message.getDispatchId()); Value[] argsRecv = message.getArgs(); assertEquals(2, argsRecv.length); for (int i = 0; i < 2; ++i) { assertEquals(ValueType.INT, argsRecv[i].getType()); assertEquals(i, argsRecv[i].getInt()); } } public void testLoadJsniMessage() throws IOException, BrowserChannelException { String jsni = "function foo() { }"; new LoadJsniMessage(channel, jsni).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.LOAD_JSNI, type); LoadJsniMessage message = LoadJsniMessage.receive(channel); assertEquals(jsni, message.getJsni()); } public void testLoadModuleMessage() throws IOException, BrowserChannelException { String url = "http://www.google.com"; String sessionKey = "asdkfjklAI*23ja"; String tabKey = "372F4"; String moduleName = "org.example.Hello"; String userAgent = "Firefox"; new LoadModuleMessage(channel, url, tabKey, sessionKey, moduleName, userAgent).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.LOAD_MODULE, type); LoadModuleMessage message = LoadModuleMessage.receive(channel); assertEquals(url, message.getUrl()); assertEquals(tabKey, message.getTabKey()); assertEquals(sessionKey, message.getSessionKey()); assertEquals(moduleName, message.getModuleName()); assertEquals(userAgent, message.getUserAgent()); url = "https://www.google.com:8443/extra_stuff_that_is_really_long?foo"; sessionKey = "asdfkasdjfkjaskldfjkajsfkjasdfjklaasdkfjklAI*23ja"; tabKey = ""; moduleName = "showcase"; userAgent = "Safari"; new LoadModuleMessage(channel, url, tabKey, sessionKey, moduleName, userAgent).send(); type = channel.readMessageType(); assertEquals(MessageType.LOAD_MODULE, type); message = LoadModuleMessage.receive(channel); assertEquals(url, message.getUrl()); assertEquals(tabKey, message.getTabKey()); assertEquals(sessionKey, message.getSessionKey()); assertEquals(moduleName, message.getModuleName()); assertEquals(userAgent, message.getUserAgent()); // create a separate channel so we don't cause problems with partial // messages written to the stream TemporaryBufferStream tempBufferStream = new TemporaryBufferStream(); TestBrowserChannel trashableChannel = new TestBrowserChannel( tempBufferStream.getInputStream(), tempBufferStream.getOutputStream()); try { new LoadModuleMessage(trashableChannel, null, tabKey, sessionKey, moduleName, userAgent).send(); fail("Expected exception with null url"); } catch (AssertionError expected) { // If assertions are on. } catch (NullPointerException expected) { // If assertions are off. } try { new LoadModuleMessage(trashableChannel, url, null, sessionKey, moduleName, userAgent).send(); fail("Expected exception with null tabKey"); } catch (AssertionError expected) { // If assertions are on. } catch (NullPointerException expected) { // If assertions are off. } try { new LoadModuleMessage(trashableChannel, url, tabKey, null, moduleName, userAgent).send(); fail("Expected exception with null sessionKey"); } catch (AssertionError expected) { // If assertions are on. } catch (NullPointerException expected) { // If assertions are off. } try { new LoadModuleMessage(trashableChannel, url, tabKey, sessionKey, null, userAgent).send(); fail("Expected exception with null moduleName"); } catch (AssertionError expected) { // If assertions are on. } catch (NullPointerException expected) { // If assertions are off. } try { new LoadModuleMessage(trashableChannel, url, tabKey, sessionKey, moduleName, null).send(); fail("Expected exception with null userAgent"); } catch (AssertionError expected) { // If assertions are on. } catch (NullPointerException expected) { // If assertions are off. } } public void testOldLoadModuleMessage() throws IOException, BrowserChannelException { int protoVersion = 42; String moduleName = "org.example.Hello"; String userAgent = "Firefox"; new OldLoadModuleMessage(channel, protoVersion, moduleName, userAgent).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.OLD_LOAD_MODULE, type); OldLoadModuleMessage message = OldLoadModuleMessage.receive(channel); assertEquals(protoVersion, message.getProtoVersion()); assertEquals(moduleName, message.getModuleName()); assertEquals(userAgent, message.getUserAgent()); } public void testProtocolVersionMessage() throws IOException, BrowserChannelException { int protoVersion = 42; new ProtocolVersionMessage(channel, protoVersion).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.PROTOCOL_VERSION, type); ProtocolVersionMessage message = ProtocolVersionMessage.receive(channel); assertEquals(protoVersion, message.getProtocolVersion()); } public void testQuitMessage() throws IOException, BrowserChannelException { new QuitMessage(channel).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.QUIT, type); QuitMessage.receive(channel); } public void testRequestIconMessage() throws IOException, BrowserChannelException { RequestIconMessage.send(channel); MessageType type = channel.readMessageType(); assertEquals(MessageType.REQUEST_ICON, type); RequestIconMessage message = RequestIconMessage.receive(channel); assertFalse(message.isAsynchronous()); } public void testReturnMessage() throws IOException, BrowserChannelException { Value val = new Value(); val.setInt(42); new ReturnMessage(channel, false, val).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.RETURN, type); ReturnMessage message = ReturnMessage.receive(channel); assertFalse(message.isException()); Value valRecv = message.getReturnValue(); assertEquals(ValueType.INT, valRecv.getType()); assertEquals(42, valRecv.getInt()); } public void testSwitchTransportMessage() throws IOException, BrowserChannelException { String transport = "shm"; String transportArgs = "17021"; new SwitchTransportMessage(channel, transport, transportArgs).send(); MessageType type = channel.readMessageType(); assertEquals(MessageType.SWITCH_TRANSPORT, type); SwitchTransportMessage message = SwitchTransportMessage.receive(channel); assertEquals(transport, message.getTransport()); assertEquals(transportArgs, message.getTransportArgs()); } public void testUserAgentIconMessage() throws IOException, BrowserChannelException { UserAgentIconMessage.send(channel, null); MessageType type = channel.readMessageType(); assertEquals(MessageType.USER_AGENT_ICON, type); UserAgentIconMessage message = UserAgentIconMessage.receive(channel); assertFalse(message.isAsynchronous()); assertNull(message.getIconBytes()); UserAgentIconMessage.send(channel, new byte[0]); type = channel.readMessageType(); assertEquals(MessageType.USER_AGENT_ICON, type); message = UserAgentIconMessage.receive(channel); assertFalse(message.isAsynchronous()); assertNull(message.getIconBytes()); byte[] bytes = new byte[] { 0, 1, 2, 3, 4 }; UserAgentIconMessage.send(channel, bytes); type = channel.readMessageType(); assertEquals(MessageType.USER_AGENT_ICON, type); message = UserAgentIconMessage.receive(channel); assertFalse(message.isAsynchronous()); byte[] receivedBytes = message.getIconBytes(); assertNotNull(receivedBytes); assertEquals(bytes.length, receivedBytes.length); for (int i = 0; i < bytes.length; ++i) { assertEquals(bytes[i], receivedBytes[i]); } } @Override protected void setUp() throws Exception { channel = new TestBrowserChannel(bufferStream.getInputStream(), bufferStream.getOutputStream()); } }