blob: b2d3dc7f9c76c7e9120b144d55bb015c1d80649d [file] [log] [blame]
/*
* 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 flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.client.exceptions.ClientStatusException;
import flex.messaging.io.amf.client.exceptions.ServerStatusException;
import flex.messaging.util.TestServerWrapper;
import flex.messaging.util.XMLUtil;
import flex.messaging.validators.ClassDeserializationValidator;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.w3c.dom.Document;
import remoting.amfclient.ClientCustomType;
import java.util.Date;
import java.util.List;
/**
* JUnit tests for AMFConnection. Note that most of the tests require a running
* server with the specified destination.
*/
public class AMFDataTypeIT {
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 final String UNEXPECTED_SUCCESS_STRING = "Unexpected success of previous operation";
private static TestServerWrapper standardValidationServerWrapper;
private static int standardValidationServerPort;
private static TestServerWrapper customValidationServerWrapper;
private static int customValidationServerPort;
private static SerializationContext serializationContext;
@BeforeClass
public static void setup() {
standardValidationServerWrapper = new TestServerWrapper();
standardValidationServerPort = standardValidationServerWrapper.startServer("classpath:/WEB-INF/flex/services-config.xml");
if (standardValidationServerPort == -1) {
Assert.fail("Couldn't start server (standard validation) process");
}
customValidationServerWrapper = new TestServerWrapper();
customValidationServerPort = customValidationServerWrapper.startServer("classpath:/WEB-INF/flex/services-config-customized-validation.xml");
if (customValidationServerPort == -1) {
Assert.fail("Couldn't start server (custom validation) process");
}
AMFConnection.registerAlias(
"remoting.amfclient.ServerCustomType" /* server type */,
"remoting.amfclient.ClientCustomType" /* client type */);
serializationContext = SerializationContext.getSerializationContext();
ClassDeserializationValidator deserializationValidator =
(ClassDeserializationValidator) serializationContext.getDeserializationValidator();
deserializationValidator.addAllowClassPattern("remoting.amfclient.*");
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;
}
@AfterClass
public static void teardown() {
standardValidationServerWrapper.stopServer();
standardValidationServerWrapper = null;
customValidationServerWrapper.stopServer();
customValidationServerWrapper = null;
}
@Test
public void testCallStringArgStringReturn() {
try {
internalTestCall(DEFAULT_AMF_OPERATION, DEFAULT_METHOD_ARG, new CallResultHandler() {
public void onResult(Object result) {
Assert.assertEquals(DEFAULT_METHOD_ARG, result);
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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);
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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);
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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);
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
Assert.fail(UNEXPECTED_SUCCESS_STRING);
} catch (Exception e) {
// An exception is what we expect here.
}
}
@Test
public void testCallObjectArgObjectReturnCustomizedValidation() {
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());
}
}, true);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
Assert.fail(UNEXPECTED_SUCCESS_STRING);
} catch (Exception e) {
// An exception is what we expect here.
}
}
@Test
public void testCallObjectArgCustomReturnCustomizedValidation() {
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());
}
}, true);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
Assert.fail(UNEXPECTED_SUCCESS_STRING);
} catch (Exception e) {
// An exception is what we expect here.
}
}
@Test
public void testCallCustomArgObjectReturnCustomizedValidation() {
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());
}
}, true);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
Assert.fail(UNEXPECTED_SUCCESS_STRING);
} catch (Exception e) {
// An exception is what we expect here.
}
}
@Test
public void testCallCustomArgCustomReturnCustomizedValidation() {
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());
}
}, true);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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());
}
}
}, false);
Assert.fail(UNEXPECTED_SUCCESS_STRING);
} catch (Exception e) {
// An exception is what we expect here.
}
}
@Test
public void testCallObjectArrayArgObjectArrayReturnCustomizedValidation() {
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());
}
}
}, true);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
@Test
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) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
} finally {
// Disable xml serialization/deserialization again.
serializationContext.allowXml = false;
}
}
@Test
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) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
}, false);
} catch (Exception e) {
Assert.fail(UNEXPECTED_EXCEPTION_STRING + e);
}
}
///////////////////////////////////////////////////////////////////////////////
// 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 getStandardValidationConnectionUrl() {
return String.format(DEFAULT_URL, standardValidationServerPort);
}
private static String getCustomValidationConnectionUrl() {
return String.format(DEFAULT_URL, customValidationServerPort);
}
// 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, boolean customizedValidation) throws ClientStatusException, ServerStatusException {
AMFConnection amfConnection = new AMFConnection();
// Connect.
if (customizedValidation) {
amfConnection.connect(getCustomValidationConnectionUrl(), serializationContext);
} else {
amfConnection.connect(getStandardValidationConnectionUrl(), 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();
}
}