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