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