- Moved the initialization of the ClassDeserializationValidator into the SerializationContext (so it is always initialized). - Adjusted the rest to correctly work with these changes.
Project: http://git-wip-us.apache.org/repos/asf/flex-blazeds/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-blazeds/commit/11b0aa13 Tree: http://git-wip-us.apache.org/repos/asf/flex-blazeds/tree/11b0aa13 Diff: http://git-wip-us.apache.org/repos/asf/flex-blazeds/diff/11b0aa13 Branch: refs/heads/master Commit: 11b0aa132d9a43bf81fa12654ff227ff247b4627 Parents: c4ffd05 Author: Christofer Dutz <christofer.d...@codecentric.de> Authored: Fri Feb 24 14:34:41 2017 +0100 Committer: Christofer Dutz <christofer.d...@codecentric.de> Committed: Fri Feb 24 14:34:41 2017 +0100 ---------------------------------------------------------------------- .../main/java/flex/messaging/MessageBroker.java | 3 + .../config/FlexConfigurationManager.java | 20 +- .../config/MessagingConfiguration.java | 8 - .../config/ServerConfigurationParser.java | 14 - .../flex/messaging/io/SerializationContext.java | 97 +-- .../ClassDeserializationValidator.java | 66 +- .../AmfDeserializationValidatorTest.java | 2 +- .../io/amfx/AmfxSerializationTest.java | 4 + .../messaging/services/RemotingService.java | 4 +- .../io/amf/client/AMFConnectionIT.java | 706 +++++++------------ .../messaging/io/amf/client/AMFDataTypeIT.java | 660 +++++++---------- .../flex/messaging/util/TestServerWrapper.java | 6 +- 12 files changed, 626 insertions(+), 964 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/main/java/flex/messaging/MessageBroker.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/flex/messaging/MessageBroker.java b/core/src/main/java/flex/messaging/MessageBroker.java index 3ffd2e4..23b308c 100644 --- a/core/src/main/java/flex/messaging/MessageBroker.java +++ b/core/src/main/java/flex/messaging/MessageBroker.java @@ -186,6 +186,9 @@ public class MessageBroker extends ManageableComponent factories = new HashMap<String, FlexFactory>(); registeredEndpoints = new HashMap<String, String>(); + // Initialize the default validator. + deserializationValidator = new ClassDeserializationValidator(); + // Add the built-in java factory addFactory("java", new JavaFactory()); http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java b/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java index 313cb87..480b122 100644 --- a/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java +++ b/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java @@ -44,11 +44,11 @@ import java.io.File; */ public class FlexConfigurationManager implements ConfigurationManager { - static final String DEFAULT_CONFIG_PATH = "/WEB-INF/flex/services-config.xml"; + private static final String DEFAULT_CONFIG_PATH = "/WEB-INF/flex/services-config.xml"; - protected String configurationPath = null; - protected ConfigurationFileResolver configurationResolver = null; - protected ConfigurationParser parser = null; + private String configurationPath = null; + private ConfigurationFileResolver configurationResolver = null; + private ConfigurationParser parser = null; public MessagingConfiguration getMessagingConfiguration(ServletConfig servletConfig) { @@ -88,10 +88,10 @@ public class FlexConfigurationManager implements ConfigurationManager parser.reportTokens(); } - protected ConfigurationParser getConfigurationParser(ServletConfig servletConfig) + private ConfigurationParser getConfigurationParser(ServletConfig servletConfig) { ConfigurationParser parser = null; - Class parserClass = null; + Class parserClass; String className = null; // Check for Custom Parser Specification @@ -175,7 +175,7 @@ public class FlexConfigurationManager implements ConfigurationManager * * @param servletConfig configuration */ - protected void setupConfigurationPathAndResolver(ServletConfig servletConfig) + private void setupConfigurationPathAndResolver(ServletConfig servletConfig) { if (servletConfig != null) { @@ -229,7 +229,7 @@ public class FlexConfigurationManager implements ConfigurationManager } - protected void verifyMinimumJavaVersion() throws ConfigurationException + private void verifyMinimumJavaVersion() throws ConfigurationException { try { @@ -262,7 +262,7 @@ public class FlexConfigurationManager implements ConfigurationManager } else if (third == 2) { - if ((vendor != null) && (vendor.indexOf("Sun") != -1)) + if ((vendor != null) && vendor.contains("Sun")) { // test at least 1.4.2_06 on Sun int fourth = Integer.parseInt(split[3]); @@ -284,7 +284,7 @@ public class FlexConfigurationManager implements ConfigurationManager { ConfigurationException cx = new ConfigurationException(); - if ((vendor != null) && (vendor.indexOf("Sun") != -1)) + if ((vendor != null) && vendor.contains("Sun")) { // The minimum required Java version was not found. Please install JDK 1.4.2_06 or above. Current version is XX. cx.setMessage(10139, new Object[] { System.getProperty("java.version")}); http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/main/java/flex/messaging/config/MessagingConfiguration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/flex/messaging/config/MessagingConfiguration.java b/core/src/main/java/flex/messaging/config/MessagingConfiguration.java index 70987a2..b73222b 100644 --- a/core/src/main/java/flex/messaging/config/MessagingConfiguration.java +++ b/core/src/main/java/flex/messaging/config/MessagingConfiguration.java @@ -591,14 +591,6 @@ public class MessagingConfiguration implements ServicesConfiguration // Only set the DeserializationValidator types for now. if (validator instanceof DeserializationValidator) { - // there can only be one deserialization validator, throw an error if there is more than one. - DeserializationValidator existingValidator = broker.getDeserializationValidator(); - if (existingValidator != null) - { - ConfigurationException cx = new ConfigurationException(); - cx.setMessage(11400, new Object[]{existingValidator.getClass().getCanonicalName(), className}); - throw cx; - } DeserializationValidator deserializationValidator = (DeserializationValidator)validator; deserializationValidator.initialize(null, settings.getProperties()); broker.setDeserializationValidator(deserializationValidator); http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/main/java/flex/messaging/config/ServerConfigurationParser.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/flex/messaging/config/ServerConfigurationParser.java b/core/src/main/java/flex/messaging/config/ServerConfigurationParser.java index e8eb1a9..c9134b5 100644 --- a/core/src/main/java/flex/messaging/config/ServerConfigurationParser.java +++ b/core/src/main/java/flex/messaging/config/ServerConfigurationParser.java @@ -1867,8 +1867,6 @@ public abstract class ServerConfigurationParser extends AbstractConfigurationPar { Node validatorsNode = selectSingleNode(root, VALIDATORS_ELEMENT); if (validatorsNode == null) { - // Default to the ClassDeserializationValidator - defaultValidator(); return; } @@ -1882,21 +1880,9 @@ public abstract class ServerConfigurationParser extends AbstractConfigurationPar Node validator = validators.item(i); validator(validator); } - } else { - // Default to the ClassDeserializationValidator - defaultValidator(); } } - /** - * Initialize a efault validator that protects BlazeDS against the most obvious attacks. - */ - private void defaultValidator() { - ValidatorSettings validatorSettings = new ValidatorSettings(); - validatorSettings.setClassName(ClassDeserializationValidator.class.getName()); - ((MessagingConfiguration)config).addValidatorSettings(validatorSettings); - } - private void validator(Node validator) { // Validation http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/main/java/flex/messaging/io/SerializationContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/flex/messaging/io/SerializationContext.java b/core/src/main/java/flex/messaging/io/SerializationContext.java index 64196cc..90b421d 100644 --- a/core/src/main/java/flex/messaging/io/SerializationContext.java +++ b/core/src/main/java/flex/messaging/io/SerializationContext.java @@ -26,8 +26,7 @@ import java.io.Serializable; * A simple context to get settings from an endpoint to a deserializer * or serializer. */ -public class SerializationContext implements Serializable, Cloneable -{ +public class SerializationContext implements Serializable, Cloneable { static final long serialVersionUID = -3020985035377116475L; // Endpoint serialization configuration flags @@ -54,7 +53,7 @@ public class SerializationContext implements Serializable, Cloneable * Provides a way to control whether small messages should be sent even * if the client can support them. If set to false, small messages * will not be sent. - * + * <p> * The default is true. */ public boolean enableSmallMessages = true; @@ -63,10 +62,10 @@ public class SerializationContext implements Serializable, Cloneable * Determines whether type information will be used to instantiate a new instance. * If set to false, types will be deserialized as flex.messaging.io.ASObject instances * with type information retained but not used to create an instance. - * + * <p> * Note that types in the flex.* package (and any subpackage) will always be * instantiated. - * + * <p> * The default is true. */ public boolean instantiateTypes = true; @@ -76,7 +75,7 @@ public class SerializationContext implements Serializable, Cloneable // How deep level of nest object in the object graph that we support public int maxObjectNestLevel = 512; - + // How deep level of nest collection objects in the object graph that we support // Similarly like how many dimensional matrix that we support for serialization. public int maxCollectionNestLevel = 15; @@ -99,8 +98,9 @@ public class SerializationContext implements Serializable, Cloneable /** * The default constructor. */ - public SerializationContext() - { + public SerializationContext() { + // Initialize the default validator. + deserializationValidator = new ClassDeserializationValidator(); } /** @@ -108,8 +108,7 @@ public class SerializationContext implements Serializable, Cloneable * * @return The deserializer class. */ - public Class getDeserializerClass() - { + public Class getDeserializerClass() { return deserializer; } @@ -118,8 +117,7 @@ public class SerializationContext implements Serializable, Cloneable * * @param c The deserializer class. */ - public void setDeserializerClass(Class c) - { + public void setDeserializerClass(Class c) { deserializer = c; } @@ -128,8 +126,7 @@ public class SerializationContext implements Serializable, Cloneable * * @return The serializer class. */ - public Class getSerializerClass() - { + public Class getSerializerClass() { return serializer; } @@ -138,8 +135,7 @@ public class SerializationContext implements Serializable, Cloneable * * @param c The serializer class. */ - public void setSerializerClass(Class c) - { + public void setSerializerClass(Class c) { serializer = c; } @@ -148,16 +144,13 @@ public class SerializationContext implements Serializable, Cloneable * * @return A new message deserializer instance. */ - public MessageDeserializer newMessageDeserializer() - { + public MessageDeserializer newMessageDeserializer() { Class deserializerClass = getDeserializerClass(); - if (deserializerClass == null) - { + if (deserializerClass == null) { deserializerClass = ClassUtil.createClass("flex.messaging.io.amf.AmfMessageDeserializer"); this.setDeserializerClass(deserializerClass); } - MessageDeserializer deserializer = (MessageDeserializer)ClassUtil.createDefaultInstance(deserializerClass, MessageDeserializer.class); - return deserializer; + return (MessageDeserializer) ClassUtil.createDefaultInstance(deserializerClass, MessageDeserializer.class); } /** @@ -165,16 +158,13 @@ public class SerializationContext implements Serializable, Cloneable * * @return A new message serializer instance. */ - public MessageSerializer newMessageSerializer() - { + public MessageSerializer newMessageSerializer() { Class serializerClass = getSerializerClass(); - if (serializerClass == null) - { + if (serializerClass == null) { serializerClass = ClassUtil.createClass("flex.messaging.io.amf.AmfMessageSerializer"); this.setSerializerClass(serializerClass); } - MessageSerializer serializer = (MessageSerializer)ClassUtil.createDefaultInstance(serializerClass, MessageSerializer.class); - return serializer; + return (MessageSerializer) ClassUtil.createDefaultInstance(serializerClass, MessageSerializer.class); } /** @@ -182,8 +172,7 @@ public class SerializationContext implements Serializable, Cloneable * * @return The deserialization validator. */ - public DeserializationValidator getDeserializationValidator() - { + public DeserializationValidator getDeserializationValidator() { return deserializationValidator; } @@ -192,20 +181,15 @@ public class SerializationContext implements Serializable, Cloneable * * @param deserializationValidator The deserialization validator. */ - public void setDeserializationValidator(DeserializationValidator deserializationValidator) - { + public void setDeserializationValidator(DeserializationValidator deserializationValidator) { this.deserializationValidator = deserializationValidator; } @Override - public Object clone() - { - try - { + public Object clone() { + try { return super.clone(); - } - catch (CloneNotSupportedException e) - { + } catch (CloneNotSupportedException e) { // this should never happen since this class extends object // but just in case revert to manual clone SerializationContext context = new SerializationContext(); @@ -244,57 +228,52 @@ public class SerializationContext implements Serializable, Cloneable /** * Establishes a SerializationContext for the current thread. * Users are not expected to call this function. + * * @param context The current SerializationContext. */ - public static void setSerializationContext(SerializationContext context) - { - if (context == null) + public static void setSerializationContext(SerializationContext context) { + if (context == null) { contexts.remove(); - else + } else { contexts.set(context); + } } /** * @return The current thread's SerializationContext. */ - public static SerializationContext getSerializationContext() - { + public static SerializationContext getSerializationContext() { SerializationContext sc = contexts.get(); - if (sc == null) - { + if (sc == null) { sc = new SerializationContext(); SerializationContext.setSerializationContext(sc); } return sc; } + /** * Clears out the thread local state after the request completes. */ - public static void clearThreadLocalObjects() - { - if (contexts != null) - { + public static void clearThreadLocalObjects() { + if (contexts != null) { contexts.remove(); } } /** - * * Create thread local storage. */ - public static void createThreadLocalObjects() - { - if (contexts == null) - contexts = new ThreadLocal(); + public static void createThreadLocalObjects() { + if (contexts == null) { + contexts = new ThreadLocal<SerializationContext>(); + } } /** - * * Destroy thread local storage. * Call ONLY on shutdown. */ - public static void releaseThreadLocalObjects() - { + public static void releaseThreadLocalObjects() { clearThreadLocalObjects(); contexts = null; http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/main/java/flex/messaging/validators/ClassDeserializationValidator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/flex/messaging/validators/ClassDeserializationValidator.java b/core/src/main/java/flex/messaging/validators/ClassDeserializationValidator.java index ed2ac80..4bc0857 100644 --- a/core/src/main/java/flex/messaging/validators/ClassDeserializationValidator.java +++ b/core/src/main/java/flex/messaging/validators/ClassDeserializationValidator.java @@ -40,19 +40,21 @@ public class ClassDeserializationValidator implements DeserializationValidator { public static final String PROPERTY_NAME_ATTR = "name"; private static final String[] DEFAULT_ALLOW_CLASSES = { + "flex.messaging.io.amf.ASObject", "flex.messaging.io.amf.SerializedObject", "flex.messaging.io.ArrayCollection", - "flex.messaging.io.ObjectProxy", - "flex.messaging.io.SerializationProxy", + "flex.messaging.io.ArrayList", + "flex.messaging.messages.AcknowledgeMessage", "flex.messaging.messages.AcknowledgeMessageExt", + "flex.messaging.messages.AsyncMessage", "flex.messaging.messages.AsyncMessageExt", + "flex.messaging.messages.CommandMessage", "flex.messaging.messages.CommandMessageExt", - "flex.data.messages.DataMessageExt", - "flex.data.messages.ManagedRemotingMessageExt", - "flex.data.messages.PagedMessageExt", - "flex.data.messages.SequencedMessageExt", - "flex.data.messages.UpdateCollectionMessageExt", - "flex.data.ChangedItems", + "flex.messaging.messages.ErrorMessage", + "flex.messaging.messages.HTTPMessage", + "flex.messaging.messages.RemotingMessage", + "flex.messaging.messages.SOAPMessage", + "java.io.Externalizable", "java.lang.Boolean", "java.lang.Byte", "java.lang.Character", @@ -63,8 +65,9 @@ public class ClassDeserializationValidator implements DeserializationValidator { "java.lang.Object", "java.lang.Short", "java.lang.String", - "java.io.Externalizable", + "java.util.ArrayList", "java.util.Date", + "java.util.HashMap", "org.w3c.dom.Document", "\\[B", "\\[Ljava.lang.Object;" @@ -94,6 +97,10 @@ public class ClassDeserializationValidator implements DeserializationValidator { private Map<String, Pattern> disallowClassPatterns; public ClassDeserializationValidator() { + // Apply default allow classes + for (String defaultAllowClassPattern : DEFAULT_ALLOW_CLASSES) { + addAllowClassPattern(defaultAllowClassPattern); + } } @@ -110,8 +117,9 @@ public class ClassDeserializationValidator implements DeserializationValidator { */ public void addAllowClassPattern(String classNamePattern) { synchronized (lock) { - if (allowClassPatterns == null) + if (allowClassPatterns == null) { allowClassPatterns = new HashMap<String, Pattern>(); + } allowClassPatterns.put(classNamePattern, Pattern.compile(classNamePattern)); @@ -126,8 +134,9 @@ public class ClassDeserializationValidator implements DeserializationValidator { */ public void removeAllowClassPattern(String classNamePattern) { synchronized (lock) { - if (allowClassPatterns != null) + if (allowClassPatterns != null) { allowClassPatterns.remove(classNamePattern); + } clearClassCache(); } @@ -140,8 +149,9 @@ public class ClassDeserializationValidator implements DeserializationValidator { */ public void addDisallowClassPattern(String classNamePattern) { synchronized (lock) { - if (disallowClassPatterns == null) + if (disallowClassPatterns == null) { disallowClassPatterns = new HashMap<String, Pattern>(); + } disallowClassPatterns.put(classNamePattern, Pattern.compile(classNamePattern)); @@ -156,8 +166,9 @@ public class ClassDeserializationValidator implements DeserializationValidator { */ public void removeDisallowClassPattern(String classNamePattern) { synchronized (lock) { - if (disallowClassPatterns != null) + if (disallowClassPatterns != null) { disallowClassPatterns.remove(classNamePattern); + } clearClassCache(); } @@ -201,16 +212,19 @@ public class ClassDeserializationValidator implements DeserializationValidator { */ public boolean validateCreation(Class<?> c) { String className = c == null ? null : c.getName(); - if (className == null) + if (className == null) { return true; + } // First, check against the encountered disallow-classes list. - if (disallowClasses != null && disallowClasses.contains(className)) + if (disallowClasses != null && disallowClasses.contains(className)) { return false; + } // Then, check against the encountered allow-classes list. - if (allowClasses != null && allowClasses.contains(className)) + if (allowClasses != null && allowClasses.contains(className)) { return true; + } // Otherwise, the class was encountered for the first time, need to // go through the disallow and allow class patterns list. @@ -247,13 +261,9 @@ public class ClassDeserializationValidator implements DeserializationValidator { * {@inheritDoc} */ public void initialize(String id, ConfigMap properties) { - // Apply default allow classes - for (String defaultAllowClassPattern : DEFAULT_ALLOW_CLASSES) { - addAllowClassPattern(defaultAllowClassPattern); - } - - if (properties == null || properties.size() == 0) + if (properties == null || properties.size() == 0) { return; + } // Process allow-classes. ConfigMap allowedClassesMap = properties.getPropertyAsMap(PROPERTY_ALLOW_CLASSES, null); @@ -288,21 +298,25 @@ public class ClassDeserializationValidator implements DeserializationValidator { protected void addAllowClass(String className) { synchronized (lock) { - if (allowClasses == null) + if (allowClasses == null) { allowClasses = new HashSet<String>(); + } - if (!allowClasses.contains(className)) + if (!allowClasses.contains(className)) { allowClasses.add(className); + } } } protected void addDisallowClass(String className) { synchronized (lock) { - if (disallowClasses == null) + if (disallowClasses == null) { disallowClasses = new HashSet<String>(); + } - if (!disallowClasses.contains(className)) + if (!disallowClasses.contains(className)) { disallowClasses.add(className); + } } } http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/test/java/flex/messaging/io/amf/validators/AmfDeserializationValidatorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/flex/messaging/io/amf/validators/AmfDeserializationValidatorTest.java b/core/src/test/java/flex/messaging/io/amf/validators/AmfDeserializationValidatorTest.java index 4fad1b0..f1114e4 100644 --- a/core/src/test/java/flex/messaging/io/amf/validators/AmfDeserializationValidatorTest.java +++ b/core/src/test/java/flex/messaging/io/amf/validators/AmfDeserializationValidatorTest.java @@ -95,7 +95,7 @@ public class AmfDeserializationValidatorTest extends TestCase URL resource = ClassLoader.getSystemResource(sample); URI uri = new URI(resource.toString()); File testData = new File(uri.getPath()); - String testDataLocation = testData.getCanonicalPath(); + String testDataLocation = testData.getCanonicalPath(); // Generate sample AMF request from the data file. PipedOutputStream pout = new PipedOutputStream(); http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/core/src/test/java/flex/messaging/io/amfx/AmfxSerializationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/flex/messaging/io/amfx/AmfxSerializationTest.java b/core/src/test/java/flex/messaging/io/amfx/AmfxSerializationTest.java index 1e6965a..eb3b32b 100644 --- a/core/src/test/java/flex/messaging/io/amfx/AmfxSerializationTest.java +++ b/core/src/test/java/flex/messaging/io/amfx/AmfxSerializationTest.java @@ -16,6 +16,7 @@ */ package flex.messaging.io.amfx; +import flex.messaging.validators.ClassDeserializationValidator; import junit.framework.TestCase; import junit.framework.Test; import junit.framework.TestSuite; @@ -69,7 +70,10 @@ public class AmfxSerializationTest extends TestCase protected void setUp() throws Exception { super.setUp(); + ClassDeserializationValidator classDeserializationValidator = new ClassDeserializationValidator(); + classDeserializationValidator.addAllowClassPattern("flex.messaging.io.amfx.testtypes.*"); serializationContext = new SerializationContext(); + serializationContext.setDeserializationValidator(classDeserializationValidator); SerializationContext.setSerializationContext(serializationContext); //trace = new AmfTrace(); } http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/remoting/src/main/java/flex/messaging/services/RemotingService.java ---------------------------------------------------------------------- diff --git a/remoting/src/main/java/flex/messaging/services/RemotingService.java b/remoting/src/main/java/flex/messaging/services/RemotingService.java index c018ace..b817c45 100755 --- a/remoting/src/main/java/flex/messaging/services/RemotingService.java +++ b/remoting/src/main/java/flex/messaging/services/RemotingService.java @@ -164,10 +164,12 @@ public class RemotingService extends AbstractService { RemotingMessage message = (RemotingMessage)msg; RemotingDestination destination = (RemotingDestination)getDestination(msg); - RemotingDestinationControl destinationControl = (destination.isManaged()) ? (RemotingDestinationControl)destination.getControl() : null; if (destination != null) { + RemotingDestinationControl destinationControl = (destination.isManaged()) ? + (RemotingDestinationControl) destination.getControl() : null; + ServiceAdapter adapter = destination.getAdapter(); long startTime = 0; if (destinationControl != null) http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/11b0aa13/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java ---------------------------------------------------------------------- diff --git a/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java b/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java index b2d3bef..230005c 100644 --- a/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java +++ b/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java @@ -17,35 +17,33 @@ package flex.messaging.io.amf.client; -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.Proxy; - -import flex.messaging.util.TestServerWrapper; -import junit.extensions.TestSetup; -import org.junit.Assert; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import remoting.amfclient.ClientCustomType; - import flex.messaging.MessageException; -import flex.messaging.messages.RemotingMessage; +import flex.messaging.io.MessageIOConstants; +import flex.messaging.io.SerializationContext; import flex.messaging.io.amf.ASObject; import flex.messaging.io.amf.AmfTrace; import flex.messaging.io.amf.client.AMFConnection.HttpResponseInfo; import flex.messaging.io.amf.client.exceptions.ClientStatusException; import flex.messaging.io.amf.client.exceptions.ServerStatusException; -import flex.messaging.io.MessageIOConstants; +import flex.messaging.messages.RemotingMessage; +import flex.messaging.util.TestServerWrapper; +import flex.messaging.validators.ClassDeserializationValidator; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import remoting.amfclient.ClientCustomType; + +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.Proxy; /** * JUnit tests for AMFConnection. Note that most of the tests require a running * server with the specified destination. */ -public class AMFConnectionIT extends TestCase -{ +public class AMFConnectionIT { private static final String DEFAULT_DESTINATION_ID = "amfConnectionTestService"; private static final String DEFAULT_METHOD_NAME = "echoString"; private static final String DEFAULT_METHOD_ARG = "echo me"; @@ -57,102 +55,51 @@ public class AMFConnectionIT extends TestCase private static TestServerWrapper serverWrapper; private static int serverPort; + private static SerializationContext serializationContext; - /** - * Given a remote method name, returns the AMF connection call needed using - * the default destination id. - */ - private static String getOperationCall(String method) - { - return DEFAULT_DESTINATION_ID + "." + method; - } + @BeforeClass + public static void setup() { + serverWrapper = new TestServerWrapper(); + serverPort = serverWrapper.startServer("classpath:/WEB-INF/flex/services-config.xml"); + if (serverPort == -1) { + Assert.fail("Couldn't start server process"); + } - protected String getConnectionUrl() { - return String.format(DEFAULT_URL, serverPort); - } + AMFConnection.registerAlias( + "remoting.amfclient.ServerCustomType" /* server type */, + "remoting.amfclient.ClientCustomType" /* client type */); + serializationContext = SerializationContext.getSerializationContext(); + ClassDeserializationValidator deserializationValidator = + (ClassDeserializationValidator) serializationContext.getDeserializationValidator(); + deserializationValidator.addAllowClassPattern("remoting.amfclient.*"); + } - public AMFConnectionIT(String name) - { - super(name); - } - - public static Test suite() - { - //TestSuite suite = new TestSuite(AMFConnectionIT.class); - TestSuite suite = new TestSuite(); - suite.addTest(new AMFConnectionIT("testConnect")); - suite.addTest(new AMFConnectionIT("testConnectAndClose")); - suite.addTest(new AMFConnectionIT("testConnectBadUrl")); - suite.addTest(new AMFConnectionIT("testCallMultipleTimes")); - suite.addTest(new AMFConnectionIT("testCallNoConnect")); - suite.addTest(new AMFConnectionIT("testCallNoConnectStringMsg")); - suite.addTest(new AMFConnectionIT("testCallUnreachableConnectUrl")); - suite.addTest(new AMFConnectionIT("testCallNonexistantMethod")); - suite.addTest(new AMFConnectionIT("testHttpResponseInfoWithNonexistantMethod")); - suite.addTest(new AMFConnectionIT("testCloseNoConnect")); - suite.addTest(new AMFConnectionIT("testSetGetObjectEncoding")); - suite.addTest(new AMFConnectionIT("testSetGetDefaultObjectEncoding")); - suite.addTest(new AMFConnectionIT("testSetGetAMFHeaderProcessor")); - suite.addTest(new AMFConnectionIT("testAddRemoveAMFHeaderTwoParam")); - suite.addTest(new AMFConnectionIT("testAddRemoveAMFHeader")); - suite.addTest(new AMFConnectionIT("testAddRemoveAllAMFHeaders")); - suite.addTest(new AMFConnectionIT("testAddRemoveHTTPRequestHeader")); - suite.addTest(new AMFConnectionIT("testAddRemoveAllHTTPRequestHeaders")); - suite.addTest(new AMFConnectionIT("testRemoveAMFHeader")); - suite.addTest(new AMFConnectionIT("testRemoveAllAMFHeaders")); - suite.addTest(new AMFConnectionIT("testRemoveHTTPRequestHeader")); - suite.addTest(new AMFConnectionIT("testRemoveAllHTTPRequestHeaders")); - suite.addTest(new AMFConnectionIT("testInstantiateTypes")); - suite.addTest(new AMFConnectionIT("testSetGetAMFTrace")); - suite.addTest(new AMFConnectionIT("testHTTPProxy")); - - return new TestSetup(suite) { - protected void setUp() throws Exception { - serverWrapper = new TestServerWrapper(); - serverPort = serverWrapper.startServer("classpath:/WEB-INF/flex/services-config.xml"); - if(serverPort == -1) { - Assert.fail("Couldn't start server process"); - } - AMFConnection.registerAlias( - "remoting.amfclient.ServerCustomType" /* server type */, - "remoting.amfclient.ClientCustomType" /* client type */); - } - protected void tearDown() throws Exception { - serverWrapper.stopServer(); - serverWrapper = null; - } - }; + @AfterClass + public static void teardown() { + serverWrapper.stopServer(); + serverWrapper = null; } // Not a test, just an example to show how to use AMFConnection. - public void example() - { + public void example() { // Create the AMF connection. AMFConnection amfConnection = new AMFConnection(); // Connect to the remote url. - try - { - amfConnection.connect(getConnectionUrl()); - } - catch (ClientStatusException cse) - { + try { + amfConnection.connect(getConnectionUrl(), serializationContext); + } catch (ClientStatusException cse) { return; } // Make a remoting call and retrieve the result. - try - { + try { Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG); Assert.assertEquals(DEFAULT_METHOD_ARG, result); - } - catch (ClientStatusException cse) - { + } catch (ClientStatusException cse) { // Ignore. - } - catch (ServerStatusException sse) - { + } catch (ServerStatusException sse) { // Ignore. } @@ -160,282 +107,209 @@ public class AMFConnectionIT extends TestCase amfConnection.close(); } - public void testConnect() - { + @Test + public void testConnect() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testConnectAndClose() - { + @Test + public void testConnectAndClose() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); Assert.assertEquals(null, amfConnection.getUrl()); } } - public void testConnectBadUrl() - { + @Test + public void testConnectBadUrl() { String badUrl = "badUrl"; AMFConnection amfConnection = new AMFConnection(); - try - { + try { amfConnection.connect(badUrl); - fail("ClientStatusException expected"); - } - catch (ClientStatusException cse) - { + Assert.fail("ClientStatusException expected"); + } catch (ClientStatusException cse) { Assert.assertEquals(ClientStatusException.AMF_CONNECT_FAILED_CODE, cse.getCode()); - } - finally - { + } finally { amfConnection.close(); } } - public void testCallMultipleTimes() - { + @Test + public void testCallMultipleTimes() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); } // Make a remoting call and retrieve the result. - try - { - for (int i = 1; i < 4; i++) - { + try { + for (int i = 1; i < 4; i++) { String stringToEcho = DEFAULT_METHOD_ARG + i; Object result = amfConnection.call(DEFAULT_AMF_OPERATION, stringToEcho); Assert.assertEquals(stringToEcho, result); } - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); - } - finally - { + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); + } finally { amfConnection.close(); } } - public void testCallNoConnect() - { + @Test + public void testCallNoConnect() { AMFConnection amfConnection = new AMFConnection(); // Make a remoting call without connect. - try - { + try { Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG); Assert.assertEquals(DEFAULT_METHOD_ARG, result); - } - catch (ClientStatusException cse) - { + } catch (ClientStatusException cse) { Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); - } - finally - { + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); + } finally { amfConnection.close(); } } - public void testCallNoConnectStringMsg() - { + @Test + public void testCallNoConnectStringMsg() { AMFConnection amfConnection = new AMFConnection(); // Make a remoting call without connect. - try - { + try { Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG); Assert.assertEquals(DEFAULT_METHOD_ARG, result); - } - catch (ClientStatusException cse) - { + } catch (ClientStatusException cse) { Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); - } - finally - { + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); + } finally { amfConnection.close(); } } - public void testCallUnreachableConnectUrl() - { + @Test + public void testCallUnreachableConnectUrl() { String unreachableUrl = "http://localhost:8400/team/messagebroker/unreachable"; AMFConnection amfConnection = new AMFConnection(); - try - { + try { // Connect does not actually connect but simply sets the url. amfConnection.connect(unreachableUrl); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); } // Make a remoting call and retrieve the result. - try - { + try { Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG); Assert.assertEquals(DEFAULT_METHOD_ARG, result); - } - catch (ClientStatusException cse) - { + } catch (ClientStatusException cse) { Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); - } - finally - { + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); + } finally { amfConnection.close(); } } - public void testCallNonexistantMethod() - { + @Test + public void testCallNonexistantMethod() { String method = "nonExistantMethod"; - try - { - internalTestCall(getOperationCall(method), "Wombat", new CallResultHandler(){ - public void onResult(Object result) - { - fail("Unexcepted result: " + result); + try { + internalTestCall(getOperationCall(method), "Wombat", new CallResultHandler() { + public void onResult(Object result) { + Assert.fail("Unexcepted result: " + result); } }); - } - catch (ServerStatusException sse) - { - ASObject status = (ASObject)sse.getData(); - String code = (String)status.get("code"); + } catch (ServerStatusException sse) { + ASObject status = (ASObject) sse.getData(); + String code = (String) status.get("code"); Assert.assertEquals(MessageException.CODE_SERVER_RESOURCE_UNAVAILABLE, code); HttpResponseInfo info = sse.getHttpResponseInfo(); // AMF status messages are reported as HTTP_OK still. Assert.assertEquals(HttpURLConnection.HTTP_OK, info.getResponseCode()); Assert.assertEquals("OK", info.getResponseMessage()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); } } - public void testHttpResponseInfoWithNonexistantMethod() - { + @Test + public void testHttpResponseInfoWithNonexistantMethod() { String method = "nonExistantMethod"; final ClientCustomType methodArg = new ClientCustomType(); methodArg.setId(1); - try - { - internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){ - public void onResult(Object result) - { - fail("Unexcepted result: " + result); + try { + internalTestCall(getOperationCall(method), methodArg, new CallResultHandler() { + public void onResult(Object result) { + Assert.fail("Unexcepted result: " + result); } }); - } - catch (ServerStatusException sse) - { + } catch (ServerStatusException sse) { HttpResponseInfo info = sse.getHttpResponseInfo(); // AMF status messages are reported as HTTP_OK still. Assert.assertEquals(HttpURLConnection.HTTP_OK, info.getResponseCode()); Assert.assertEquals("OK", info.getResponseMessage()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); } } - public void testCloseNoConnect() - { + @Test + public void testCloseNoConnect() { AMFConnection amfConnection = new AMFConnection(); // Closing with no connection or call. - try - { + try { amfConnection.close(); Assert.assertEquals(null, amfConnection.getUrl()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); } } - public void testSetGetObjectEncoding() - { + @Test + public void testSetGetObjectEncoding() { int retAMF; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); amfConnection.setObjectEncoding(MessageIOConstants.AMF0); retAMF = amfConnection.getObjectEncoding(); Assert.assertEquals(MessageIOConstants.AMF0, retAMF); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testSetGetDefaultObjectEncoding() - { + @Test + public void testSetGetDefaultObjectEncoding() { int retAMF; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); AMFConnection.setDefaultObjectEncoding(MessageIOConstants.AMF3); retAMF = AMFConnection.getDefaultObjectEncoding(); Assert.assertEquals(MessageIOConstants.AMF3, retAMF); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } @@ -444,233 +318,179 @@ public class AMFConnectionIT extends TestCase * There doesn't seem to be a single implementation of AMFHeaderProcessor therefore this test * is pretty useless. */ - public void testSetGetAMFHeaderProcessor() - { - AMFHeaderProcessor setAMF = null; - AMFHeaderProcessor retAMF; + @Test + public void testSetGetAMFHeaderProcessor() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - amfConnection.setAMFHeaderProcessor(setAMF); - retAMF = amfConnection.getAMFHeaderProcessor(); - Assert.assertEquals(setAMF, retAMF); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + amfConnection.setAMFHeaderProcessor(null); + AMFHeaderProcessor retAMF = amfConnection.getAMFHeaderProcessor(); + Assert.assertNull(retAMF); + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testAddRemoveAMFHeaderTwoParam() - { + @Test + public void testAddRemoveAMFHeaderTwoParam() { boolean retAMF; Object val = 1; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - amfConnection.addAmfHeader(FOO_STRING,val); + amfConnection.addAmfHeader(FOO_STRING, val); retAMF = amfConnection.removeAmfHeader(FOO_STRING); Assert.assertTrue(retAMF); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testAddRemoveAMFHeader() - { + @Test + public void testAddRemoveAMFHeader() { boolean retAMF; Object val = 1; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - amfConnection.addAmfHeader(FOO_STRING,true,val); + amfConnection.addAmfHeader(FOO_STRING, true, val); retAMF = amfConnection.removeAmfHeader(FOO_STRING); Assert.assertTrue(retAMF); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testAddRemoveAllAMFHeaders() - { + @Test + public void testAddRemoveAllAMFHeaders() { Object val1 = 1; Object val2 = 2; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - amfConnection.addAmfHeader(FOO_STRING,true,val1); - amfConnection.addAmfHeader(BAR_STRING,true,val2); + amfConnection.addAmfHeader(FOO_STRING, true, val1); + amfConnection.addAmfHeader(BAR_STRING, true, val2); amfConnection.removeAllAmfHeaders(); Assert.assertTrue(true); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testAddRemoveHTTPRequestHeader() - { + @Test + public void testAddRemoveHTTPRequestHeader() { boolean retHttp; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - amfConnection.addHttpRequestHeader(FOO_STRING,BAR_STRING); + amfConnection.addHttpRequestHeader(FOO_STRING, BAR_STRING); retHttp = amfConnection.removeHttpRequestHeader(FOO_STRING); Assert.assertTrue(retHttp); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testAddRemoveAllHTTPRequestHeaders() - { + @Test + public void testAddRemoveAllHTTPRequestHeaders() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); - amfConnection.addHttpRequestHeader(FOO_STRING,BAR_STRING); - amfConnection.addHttpRequestHeader(BAR_STRING,FOO_STRING); + amfConnection.addHttpRequestHeader(FOO_STRING, BAR_STRING); + amfConnection.addHttpRequestHeader(BAR_STRING, FOO_STRING); amfConnection.removeAllHttpRequestHeaders(); Assert.assertTrue(true); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testRemoveAMFHeader() - { + @Test + public void testRemoveAMFHeader() { boolean retAMF; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); retAMF = amfConnection.removeAmfHeader(FOO_STRING); Assert.assertFalse(retAMF); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testRemoveAllAMFHeaders() - { + @Test + public void testRemoveAllAMFHeaders() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); amfConnection.removeAllAmfHeaders(); Assert.assertTrue(true); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testRemoveHTTPRequestHeader() - { + @Test + public void testRemoveHTTPRequestHeader() { boolean retHttp; AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); retHttp = amfConnection.removeHttpRequestHeader(FOO_STRING); Assert.assertFalse(retHttp); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - public void testRemoveAllHTTPRequestHeaders() - { + @Test + public void testRemoveAllHTTPRequestHeaders() { AMFConnection amfConnection = new AMFConnection(); - try - { - amfConnection.connect(getConnectionUrl()); + try { + amfConnection.connect(getConnectionUrl(), serializationContext); Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl()); amfConnection.removeAllHttpRequestHeaders(); Assert.assertTrue(true); - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } finally { amfConnection.close(); } } - - public void testInstantiateTypes() - { + @Test + public void testInstantiateTypes() { String method = "getObject2"; - try - { + try { AMFConnection amfConnection = new AMFConnection(); - amfConnection.connect(getConnectionUrl()); + amfConnection.connect(getConnectionUrl(), serializationContext); // First, make sure we get the strong type. Object result = amfConnection.call(getOperationCall(method)); @@ -681,20 +501,17 @@ public class AMFConnectionIT extends TestCase result = amfConnection.call(getOperationCall(method)); Assert.assertTrue(!(result instanceof ClientCustomType)); amfConnection.close(); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); } } - public void testSetGetAMFTrace() - { + @Test + public void testSetGetAMFTrace() { AMFConnection amfConnection = new AMFConnection(); - try - { + try { AmfTrace trace = new AmfTrace(); - amfConnection.connect(getConnectionUrl()); + amfConnection.connect(getConnectionUrl(), serializationContext); amfConnection.setAmfTrace(trace); String stringToEcho = DEFAULT_METHOD_ARG + 1; @@ -702,30 +519,22 @@ public class AMFConnectionIT extends TestCase Assert.assertEquals(stringToEcho, result); if (trace.toString().length() > 0) Assert.assertTrue(true); - else fail("AmfTrace did not get anything: " + trace.toString() + " " + trace.toString().length()); + else Assert.fail("AmfTrace did not get anything: " + trace.toString() + " " + trace.toString().length()); amfConnection.close(); - - } - catch (ClientStatusException cse) - { - fail(UNEXPECTED_EXCEPTION_STRING + cse); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); - } - finally - { + } catch (ClientStatusException cse) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + cse); + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); + } finally { amfConnection.close(); } } - public void testHTTPProxy() - { + @Test + public void testHTTPProxy() { AMFConnection amfconn = new AMFConnection(); - try - { + try { amfconn.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8888))); amfconn.connect("http://localhost:8400/team/messagebroker/amf"); RemotingMessage call = new RemotingMessage(); @@ -736,41 +545,50 @@ public class AMFConnectionIT extends TestCase call.setOperation("echo"); call.setBody("hello"); amfconn.call("foo", call); - fail("ClientStatusException expected"); - } - catch (ClientStatusException cse) - { + Assert.fail("ClientStatusException expected"); + } catch (ClientStatusException cse) { Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode()); - } - catch (Exception e) - { - fail(UNEXPECTED_EXCEPTION_STRING + e); - } - finally - { + } catch (Exception e) { + Assert.fail(UNEXPECTED_EXCEPTION_STRING + e); + } finally { amfconn.close(); } } + /////////////////////////////////////////////////////////////////////////////// + // Utility methods + /////////////////////////////////////////////////////////////////////////////// + + /** + * Given a remote method name, returns the AMF connection call needed using + * the default destination id. + */ + private static String getOperationCall(String method) { + return DEFAULT_DESTINATION_ID + "." + method; + } + + private static String getConnectionUrl() { + return String.format(DEFAULT_URL, serverPort); + } + // A simple interface to handle AMF call results. - private interface CallResultHandler - { + private interface CallResultHandler { void onResult(Object result); } // Helper method used by JUnit tests to pass in an operation and method argument // When the AMF call returns, CallResultHandler.onResult is called to Assert things. - private void internalTestCall(String operation, Object methodArg, CallResultHandler resultHandler) throws ClientStatusException, ServerStatusException - { + private void internalTestCall(String operation, Object methodArg, CallResultHandler resultHandler) throws ClientStatusException, ServerStatusException { AMFConnection amfConnection = new AMFConnection(); // Connect. - amfConnection.connect(getConnectionUrl()); + amfConnection.connect(getConnectionUrl(), serializationContext); // Make a remoting call and retrieve the result. Object result; - if (methodArg == null) + if (methodArg == null) { result = amfConnection.call(operation); - else + } else { result = amfConnection.call(operation, methodArg); + } resultHandler.onResult(result); amfConnection.close(); }