From 3b3399d5674d68590de4da2107ec56a6688a57d0 Mon Sep 17 00:00:00 2001 From: Alexander Koshevoy Date: Fri, 11 Mar 2016 15:01:51 +0300 Subject: [PATCH 1/3] Fixes skipping 0xff bytes from result stream returned by Netty implementation of copy file/archive commands --- pom.xml | 8 +++ .../handler/HttpResponseStreamHandler.java | 2 +- .../HttpResponseStreamHandlerTest.java | 51 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java diff --git a/pom.xml b/pom.xml index 2b5fe2119..9ee5cad51 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,7 @@ 1.3 1.6 2.3.3 + 1.10.19 2.2 @@ -195,6 +196,13 @@ test + + org.mockito + mockito-core + ${mockito.version} + test + + com.google.code.findbugs annotations diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java index d4f19f2e3..706228d04 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java @@ -81,7 +81,7 @@ public int read() throws IOException { } if (current != null && current.readableBytes() > 0) { - return current.readByte(); + return current.readByte() & 0xff; } else { return read(); } diff --git a/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java b/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java new file mode 100644 index 000000000..5d4c091d9 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java @@ -0,0 +1,51 @@ +package com.github.dockerjava.netty.handler; + +import com.github.dockerjava.core.async.ResultCallbackTemplate; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import org.apache.commons.io.IOUtils; +import org.mockito.Mockito; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.InputStream; + +/** + * @author Alexander Koshevoy + */ +public class HttpResponseStreamHandlerTest { + @Test + public void testNoBytesSkipped() throws Exception { + ResultCallbackTest callback = new ResultCallbackTest(); + HttpResponseStreamHandler streamHandler = new HttpResponseStreamHandler(callback); + ChannelHandlerContext ctx = Mockito.mock(ChannelHandlerContext.class); + ByteBuf buffer = generateByteBuf(); + streamHandler.channelRead0(ctx, buffer); + streamHandler.channelReadComplete(ctx); + + Assert.assertTrue(IOUtils.contentEquals(callback.getInputStream(), new ByteBufInputStream(buffer))); + } + + private ByteBuf generateByteBuf() { + byte[] array = new byte[256]; + for (int i = 0; i < array.length; i++) { + array[i] = (byte) i; + } + return Unpooled.copiedBuffer(array); + } + + private static class ResultCallbackTest extends ResultCallbackTemplate { + private InputStream stream; + + @Override + public void onNext(InputStream stream) { + this.stream = stream; + } + + public InputStream getInputStream() { + return stream; + } + } +} From c3ab3d215e2acf0a2569c060fbaede3ae973a4e2 Mon Sep 17 00:00:00 2001 From: tejksat Date: Sun, 20 Mar 2016 01:02:31 +0300 Subject: [PATCH 2/3] Integration test for copy archive cmd checking integrity of received binary file --- .../CopyArchiveFromContainerCmdExecTest.java | 40 ++++++++++++++++++ .../resources/testCopyFromArchive/binary.dat | Bin 0 -> 288 bytes 2 files changed, 40 insertions(+) create mode 100644 src/test/resources/testCopyFromArchive/binary.dat diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java index aa4dcc575..caec336a2 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java @@ -6,7 +6,14 @@ import java.io.InputStream; import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.io.IOUtils; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -16,6 +23,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.util.CompressArchiveUtil; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @Test(groups = "integration") @@ -70,4 +78,36 @@ public void copyFromNonExistingContainer() throws Exception { } catch (NotFoundException ignored) { } } + + @Test + public void copyFromContainerBinaryFile() throws Exception { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-copyFromContainerBinaryFile").exec(); + + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + + Path temp = Files.createTempFile("", ".tar.gz"); + Path binaryFile = Paths.get("src/test/resources/testCopyFromArchive/binary.dat"); + CompressArchiveUtil.tar(binaryFile, temp, true, false); + + try (InputStream uploadStream = Files.newInputStream(temp)) { + dockerClient.copyArchiveToContainerCmd(container.getId()).withTarInputStream(uploadStream).exec(); + } + + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/binary.dat").exec(); + Boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + try (TarArchiveInputStream tarInputStream = new TarArchiveInputStream(response)) { + TarArchiveEntry nextTarEntry = tarInputStream.getNextTarEntry(); + + assertEquals(nextTarEntry.getName(), "binary.dat"); + try (InputStream binaryFileInputStream = Files.newInputStream(binaryFile, StandardOpenOption.READ)) { + assertTrue(IOUtils.contentEquals(binaryFileInputStream, tarInputStream)); + } + + assertNull(tarInputStream.getNextTarEntry(), "Nothing except binary.dat is expected to be copied."); + } + } } diff --git a/src/test/resources/testCopyFromArchive/binary.dat b/src/test/resources/testCopyFromArchive/binary.dat new file mode 100644 index 0000000000000000000000000000000000000000..61bcc872c139dd1bc827058031947f132b91fa53 GIT binary patch literal 288 zcmV+*0pI>paAjj@VQe6Cd2M2EY;!CicVTp6XdrKObRi0Wfr5jCg@%WSiHeJijgF6y zk&=^?m6n&7nVOrNot~edp`xRtrKYE-sj922t*)=Iv9hzYwYImoxw^Z&y}rM|!NSAD z#m2|T$;!*j&Cbuz(bCh@)z;V8+1lIO-QM5e;o{@u<>u$;>FVq3?e6dJ@$&QZ_4fDp z`TG0({r>*|0RjUA1qKHQ2?`4g4Gs?w5fT#=6&4p585$cL9UdPbAtECrB_<~*DJm;0 zEiNxGF)}kWH8wXmIXXK$Jw87`K|(`BMMg(RNlHshO-@fxQBqS>RaRG6Sz23MU0z>c mVPa!sWoBn+X=-b1ZEkOHadLBXb#`}nd3t+%eSUg-e0_dnKZ{-f literal 0 HcmV?d00001 From 2f62af8bfb64eadde35c0329fb834a403dc60ec6 Mon Sep 17 00:00:00 2001 From: tejksat Date: Sun, 20 Mar 2016 01:11:28 +0300 Subject: [PATCH 3/3] Static import for assertion used, imports reformatted --- .../netty/handler/HttpResponseStreamHandlerTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java b/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java index 5d4c091d9..6652f3eba 100644 --- a/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java +++ b/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java @@ -1,16 +1,18 @@ package com.github.dockerjava.netty.handler; -import com.github.dockerjava.core.async.ResultCallbackTemplate; +import static org.testng.Assert.assertTrue; + +import java.io.InputStream; + import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.io.IOUtils; import org.mockito.Mockito; -import org.testng.Assert; import org.testng.annotations.Test; -import java.io.InputStream; +import com.github.dockerjava.core.async.ResultCallbackTemplate; /** * @author Alexander Koshevoy @@ -25,7 +27,7 @@ public void testNoBytesSkipped() throws Exception { streamHandler.channelRead0(ctx, buffer); streamHandler.channelReadComplete(ctx); - Assert.assertTrue(IOUtils.contentEquals(callback.getInputStream(), new ByteBufInputStream(buffer))); + assertTrue(IOUtils.contentEquals(callback.getInputStream(), new ByteBufInputStream(buffer))); } private ByteBuf generateByteBuf() {