diff --git a/src/main/java/com/amihaiemil/docker/MatchStatus.java b/src/main/java/com/amihaiemil/docker/MatchStatus.java new file mode 100644 index 00000000..b19b5b59 --- /dev/null +++ b/src/main/java/com/amihaiemil/docker/MatchStatus.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2018, Mihai Emil Andronache + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1)Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2)Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3)Neither the name of docker-java-api nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package com.amihaiemil.docker; + +import java.io.IOException; +import java.net.URI; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.ResponseHandler; + +/** + * An Apache ResponseHandler that tries to match the Response's status code + * with the expected one. + * @author Mihai Andronache (amihaiemil@gmail.com) + * @version $Id$ + * @since 0.0.1 + * @todo #93:30min Use this ResponseHandler to get rid of the status code + * checking logic which is duplicated in many places like RtContainer + * and RtImages. + */ +final class MatchStatus implements ResponseHandler { + + /** + * Called URI. + */ + private final URI called; + + /** + * Expected status. + */ + private final int expected; + + /** + * Ctor. + * @param called Called URI. + * @param expected Expected Http status code. + */ + MatchStatus(final URI called, final int expected) { + this.called = called; + this.expected = expected; + } + + @Override + public HttpResponse handleResponse(final HttpResponse response) + throws ClientProtocolException, IOException { + final int actual = response.getStatusLine().getStatusCode(); + if(actual != this.expected) { + throw new UnexpectedResponseException( + this.called.toString(), actual, this.expected + ); + } + return response; + } + +} diff --git a/src/test/java/com/amihaiemil/docker/MatchStatusTestCase.java b/src/test/java/com/amihaiemil/docker/MatchStatusTestCase.java new file mode 100644 index 00000000..cf37c1aa --- /dev/null +++ b/src/test/java/com/amihaiemil/docker/MatchStatusTestCase.java @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2018, Mihai Emil Andronache + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1)Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2)Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3)Neither the name of docker-java-api nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package com.amihaiemil.docker; + +import com.amihaiemil.docker.mock.Response; +import java.net.URI; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.Test; + +/** + * Unit tests for {@link MatchStatus}. + * @author Mihai Andronache (amihaiemil@gmail.com) + * @version $Id$ + * @since 0.0.1 + */ +public final class MatchStatusTestCase { + + /** + * {@link MatchStatus} throws UnexpectedResponseException if the status + * of the HttpResponse is not the expected one. + * @throws Exception If something goes wrong. + */ + @Test(expected = UnexpectedResponseException.class) + public void complainsOnDifferentStatus() throws Exception { + new MatchStatus(URI.create("/test/ur"), HttpStatus.SC_OK) + .handleResponse(new Response(HttpStatus.SC_NOT_FOUND, "")); + } + + /** + * {@link MatchStatus} returns the HttpResponse if the status code is + * the expected one. + * @throws Exception If something goes wrong. + */ + @Test + public void returnsResponseOnMatch() throws Exception { + final HttpResponse resp = new Response(HttpStatus.SC_OK, ""); + MatcherAssert.assertThat( + new MatchStatus(URI.create("/test/ur"), HttpStatus.SC_OK) + .handleResponse(resp), + Matchers.is(resp) + ); + } + +} diff --git a/src/test/java/com/amihaiemil/docker/mock/AssertRequest.java b/src/test/java/com/amihaiemil/docker/mock/AssertRequest.java index b9689be9..b0ab0e95 100644 --- a/src/test/java/com/amihaiemil/docker/mock/AssertRequest.java +++ b/src/test/java/com/amihaiemil/docker/mock/AssertRequest.java @@ -118,7 +118,8 @@ public HttpResponse execute(final HttpHost target, public T execute(final HttpUriRequest request, final ResponseHandler responseHandler) throws IOException, ClientProtocolException { - throw new UnsupportedOperationException("Not supported yet."); + this.check(request); + return responseHandler.handleResponse(this.response); } @Override