blob: f3ac42a03ce89932ed62d92f6c14f1187389359e [file] [log] [blame]
/*
* Copyright 2008 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.server.rpc;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.impl.TypeNameObfuscator;
import junit.framework.TestCase;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
/**
* Test the {@link SerializationPolicyLoader} class.
*/
public class SerializationPolicyLoaderTest extends TestCase {
// allowed by the policy
static class A {
}
// not allowed by the policy
static class B {
}
static class I {
}
private static final String OLD_VALID_POLICY_FILE_CONTENTS = A.class.getName()
+ ", true";
// missing the instantiable attribute
private static final String POLICY_FILE_MISSING_FIELD = A.class.getName();
private static final String POLICY_FILE_TRIGGERS_CLASSNOTFOUND = "C,false";
private static final String VALID_POLICY_FILE_CONTENTS = A.class.getName()
+ ", true, true, false, false, a, 1234\n" + B.class.getName()
+ ", false, false, true, false, b, 5678\n" + I.class.getName()
+ ", false, false, false, false, "
+ TypeNameObfuscator.SERVICE_INTERFACE_ID + ", 999\n";
public static InputStream getInputStreamFromString(String content)
throws UnsupportedEncodingException {
return new ByteArrayInputStream(
content.getBytes(SerializationPolicyLoader.SERIALIZATION_POLICY_FILE_ENCODING));
}
/**
* Test that a valid policy file will allow the types in the policy to be used
* and reject those that are not.
*
* @throws ClassNotFoundException
* @throws ParseException
*/
public void testLoading() throws IOException, SerializationException,
ParseException, ClassNotFoundException {
InputStream is = getInputStreamFromString(VALID_POLICY_FILE_CONTENTS);
List<ClassNotFoundException> notFounds = new ArrayList<ClassNotFoundException>();
SerializationPolicy sp = SerializationPolicyLoader.loadFromStream(is,
notFounds);
assertTrue(notFounds.isEmpty());
assertTrue(sp.shouldSerializeFields(A.class));
sp.validateSerialize(A.class);
assertFalse(sp.shouldDeserializeFields(A.class));
assertCannotDeserialize(sp, A.class);
assertFalse(sp.shouldSerializeFields(B.class));
assertCannotDeserialize(sp, B.class);
assertTrue(sp.shouldDeserializeFields(B.class));
assertCannotDeserialize(sp, B.class);
assertTrue(sp instanceof TypeNameObfuscator);
TypeNameObfuscator ob = (TypeNameObfuscator) sp;
assertEquals("a", ob.getTypeIdForClass(A.class));
assertEquals(A.class.getName(), ob.getClassNameForTypeId("a"));
assertEquals("b", ob.getTypeIdForClass(B.class));
assertEquals(B.class.getName(), ob.getClassNameForTypeId("b"));
assertEquals(TypeNameObfuscator.SERVICE_INTERFACE_ID,
ob.getTypeIdForClass(I.class));
assertEquals(I.class.getName(),
ob.getClassNameForTypeId(TypeNameObfuscator.SERVICE_INTERFACE_ID));
}
/**
* Test that a valid policy file will allow the types in the policy to be used
* and reject those that are not. Uses the old policy file format, which is no
* longer generated as of November 2008.
*
* @throws ClassNotFoundException
* @throws ParseException
*/
public void testLoadingOldFileFormat() throws IOException,
SerializationException, ParseException, ClassNotFoundException {
InputStream is = getInputStreamFromString(OLD_VALID_POLICY_FILE_CONTENTS);
SerializationPolicy sp = SerializationPolicyLoader.loadFromStream(is);
assertTrue(sp.shouldDeserializeFields(A.class));
assertTrue(sp.shouldSerializeFields(A.class));
assertFalse(sp.shouldDeserializeFields(B.class));
assertFalse(sp.shouldSerializeFields(B.class));
sp.validateDeserialize(A.class);
sp.validateSerialize(A.class);
assertCannotDeserialize(sp, B.class);
assertCannotSerialize(sp, B.class);
}
public void testPolicyFileMissingField() throws IOException,
ClassNotFoundException {
InputStream is = getInputStreamFromString(POLICY_FILE_MISSING_FIELD);
try {
SerializationPolicyLoader.loadFromStream(is);
fail("Expected ParseException");
} catch (ParseException e) {
// expected to get here
}
}
public void testPolicyFileTriggersClassNotFound() throws IOException,
ParseException {
InputStream is = getInputStreamFromString(POLICY_FILE_TRIGGERS_CLASSNOTFOUND);
try {
SerializationPolicyLoader.loadFromStream(is);
fail("Expected ClassNotFoundException");
} catch (ClassNotFoundException e) {
// expected to get here
}
// Test loading without collecting ClassNotFoundExceptions.
is.reset();
SerializationPolicyLoader.loadFromStream(is, null);
// Test loading and collecting ClassNotFoundExceptions.
List<ClassNotFoundException> classNotFoundExceptions = new ArrayList<ClassNotFoundException>();
is.reset();
SerializationPolicyLoader.loadFromStream(is, classNotFoundExceptions);
assertEquals(1, classNotFoundExceptions.size());
assertNotNull(classNotFoundExceptions.get(0));
}
private void assertCannotDeserialize(SerializationPolicy sp, Class<?> cls) {
try {
sp.validateDeserialize(cls);
fail("Expected SerializationException");
} catch (SerializationException ex) {
// should get here
}
}
private void assertCannotSerialize(SerializationPolicy sp, Class<?> cls) {
try {
sp.validateSerialize(cls);
fail("Expected SerializationException");
} catch (SerializationException ex) {
// should get here
}
}
}