You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2017/04/16 22:32:45 UTC

[54/72] [abbrv] flex-blazeds git commit: - Moved the integration tests to the remoting module as they require remoting to run (not ideal solution) - Enabled the integation tests again - Implemented a new serialization option "allow-xml" which is disabled

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/a09196c2/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
new file mode 100644
index 0000000..134315c
--- /dev/null
+++ b/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java
@@ -0,0 +1,778 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 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 amfclient.ClientCustomType;
+
+import flex.messaging.MessageException;
+import flex.messaging.messages.RemotingMessage;
+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;
+
+
+/**
+ * JUnit tests for AMFConnection. Note that most of the tests require a running
+ * server with the specified destination.
+ */
+public class AMFConnectionIT extends TestCase
+{
+    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";
+    private static final String DEFAULT_URL = "http://localhost:%s/qa-regress/messagebroker/amf";
+    private static final String DEFAULT_AMF_OPERATION = getOperationCall(DEFAULT_METHOD_NAME);
+    private static final String FOO_STRING = "foo";
+    private static final String BAR_STRING = "bar";
+    private static final String UNEXPECTED_EXCEPTION_STRING = "Unexpected exception: ";
+
+    private static TestServerWrapper serverWrapper;
+    private static int serverPort;
+
+    /**
+     * 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;
+    }
+
+    protected String getConnectionUrl() {
+        return String.format(DEFAULT_URL, serverPort);
+    }
+
+
+    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 */,
+                        "amfclient.ClientCustomType" /* client type */);
+            }
+            protected void tearDown() throws Exception {
+                serverWrapper.stopServer();
+                serverWrapper = null;
+            }
+        };
+    }
+
+    // Not a test, just an example to show how to use AMFConnection.
+    public void example()
+    {
+        // Create the AMF connection.
+        AMFConnection amfConnection = new AMFConnection();
+
+        // Connect to the remote url.
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+        }
+        catch (ClientStatusException cse)
+        {
+            return;
+        }
+
+        // Make a remoting call and retrieve the result.
+        try
+        {
+            Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG);
+            Assert.assertEquals(DEFAULT_METHOD_ARG, result);
+        }
+        catch (ClientStatusException cse)
+        {
+            // Ignore.
+        }
+        catch (ServerStatusException sse)
+        {
+            // Ignore.
+        }
+
+        // Close the connection.
+        amfConnection.close();
+    }
+
+    public void testConnect()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testConnectAndClose()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+            Assert.assertEquals(null, amfConnection.getUrl());
+        }
+    }
+
+    public void testConnectBadUrl()
+    {
+        String badUrl = "badUrl";
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(badUrl);
+            fail("ClientStatusException expected");
+        }
+        catch (ClientStatusException cse)
+        {
+            Assert.assertEquals(ClientStatusException.AMF_CONNECT_FAILED_CODE, cse.getCode());
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testCallMultipleTimes()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        // Make a remoting call and retrieve the result.
+        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
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testCallNoConnect()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        // Make a remoting call without connect.
+        try
+        {
+            Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG);
+            Assert.assertEquals(DEFAULT_METHOD_ARG, result);
+        }
+        catch (ClientStatusException cse)
+        {
+            Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode());
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testCallNoConnectStringMsg()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        // Make a remoting call without connect.
+        try
+        {
+            Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG);
+            Assert.assertEquals(DEFAULT_METHOD_ARG, result);
+        }
+        catch (ClientStatusException cse)
+        {
+            Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode());
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testCallUnreachableConnectUrl()
+    {
+        String unreachableUrl = "http://localhost:8400/team/messagebroker/unreachable";
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            // Connect does not actually connect but simply sets the url.
+            amfConnection.connect(unreachableUrl);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        // Make a remoting call and retrieve the result.
+        try
+        {
+            Object result = amfConnection.call(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG);
+            Assert.assertEquals(DEFAULT_METHOD_ARG, result);
+        }
+        catch (ClientStatusException cse)
+        {
+            Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode());
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testCallNonexistantMethod()
+    {
+        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);
+                }
+            });
+        }
+        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);
+        }
+    }
+
+    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);
+                }
+            });
+        }
+        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);
+        }
+    }
+    public void testCloseNoConnect()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        // Closing with no connection or call.
+        try
+        {
+            amfConnection.close();
+            Assert.assertEquals(null, amfConnection.getUrl());
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testSetGetObjectEncoding()
+    {
+        int retAMF;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            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
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testSetGetDefaultObjectEncoding()
+    {
+        int retAMF;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            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
+        {
+            amfConnection.close();
+        }
+    }
+
+    /**
+     * 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;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            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.close();
+        }
+    }
+
+    public void testAddRemoveAMFHeaderTwoParam()
+    {
+        boolean retAMF;
+        Object val = 1;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            amfConnection.addAmfHeader(FOO_STRING,val);
+            retAMF = amfConnection.removeAmfHeader(FOO_STRING);
+            Assert.assertTrue(retAMF);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testAddRemoveAMFHeader()
+    {
+        boolean retAMF;
+        Object val = 1;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            amfConnection.addAmfHeader(FOO_STRING,true,val);
+            retAMF = amfConnection.removeAmfHeader(FOO_STRING);
+            Assert.assertTrue(retAMF);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testAddRemoveAllAMFHeaders()
+    {
+        Object val1 = 1;
+        Object val2 = 2;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            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
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testAddRemoveHTTPRequestHeader()
+    {
+        boolean retHttp;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            amfConnection.addHttpRequestHeader(FOO_STRING,BAR_STRING);
+            retHttp = amfConnection.removeHttpRequestHeader(FOO_STRING);
+            Assert.assertTrue(retHttp);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testAddRemoveAllHTTPRequestHeaders()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            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
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testRemoveAMFHeader()
+    {
+        boolean retAMF;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            retAMF = amfConnection.removeAmfHeader(FOO_STRING);
+            Assert.assertFalse(retAMF);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testRemoveAllAMFHeaders()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            amfConnection.removeAllAmfHeaders();
+            Assert.assertTrue(true);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testRemoveHTTPRequestHeader()
+    {
+        boolean retHttp;
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            retHttp = amfConnection.removeHttpRequestHeader(FOO_STRING);
+            Assert.assertFalse(retHttp);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testRemoveAllHTTPRequestHeaders()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            amfConnection.connect(getConnectionUrl());
+            Assert.assertEquals(getConnectionUrl(), amfConnection.getUrl());
+            amfConnection.removeAllHttpRequestHeaders();
+            Assert.assertTrue(true);
+        }
+        catch (ClientStatusException cse)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + cse);
+        }
+        finally
+        {
+            amfConnection.close();
+        }
+    }
+
+
+    public void testInstantiateTypes()
+    {
+        String method = "getObject2";
+        try
+        {
+            AMFConnection amfConnection = new AMFConnection();
+            amfConnection.connect(getConnectionUrl());
+
+            // First, make sure we get the strong type.
+            Object result = amfConnection.call(getOperationCall(method));
+            Assert.assertTrue(result instanceof ClientCustomType);
+
+            // Now, call again with instantiateTypes=false and expect an Object.
+            amfConnection.setInstantiateTypes(false);
+            result = amfConnection.call(getOperationCall(method));
+            Assert.assertTrue(!(result instanceof ClientCustomType));
+            amfConnection.close();
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testSetGetAMFTrace()
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        try
+        {
+            AmfTrace trace = new AmfTrace();
+            amfConnection.connect(getConnectionUrl());
+            amfConnection.setAmfTrace(trace);
+
+            String stringToEcho = DEFAULT_METHOD_ARG + 1;
+            Object result = amfConnection.call(DEFAULT_AMF_OPERATION, stringToEcho);
+            Assert.assertEquals(stringToEcho, result);
+
+            if (trace.toString().length() > 0) Assert.assertTrue(true);
+            else 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
+        {
+            amfConnection.close();
+        }
+    }
+
+    public void testHTTPProxy()
+    {
+        AMFConnection amfconn = new AMFConnection();
+        try
+        {
+            amfconn.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8888)));
+            amfconn.connect("http://localhost:8400/team/messagebroker/amf");
+            RemotingMessage call = new RemotingMessage();
+            call.setHeader("DSId", "" + System.identityHashCode(amfconn));
+            call.setClientId("ro");
+            call.setDestination("remoting_AMF");
+            call.setMessageId("12345");
+            call.setOperation("echo");
+            call.setBody("hello");
+            amfconn.call("foo", call);
+            fail("ClientStatusException expected");
+        }
+        catch (ClientStatusException cse)
+        {
+            Assert.assertEquals(ClientStatusException.AMF_CALL_FAILED_CODE, cse.getCode());
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+        finally
+        {
+            amfconn.close();
+        }
+    }
+
+    // A simple interface to handle AMF call results.
+    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
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        // Connect.
+        amfConnection.connect(getConnectionUrl());
+        // Make a remoting call and retrieve the result.
+        Object result;
+        if (methodArg == null)
+            result = amfConnection.call(operation);
+        else
+            result = amfConnection.call(operation, methodArg);
+        resultHandler.onResult(result);
+        amfConnection.close();
+    }
+}

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/a09196c2/remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
----------------------------------------------------------------------
diff --git a/remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java b/remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
new file mode 100644
index 0000000..0347a20
--- /dev/null
+++ b/remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
@@ -0,0 +1,534 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 flex.messaging.io.amf.client;
+
+import java.util.Date;
+import java.util.List;
+
+import flex.messaging.io.SerializationContext;
+import flex.messaging.util.TestServerWrapper;
+import junit.extensions.TestSetup;
+import org.w3c.dom.Document;
+
+import org.junit.Assert;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import amfclient.ClientCustomType;
+
+import flex.messaging.io.amf.client.exceptions.ClientStatusException;
+import flex.messaging.io.amf.client.exceptions.ServerStatusException;
+import flex.messaging.util.XMLUtil;
+
+/**
+ * JUnit tests for AMFConnection. Note that most of the tests require a running
+ * server with the specified destination. 
+ */
+public class AMFDataTypeIT extends TestCase
+{
+    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";
+    private static final String DEFAULT_URL = "http://localhost:%s/qa-regress/messagebroker/amf";
+    private static final String DEFAULT_AMF_OPERATION = getOperationCall(DEFAULT_METHOD_NAME);
+    private static final String UNEXPECTED_EXCEPTION_STRING = "Unexpected exception: ";
+
+    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;
+    }
+
+    protected String getConnectionUrl() {
+        return String.format(DEFAULT_URL, serverPort);
+    }
+
+
+    public AMFDataTypeIT(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        //TestSuite suite = new TestSuite(AMFDataTypeIT.class);
+        TestSuite suite = new TestSuite();
+        suite.addTest(new AMFDataTypeIT("testCallStringArgStringReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallIntArgIntReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallBooleanArgBooleanReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallObjectArgObjectReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallObjectArgCustomReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallCustomArgObjectReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallCustomArgCustomReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallNoArgObjectReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallNoArgCustomReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallNoArgObjectArrayReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallDateArgDateReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallShortArgShortReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallDoubleArgDoubleReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallIntArrayArgIntArrayReturn"));
+        suite.addTest(new AMFDataTypeIT("testCallObjectArrayArgObjectArrayReturn"));
+        suite.addTest(new AMFDataTypeIT("testXMLDocumentEnabledXml"));
+        suite.addTest(new AMFDataTypeIT("testXMLDocumentDisabledXml"));
+
+
+        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 */,
+                        "amfclient.ClientCustomType" /* client type */);
+
+                serializationContext = new SerializationContext();
+                serializationContext.createASObjectForMissingType = true;
+                // Make sure collections are written out as Arrays (vs. ArrayCollection),
+                // in case the server does not recognize ArrayCollections.
+                serializationContext.legacyCollection = true;
+                // When legacyMap is true, Java Maps are serialized as ECMA arrays
+                // instead of anonymous Object.
+                serializationContext.legacyMap = true;
+                // Disable serialization of xml documents.
+                serializationContext.allowXml = false;
+            }
+            protected void tearDown() throws Exception {
+                serverWrapper.stopServer();
+                serverWrapper = null;
+            }
+        };
+    }
+
+    public void testCallStringArgStringReturn()
+    {
+        try
+        {
+            internalTestCall(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    Assert.assertEquals(DEFAULT_METHOD_ARG, result);
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallIntArgIntReturn()
+    {
+        String method = "echoInt";
+        final int methodArg = 1;
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    Assert.assertEquals(methodArg, ((Double)result).intValue());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallBooleanArgBooleanReturn()
+    {
+        try
+        {
+            String method = "echoBoolean";
+            final boolean methodArg = true;
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    Assert.assertEquals(methodArg, result);
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallDateArgDateReturn()
+    {
+        String method = "echoDate";
+        final Date methodArg = new Date(999991);
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    Assert.assertEquals(methodArg, result);
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallShortArgShortReturn()
+    {
+        String method = "echoShort";
+        final short methodArg = 32000;
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    Assert.assertEquals(methodArg, ((Double)result).shortValue());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallDoubleArgDoubleReturn()
+    {
+        String method = "echoDouble";
+        final double methodArg = -95.25;
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    Assert.assertEquals(methodArg, result);
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallObjectArgObjectReturn()
+    {
+        String method = "echoObject1";
+        ClientCustomType temp = new ClientCustomType();
+        temp.setId(1);
+        final Object methodArg = temp;
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    ClientCustomType temp2 = (ClientCustomType)result;
+                    Assert.assertEquals(1, temp2.getId());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallObjectArgCustomReturn()
+    {
+        String method = "echoObject2";
+        ClientCustomType temp = new ClientCustomType();
+        temp.setId(1);
+        final Object methodArg = temp;
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    ClientCustomType temp2 = (ClientCustomType)result;
+                    Assert.assertEquals(1, temp2.getId());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallCustomArgObjectReturn()
+    {
+        String method = "echoObject3";
+        final ClientCustomType methodArg = new ClientCustomType();
+        methodArg.setId(1);
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    ClientCustomType temp2 = (ClientCustomType)result;
+                    Assert.assertEquals(1, temp2.getId());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallCustomArgCustomReturn()
+    {
+        String method = "echoObject4";
+        final ClientCustomType methodArg = new ClientCustomType();
+        methodArg.setId(1);
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    ClientCustomType temp2 = (ClientCustomType)result;
+                    Assert.assertEquals(1, temp2.getId());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallNoArgObjectReturn()
+    {
+        String method = "getObject1";
+        try
+        {
+            internalTestCall(getOperationCall(method), null, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    ClientCustomType temp2 = (ClientCustomType)result;
+                    Assert.assertEquals(1, temp2.getId());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallNoArgCustomReturn()
+    {
+        String method = "getObject2";
+        try
+        {
+            internalTestCall(getOperationCall(method), null, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    ClientCustomType temp2 = (ClientCustomType)result;
+                    Assert.assertEquals(1, temp2.getId());
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallNoArgObjectArrayReturn()
+    {
+        String method = "getObjectArray1";
+        try
+        {
+            internalTestCall(getOperationCall(method), null, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    List temp = (List)result;
+                    for (int i = 0; i < temp.size(); i++)
+                    {
+                        ClientCustomType temp2 = (ClientCustomType)temp.get(i);
+                        Assert.assertEquals(i, temp2.getId());
+                    }
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallIntArrayArgIntArrayReturn()
+    {
+        String method = "echoObject5";
+        final int[] methodArg = new int[] {0,1,2,3};
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    List temp = (List)result;
+                    for (int i = 0; i < temp.size(); i++)
+                    {
+                        Assert.assertEquals(i, ((Integer)temp.get(i)).intValue());
+                    }
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    public void testCallObjectArrayArgObjectArrayReturn()
+    {
+        String method = "echoObject1";
+        Object[] temp = new Object[3];
+        for (int i = 0; i < temp.length; i++)
+        {
+            ClientCustomType cct = new ClientCustomType();
+            cct.setId(i);
+            temp[i] = cct;
+        }
+        final Object[] methodArg = temp;
+        try
+        {
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    List temp = (List)result;
+                    for (int i = 0; i < temp.size(); i++)
+                    {
+                        ClientCustomType temp2 = (ClientCustomType)temp.get(i);
+                        Assert.assertEquals(i, temp2.getId());
+                    }
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+
+    public void testXMLDocumentEnabledXml()
+    {
+        try
+        {
+            // Temporarily enable xml serialization/deserialization.
+            serializationContext.allowXml = true;
+
+            String method = "echoObject1";
+            final StringBuffer xml = new StringBuffer(512);
+            xml.append("<test>    <item id=\"1\">        <sweet/>    </item></test>");
+
+            Document xmlDoc = XMLUtil.stringToDocument(xml.toString());
+            final Object methodArg = xmlDoc;
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    try
+                    {
+                        Document retXmlDoc = (Document)result;
+                        String retXML = XMLUtil.documentToString(retXmlDoc);
+                        Assert.assertEquals(xml.toString(), retXML);
+                    }
+                    catch (Exception e)
+                    {
+                        fail(UNEXPECTED_EXCEPTION_STRING + e);
+                    }
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+        finally {
+            // Disable xml serialization/deserialization again.
+            serializationContext.allowXml = false;
+        }
+    }
+
+
+    public void testXMLDocumentDisabledXml()
+    {
+        try
+        {
+            String method = "echoObject1";
+            final StringBuffer xml = new StringBuffer(512);
+            xml.append("<test>    <item id=\"1\">        <sweet/>    </item></test>");
+
+            Document xmlDoc = XMLUtil.stringToDocument(xml.toString());
+            final Object methodArg = xmlDoc;
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    try
+                    {
+                        Document retXmlDoc = (Document)result;
+                        String retXML = XMLUtil.documentToString(retXmlDoc);
+                        Assert.assertEquals("", retXML);
+                    }
+                    catch (Exception e)
+                    {
+                        fail(UNEXPECTED_EXCEPTION_STRING + e);
+                    }
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
+    }
+
+    // A simple interface to handle AMF call results.
+    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
+    {
+        AMFConnection amfConnection = new AMFConnection();
+        // Connect.
+        amfConnection.connect(getConnectionUrl(), serializationContext);
+        // Make a remoting call and retrieve the result.
+        Object result;
+        if (methodArg == null)
+            result = amfConnection.call(operation);
+        else
+            result = amfConnection.call(operation, methodArg);
+        resultHandler.onResult(result);
+        amfConnection.close();
+    }
+}

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/a09196c2/remoting/src/test/java/flex/messaging/util/TestServer.java
----------------------------------------------------------------------
diff --git a/remoting/src/test/java/flex/messaging/util/TestServer.java b/remoting/src/test/java/flex/messaging/util/TestServer.java
new file mode 100644
index 0000000..df21561
--- /dev/null
+++ b/remoting/src/test/java/flex/messaging/util/TestServer.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 flex.messaging.util;
+
+import flex.messaging.MessageBrokerServlet;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+/**
+ * Simple little wrapper starting up a BlazeDS server in a separate VM useful for unit testing the
+ * features that need different singletons in client and server.
+ */
+public class TestServer {
+
+    public static void main(String args[]) throws Exception {
+        if(args.length != 1) {
+            throw new Exception("Need exactly two argument containing th path to the configuration " +
+                    "followed by the port number the server should use");
+        }
+        final String configPath = args[0];
+
+        // Setup a minimal servlet context for hosting our message broker servlet.
+        final Server server = new Server(0);
+        final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        context.setContextPath("/qa-regress");
+        final MessageBrokerServlet messageBrokerServlet = new MessageBrokerServlet();
+        final ServletHolder servlet = new ServletHolder(messageBrokerServlet);
+        servlet.setInitParameter("services.configuration.file", configPath);
+        context.addServlet(servlet, "/messagebroker/amf/*");
+        server.setHandler(context);
+        server.setDumpAfterStart(true);
+        try {
+            server.start();
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+
+        int port = ((ServerConnector) server.getConnectors()[0]).getLocalPort();
+        System.out.println("Port:" + port);
+    }
+}

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/a09196c2/remoting/src/test/java/flex/messaging/util/TestServerWrapper.java
----------------------------------------------------------------------
diff --git a/remoting/src/test/java/flex/messaging/util/TestServerWrapper.java b/remoting/src/test/java/flex/messaging/util/TestServerWrapper.java
new file mode 100644
index 0000000..b9fb954
--- /dev/null
+++ b/remoting/src/test/java/flex/messaging/util/TestServerWrapper.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 flex.messaging.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * Simple little wrapper starting up a BlazeDS server in a separate VM useful for unit testing the
+ * features that need different singletons in client and server.
+ */
+public class TestServerWrapper {
+
+    private Process serverProcess;
+
+    public int startServer(String configPath) {
+        // We can only start one server per instance of TestServer.
+        if(serverProcess != null) {
+            return -1;
+        }
+
+        final String separator = System.getProperty("file.separator");
+        final String classpath = System.getProperty("java.class.path");
+        final String path = System.getProperty("java.home") + separator + "bin" + separator + "java";
+        System.out.print("Starting test-server");
+        final ProcessBuilder processBuilder = new ProcessBuilder(path,
+                "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005",
+                "-cp", /*"\"" +*/ classpath /*+ "\""*/,
+                TestServer.class.getCanonicalName(), /*"\"" +*/ configPath /*+ "\""*/);
+        processBuilder.redirectErrorStream(true);
+        try {
+            serverProcess = processBuilder.start();
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(serverProcess.getInputStream()));
+
+            String line;
+            while((line = in.readLine()) != null) {
+                if(line.startsWith("Port:")) {
+                    // Read the process output and extract the port
+                    // number the server started on.
+                    int port = Integer.parseInt(line.substring(5));
+                    System.out.println("STARTED on port " + port);
+                    return port;
+                }
+            }
+
+            return -1;
+        } catch (IOException e) {
+            System.out.println("ERROR: " + e.toString());
+            return -1;
+        }
+    }
+
+    public void stopServer() {
+        if(serverProcess != null) {
+            System.out.print("Stopping test-server ... ");
+            // Send a signal to the server process to make itself shut down.
+            serverProcess.destroy();
+            System.out.println("STOPPED");
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/a09196c2/remoting/src/test/resources/WEB-INF/flex/remoting-config.xml
----------------------------------------------------------------------
diff --git a/remoting/src/test/resources/WEB-INF/flex/remoting-config.xml b/remoting/src/test/resources/WEB-INF/flex/remoting-config.xml
new file mode 100644
index 0000000..73e28c1
--- /dev/null
+++ b/remoting/src/test/resources/WEB-INF/flex/remoting-config.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+
+-->
+<service id="remoting-service" class="flex.messaging.services.RemotingService">
+
+    <!--
+        The set of adapters available for this service. A service uses an
+        adapter to handle the implementation specifc details of a
+        destination.
+    -->
+    <adapters>
+        <!--
+            id: A unique id for this adapter-definition. Destinations use this
+                id to select which adapter should be used to process requests.
+            class: The implementation class for the adapter. A single Remoting
+                Service adapter ships with Flex 2:
+                    flex.messaging.services.remoting.adapters.JavaAdapter
+            default: An optional boolean attribute identifying the adapter to
+                use when none is specified for a destination.
+        -->
+        <adapter-definition id="java-object"
+                            class="flex.messaging.services.remoting.adapters.JavaAdapter"
+                            default="true"/>
+    </adapters>
+
+    <!--
+        The set of default channels to use to transport messages to
+        remoting-service destinations.
+    -->
+    <default-channels>
+        <channel ref="amf"/>
+    </default-channels>
+
+    <!-- This destination is used by AMFConnectionIT JUnit test -->
+    <destination id="amfConnectionTestService" channels="amf">
+        <properties>
+            <source>remoting.amfclient.AMFConnectionTestService</source>
+        </properties>
+        <adapter ref="java-object"/>
+    </destination>
+
+</service>

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/a09196c2/remoting/src/test/resources/WEB-INF/flex/services-config.xml
----------------------------------------------------------------------
diff --git a/remoting/src/test/resources/WEB-INF/flex/services-config.xml b/remoting/src/test/resources/WEB-INF/flex/services-config.xml
new file mode 100644
index 0000000..2bbf7d7
--- /dev/null
+++ b/remoting/src/test/resources/WEB-INF/flex/services-config.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+
+-->
+<services-config>
+
+    <services>
+        <service-include file-path="remoting-config.xml" />
+    </services>
+
+    <channels>
+        <channel-definition id="amf" class="mx.messaging.channels.AMFChannel">
+            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
+            <properties>
+                <serialization>
+                    <allow-xml>true</allow-xml>
+                </serialization>
+            </properties>
+        </channel-definition>
+    </channels>
+
+    <logging>
+        <target class="flex.messaging.log.ConsoleTarget" level="Error">
+            <properties>
+                <prefix>[BlazeDS] </prefix>
+                <includeDate>false</includeDate>
+                <includeTime>false</includeTime>
+                <includeLevel>false</includeLevel>
+                <includeCategory>false</includeCategory>
+            </properties>
+            <filters>
+                <pattern>Endpoint.*</pattern>
+                <pattern>Service.*</pattern>
+                <pattern>Configuration</pattern>
+            </filters>
+        </target>
+    </logging>
+
+</services-config>