/*
* Copyright 2012 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.user.client.rpc.impl;
import com.google.gwt.user.client.rpc.SerializationException;
import junit.framework.TestCase;
/**
* Tests {@link ClientSerializationStreamReader}.
*/
public class ClientSerializationStreamReaderTest extends TestCase {
public void testRead() throws SerializationException {
ClientSerializationStreamReader reader = new ClientSerializationStreamReader(null);
reader.prepareToRead("["
+ "3.5," // a double
+ "1," // String table index: "one"
+ "3," // String table index: "three"
+ "2," // String table index: "two"
+ "[\"one\",\"two\",\"three\"],"
+ "0," // flags
+ AbstractSerializationStream.SERIALIZATION_STREAM_VERSION // version
+ "]");
assertEquals("two", reader.readString());
assertEquals("three", reader.readString());
assertEquals("one", reader.readString());
assertEquals(3.5, reader.readDouble());
}
public void testRead_stringConcats() throws SerializationException {
ClientSerializationStreamReader reader = new ClientSerializationStreamReader(null);
reader.prepareToRead("["
+ "1," // String table index: "onetwothree"
+ "[\"one\"+\"two\"+\"three\"],"
+ "0," // flags
+ AbstractSerializationStream.SERIALIZATION_STREAM_VERSION // version
+ "]");
assertEquals("onetwothree", reader.readString());
}
public void testRead_arrayConcats() throws SerializationException {
ClientSerializationStreamReader reader = new ClientSerializationStreamReader(null);
reader.prepareToRead("["
+ "1," // String table index: "one"
+ "2" // String table index: "two"
+ "].concat(["
+ "[\"one\"].concat([\"two\"]),"
+ "0," // flags
+ AbstractSerializationStream.SERIALIZATION_STREAM_VERSION // version
+ "])");
assertEquals("two", reader.readString());
assertEquals("one", reader.readString());
}
/*
* Note: this test verifies a issue with the Rhino parser that limits the size of a single string
* node to 64KB. If this test starts failing, then the Rhino parser may have been fixed to support
* larger strings and the string concat workaround could be removed.
*/
public void testRead_stringOver64KB() {
ClientSerializationStreamReader reader = new ClientSerializationStreamReader(null);
int stringLength = 0xFFFF;
StringBuilder builder = new StringBuilder(stringLength);
for (int i = 0; i < stringLength; i++) {
builder.append('y');
}
// Push the string size over 64KB.
builder.append('z');
try {
reader.prepareToRead("["
+ "1," // String table index
+ "[\"" + builder.toString() + "\"],"
+ "0," // flags
+ AbstractSerializationStream.SERIALIZATION_STREAM_VERSION // version
+ "]");
fail("Expected SerializationException");
} catch (SerializationException e) {
// Expected.
}
}
public void testRead_stringOver64KB_concat() throws SerializationException {
ClientSerializationStreamReader reader = new ClientSerializationStreamReader(null);
// First node is maximum allowed 64KB.
int node1Length = 0xFFFF;
StringBuilder node1Builder = new StringBuilder(node1Length);
for (int i = 0; i < node1Length; i++) {
node1Builder.append('y');
}
int node2Length = 0xFF;
StringBuilder node2Builder = new StringBuilder(0xFF);
for (int i = 0; i < node2Length; i++) {
node2Builder.append('z');
}
reader.prepareToRead("["
+ "1," // String table index
+ "[\"" + node1Builder.toString() + "\"+\"" + node2Builder.toString() + "\"],"
+ "0," // flags
+ AbstractSerializationStream.SERIALIZATION_STREAM_VERSION // version
+ "]");
assertEquals(node1Builder.toString() + node2Builder.toString(), reader.readString());
}
}