package org.springframework.flex.http;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.springframework.flex.core.io.domain.Person;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import flex.messaging.io.MessageIOConstants;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.ActionContext;
import flex.messaging.io.amf.ActionMessage;
import flex.messaging.io.amf.Amf3Input;
import flex.messaging.io.amf.Amf3Output;
import flex.messaging.io.amf.AmfMessageDeserializer;
import flex.messaging.io.amf.MessageBody;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class AmfHttpMessageConverterTests {
private final MediaType amfContentType = MediaType.parseMediaType(MessageIOConstants.AMF_CONTENT_TYPE);
private MockHttpServletResponse response;
private MockHttpServletRequest request;
@Before
public void setUp() throws Exception {
this.response = new MockHttpServletResponse();
this.request = new MockHttpServletRequest();
}
@Test
public void canRead() {
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
assertTrue(converter.canRead(Object.class, this.amfContentType));
}
@Test
public void canWrite() {
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
assertTrue(converter.canWrite(Object.class, this.amfContentType));
}
@Test
public void writeSimpleString() throws Exception {
HttpOutputMessage outputMessage = new ServletServerHttpResponse(this.response);
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
converter.write("foo", this.amfContentType, outputMessage);
Object result = deserializeResponse();
assertEquals(this.amfContentType, outputMessage.getHeaders().getContentType());
assertEquals("foo", result);
}
@Test
public void writeObject() throws Exception {
HttpOutputMessage outputMessage = new ServletServerHttpResponse(this.response);
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
converter.write(Person.stubPerson(), this.amfContentType, outputMessage);
Object result = deserializeResponse();
assertEquals(this.amfContentType, outputMessage.getHeaders().getContentType());
assertTrue(result instanceof Person);
}
@Test
public void writeActionMessage() throws Exception {
HttpOutputMessage outputMessage = new ServletServerHttpResponse(this.response);
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
ActionMessage responseMessage = new ActionMessage();
MessageBody responseBody = new MessageBody();
responseMessage.addBody(responseBody);
responseBody.setData(Person.stubPerson());
converter.write(responseMessage, this.amfContentType, outputMessage);
ActionMessage result = deserializeResponseToActionMessage();
assertNotNull(result);
assertEquals(1, result.getBodyCount());
assertTrue(result.getBody(0).getData() instanceof Person);
}
@Test
public void readSimpleString() throws Exception {
this.request.setContentType(new MediaType("application", "x-amf").toString());
this.request.setContent(serializeToByteArray("foo"));
HttpInputMessage inputMessage = new ServletServerHttpRequest(this.request);
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
Object result = converter.read(Object.class, inputMessage);
assertEquals("foo", result);
}
@Test
public void readObject() throws Exception {
this.request.setContentType(new MediaType("application", "x-amf").toString());
this.request.setContent(serializeToByteArray(Person.stubPerson()));
HttpInputMessage inputMessage = new ServletServerHttpRequest(this.request);
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
Object result = converter.read(Object.class, inputMessage);
assertTrue(result instanceof Person);
}
@Test
public void readNonAmfContent() throws Exception {
this.request.setContent(("This should not be readable.").getBytes());
HttpInputMessage inputMessage = new ServletServerHttpRequest(this.request);
AmfHttpMessageConverter converter = new AmfHttpMessageConverter();
try {
converter.read(Object.class, inputMessage);
fail("Exception was expected.");
} catch (HttpMessageNotReadableException ex) {
//Expected
}
}
private byte[] serializeToByteArray(Object data) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Amf3Output serializer = new Amf3Output(new SerializationContext());
serializer.setOutputStream(out);
serializer.writeObject(data);
try {
return out.toByteArray();
} finally {
out.close();
}
}
private Object deserializeResponse() throws ClassNotFoundException, IOException {
Amf3Input deserializer = new Amf3Input(new SerializationContext());
this.request.setContent(this.response.getContentAsByteArray());
deserializer.setInputStream(this.request.getInputStream());
return deserializer.readObject();
}
private ActionMessage deserializeResponseToActionMessage() throws ClassNotFoundException, IOException {
AmfMessageDeserializer deserializer = new AmfMessageDeserializer();
this.request.setContent(this.response.getContentAsByteArray());
deserializer.initialize(new SerializationContext(), this.request.getInputStream(), null);
ActionMessage result = new ActionMessage();
deserializer.readMessage(result, new ActionContext());
return result;
}
}