diff --git a/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java b/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java new file mode 100644 index 00000000000..5de14e9954c --- /dev/null +++ b/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java @@ -0,0 +1,56 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.mock.http; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; +import org.springframework.util.Assert; + +/** + * Mock implementation of {@link HttpInputMessage}. + * + * @author Rossen Stoyanchev + * @since 3.2 + */ +public class MockHttpInputMessage implements HttpInputMessage { + + private final HttpHeaders headers = new HttpHeaders(); + + private final InputStream body; + + + public MockHttpInputMessage(byte[] contents) { + this.body = (contents != null) ? new ByteArrayInputStream(contents) : null; + } + + public MockHttpInputMessage(InputStream body) { + Assert.notNull(body, "'body' must not be null"); + this.body = body; + } + + public HttpHeaders getHeaders() { + return this.headers; + } + + public InputStream getBody() throws IOException { + return this.body; + } + +} diff --git a/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java b/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java new file mode 100644 index 00000000000..43fa1b3e7ee --- /dev/null +++ b/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java @@ -0,0 +1,86 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.mock.http; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpOutputMessage; + +/** + * Mock implementation of {@link HttpOutputMessage}. + * + * @author Rossen Stoyanchev + * @since 3.2 + */ +public class MockHttpOutputMessage implements HttpOutputMessage { + + private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private final HttpHeaders headers = new HttpHeaders(); + + private final ByteArrayOutputStream body = new ByteArrayOutputStream(); + + + /** + * Return the headers. + */ + public HttpHeaders getHeaders() { + return this.headers; + } + + /** + * Return the body content. + */ + public OutputStream getBody() throws IOException { + return this.body; + } + + /** + * Return body content as a byte array. + */ + public byte[] getBodyAsBytes() { + return this.body.toByteArray(); + } + + /** + * Return the body content interpreted as a UTF-8 string. + */ + public String getBodyAsString() { + return getBodyAsString(DEFAULT_CHARSET); + } + + /** + * Return the body content as a string. + * @param charset the charset to use to turn the body content to a String + */ + public String getBodyAsString(Charset charset) { + byte[] bytes = getBodyAsBytes(); + try { + // Use + return new String(bytes, charset.name()); + } + catch (UnsupportedEncodingException ex) { + // should not occur + throw new InternalError(ex.getMessage()); + } + } + +} diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java new file mode 100644 index 00000000000..91345526dbd --- /dev/null +++ b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java @@ -0,0 +1,111 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.mock.http.client; + +import java.io.IOException; +import java.net.URI; + +import org.springframework.http.HttpMethod; +import org.springframework.http.client.ClientHttpRequest; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.mock.http.MockHttpOutputMessage; + +/** + * Mock implementation of {@link ClientHttpRequest}. + * + * @author Rossen Stoyanchev + * @since 3.2 + */ +public class MockClientHttpRequest extends MockHttpOutputMessage implements ClientHttpRequest { + + private URI uri; + + private HttpMethod httpMethod; + + private boolean executed = false; + + private ClientHttpResponse clientHttpResponse; + + + /** + * Default constructor. + */ + public MockClientHttpRequest() { + } + + /** + * Create an instance with the given HttpMethod and URI. + */ + public MockClientHttpRequest(HttpMethod httpMethod, URI uri) { + this.httpMethod = httpMethod; + this.uri = uri; + } + + public URI getURI() { + return this.uri; + } + + public void setURI(URI uri) { + this.uri = uri; + } + + public HttpMethod getMethod() { + return this.httpMethod; + } + + public void setMethod(HttpMethod httpMethod) { + this.httpMethod = httpMethod; + } + + public void setResponse(ClientHttpResponse clientHttpResponse) { + this.clientHttpResponse = clientHttpResponse; + } + + /** + * Whether the execute method was invoked. + */ + public boolean isExecuted() { + return this.executed; + } + + /** + * Sets the {@link #isExecuted() executed} flag to true and returns the + * configured {@link #setResponse(ClientHttpResponse) response}. + */ + public ClientHttpResponse execute() throws IOException { + this.executed = true; + return this.clientHttpResponse; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (this.httpMethod != null) { + sb.append(this.httpMethod); + } + if (this.uri != null) { + sb.append(" ").append(this.uri); + } + if (!getHeaders().isEmpty()) { + sb.append(", headers : ").append(getHeaders()); + } + if (sb.length() == 0) { + sb.append("Not yet initialized"); + } + return sb.toString(); + } + +} diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java new file mode 100644 index 00000000000..9ed40774f1e --- /dev/null +++ b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java @@ -0,0 +1,70 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.mock.http.client; + +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.mock.http.MockHttpInputMessage; +import org.springframework.util.Assert; + +/** + * Mock implementation of {@link ClientHttpResponse}. + * + * @author Rossen Stoyanchev + * @since 3.2 + */ +public class MockClientHttpResponse extends MockHttpInputMessage implements ClientHttpResponse { + + private final HttpStatus status; + + + /** + * Constructor with response body as a byte array. + */ + public MockClientHttpResponse(byte[] body, HttpStatus statusCode) { + super(body); + Assert.notNull(statusCode, "statisCode is required"); + this.status = statusCode; + } + + /** + * Constructor with response body as InputStream. + */ + public MockClientHttpResponse(InputStream body, HttpStatus statusCode) { + super(body); + Assert.notNull(statusCode, "statisCode is required"); + this.status = statusCode; + } + + public HttpStatus getStatusCode() throws IOException { + return this.status; + } + + public int getRawStatusCode() throws IOException { + return this.status.value(); + } + + public String getStatusText() throws IOException { + return this.status.getReasonPhrase(); + } + + public void close() { + } + +} diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java b/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java new file mode 100644 index 00000000000..8461276681d --- /dev/null +++ b/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Mock implementations of client-side HTTP abstractions. + * This package contains the MockClientHttpRequest and + * MockClientHttpResponse. + */ +package org.springframework.mock.http.client; + diff --git a/spring-test/src/main/java/org/springframework/mock/http/package-info.java b/spring-test/src/main/java/org/springframework/mock/http/package-info.java new file mode 100644 index 00000000000..60af7793f48 --- /dev/null +++ b/spring-test/src/main/java/org/springframework/mock/http/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Mock implementations of client/server-side HTTP abstractions. + * This package contains MockHttpInputMessage and + * MockHttpOutputMessage. + */ +package org.springframework.mock.http; +