Skip to content

Commit eaf9b9f

Browse files
michael-simonsAndrew Jeffersonbsideup
authored
Delegate copyFile{To,From}Container's state verification to Docker (#3805)
This commit closes #3264 by letting the Docker daemon decide in which state the copy operation could be performed (we were too strict about it before). Now, only a quick check (`containerId != null`) is performed. Co-authored-by: Andrew Jefferson <[email protected]> Co-authored-by: Sergei Egorov <[email protected]>
1 parent c0eaf34 commit eaf9b9f

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

core/src/main/java/org/testcontainers/containers/ContainerState.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ default void copyFileToContainer(MountableFile mountableFile, String containerPa
260260
*/
261261
@SneakyThrows(IOException.class)
262262
default void copyFileToContainer(Transferable transferable, String containerPath) {
263-
if (!isCreated()) {
263+
if (getContainerId() == null) {
264264
throw new IllegalStateException("copyFileToContainer can only be used with created / running container");
265265
}
266266

@@ -306,7 +306,7 @@ default void copyFileFromContainer(String containerPath, String destinationPath)
306306
*/
307307
@SneakyThrows
308308
default <T> T copyFileFromContainer(String containerPath, ThrowingFunction<InputStream, T> function) {
309-
if (!isCreated()) {
309+
if (getContainerId() == null) {
310310
throw new IllegalStateException("copyFileFromContainer can only be used when the Container is created.");
311311
}
312312

core/src/test/java/org/testcontainers/junit/FileOperationsTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@
22

33
import com.github.dockerjava.api.exception.NotFoundException;
44
import org.apache.commons.io.FileUtils;
5+
import org.apache.commons.io.IOUtils;
6+
import org.assertj.core.api.Assertions;
57
import org.junit.Rule;
68
import org.junit.Test;
79
import org.junit.rules.TemporaryFolder;
810
import org.testcontainers.containers.GenericContainer;
11+
import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy;
912
import org.testcontainers.utility.MountableFile;
1013

1114
import java.io.File;
1215
import java.io.IOException;
1316

17+
import static org.assertj.core.api.Assertions.assertThat;
1418
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
1519
import static org.testcontainers.TestImages.ALPINE_IMAGE;
1620

@@ -103,4 +107,50 @@ public void shouldCopyFileFromContainerTest() throws IOException {
103107
assertTrue("Files aren't same ", FileUtils.contentEquals(expectedFile, actualFile));
104108
}
105109
}
110+
111+
@Test
112+
public void copyFileOperationsShouldFailWhenNotStartedTest() {
113+
try (GenericContainer<?> container = new GenericContainer<>(ALPINE_IMAGE).withCommand("top")) {
114+
Assertions
115+
.assertThatThrownBy(() -> {
116+
MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt");
117+
container.copyFileToContainer(mountableFile, "/home/test.txt");
118+
})
119+
.isInstanceOf(IllegalStateException.class)
120+
.hasMessageContaining("can only be used with created / running container");
121+
122+
Assertions
123+
.assertThatThrownBy(() -> {
124+
container.copyFileFromContainer(
125+
"/home/test_copy_to_container.txt",
126+
IOUtils::toByteArray
127+
);
128+
})
129+
.isInstanceOf(IllegalStateException.class)
130+
.hasMessageContaining("can only be used when the Container is created");
131+
}
132+
}
133+
134+
@Test
135+
public void shouldCopyFileFromExitedContainerTest() throws IOException {
136+
try (
137+
GenericContainer<?> container = new GenericContainer<>(ALPINE_IMAGE)
138+
.withCommand("sh", "-c", "echo -n 'Hello!' > /home/file_in_container.txt")
139+
.withStartupCheckStrategy(new OneShotStartupCheckStrategy())
140+
) {
141+
container.start();
142+
assertThat(container.getDockerClient().waitContainerCmd(container.getContainerId()).start().awaitStatusCode())
143+
.isEqualTo(0);
144+
145+
container.copyFileFromContainer(
146+
"/home/file_in_container.txt",
147+
IOUtils::toByteArray
148+
);
149+
150+
container.copyFileToContainer(
151+
MountableFile.forClasspathResource("test_copy_to_container.txt"),
152+
"/test.txt"
153+
);
154+
}
155+
}
106156
}

0 commit comments

Comments
 (0)