Skip to content

Commit bf70b40

Browse files
authored
run core tests in parallel (#5365)
* run `core` tests in parallel * ooops * Dummy change * dummy change (2)
1 parent f41bdb2 commit bf70b40

File tree

6 files changed

+79
-149
lines changed

6 files changed

+79
-149
lines changed

core/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ sourceSets {
66
jarFileTest
77
}
88

9+
test.maxParallelForks = 4
10+
911
idea.module.testSourceDirs += sourceSets.jarFileTest.allSource.srcDirs
1012

1113
shadowJar {

core/src/test/java/org/testcontainers/DockerClientFactoryTest.java

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package org.testcontainers;
22

3-
import static org.assertj.core.api.Assertions.assertThat;
4-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5-
6-
import com.github.dockerjava.api.exception.NotFoundException;
73
import org.junit.Rule;
84
import org.junit.Test;
95
import org.rnorth.visibleassertions.VisibleAssertions;
106
import org.testcontainers.DockerClientFactory.DiskSpaceUsage;
117
import org.testcontainers.dockerclient.LogToStringContainerCallback;
12-
import org.testcontainers.images.LocalImagesCacheAccessor;
138
import org.testcontainers.utility.DockerImageName;
149
import org.testcontainers.utility.MockTestcontainersConfigurationRule;
1510

11+
import static org.assertj.core.api.Assertions.assertThat;
12+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
13+
1614
/**
1715
* Test for {@link DockerClientFactory}.
1816
*/
@@ -23,30 +21,22 @@ public class DockerClientFactoryTest {
2321

2422
@Test
2523
public void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() {
24+
try (DockerRegistryContainer registryContainer = new DockerRegistryContainer()) {
25+
registryContainer.start();
26+
DockerImageName imageName = registryContainer.createImage();
2627

27-
final DockerClientFactory dockFactory = DockerClientFactory.instance();
28+
DockerClientFactory dockFactory = DockerClientFactory.instance();
2829

29-
DockerImageName imageName = DockerImageName.parse("testcontainers/helloworld:1.1.0");
30-
31-
try {
32-
//remove tiny image, so it will be pulled during next command run
33-
dockFactory.client()
34-
.removeImageCmd(imageName.asCanonicalNameString())
35-
.withForce(true).exec();
36-
} catch (NotFoundException ignored) {
37-
// Do not fail if it's not pulled yet
38-
}
39-
LocalImagesCacheAccessor.clearCache();
40-
41-
dockFactory.runInsideDocker(
30+
dockFactory.runInsideDocker(
4231
imageName,
4332
cmd -> cmd.withCmd("sh", "-c", "echo 'SUCCESS'"),
4433
(client, id) ->
45-
client.logContainerCmd(id)
46-
.withStdOut(true)
47-
.exec(new LogToStringContainerCallback())
48-
.toString()
49-
);
34+
client.logContainerCmd(id)
35+
.withStdOut(true)
36+
.exec(new LogToStringContainerCallback())
37+
.toString()
38+
);
39+
}
5040
}
5141

5242
@Test

core/src/test/java/org/testcontainers/DockerRegistryContainer.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package org.testcontainers;
22

3+
import com.github.dockerjava.api.DockerClient;
4+
import com.github.dockerjava.api.async.ResultCallback;
35
import com.github.dockerjava.api.command.InspectContainerResponse;
6+
import com.github.dockerjava.api.command.PullImageResultCallback;
47
import lombok.Getter;
58
import lombok.NonNull;
69
import lombok.SneakyThrows;
710
import org.testcontainers.containers.GenericContainer;
811
import org.testcontainers.containers.output.FrameConsumerResultCallback;
912
import org.testcontainers.containers.output.OutputFrame;
1013
import org.testcontainers.containers.output.WaitingConsumer;
14+
import org.testcontainers.utility.Base58;
15+
import org.testcontainers.utility.DockerImageName;
1116

17+
import java.util.UUID;
1218
import java.util.concurrent.Future;
1319
import java.util.concurrent.TimeUnit;
1420
import java.util.concurrent.atomic.AtomicInteger;
@@ -65,4 +71,34 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) {
6571

6672
endpoint = getHost() + ":" + port.get();
6773
}
74+
75+
public DockerImageName createImage() {
76+
return createImage(UUID.randomUUID().toString());
77+
}
78+
79+
public DockerImageName createImage(String tag) {
80+
return createImage("testcontainers/helloworld:latest", tag);
81+
}
82+
83+
@SneakyThrows(InterruptedException.class)
84+
public DockerImageName createImage(String originalImage, String tag) {
85+
DockerClient client = getDockerClient();
86+
client.pullImageCmd(originalImage).exec(new PullImageResultCallback()).awaitCompletion();
87+
88+
String dummyImageId = client.inspectImageCmd(originalImage).exec().getId();
89+
90+
DockerImageName imageName = DockerImageName.parse(getEndpoint() + "/" + Base58.randomString(6).toLowerCase()).withTag(tag);
91+
92+
// push the image to the registry
93+
client.tagImageCmd(dummyImageId, imageName.asCanonicalNameString(), tag).exec();
94+
95+
client.pushImageCmd(imageName.asCanonicalNameString())
96+
.exec(new ResultCallback.Adapter<>())
97+
.awaitCompletion(1, TimeUnit.MINUTES);
98+
99+
// Remove from local cache, tests should pull the image themselves
100+
client.removeImageCmd(imageName.asCanonicalNameString()).exec();
101+
102+
return imageName;
103+
}
68104
}
Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,25 @@
11
package org.testcontainers.dockerclient;
22

3-
import com.github.dockerjava.api.DockerClient;
4-
import com.github.dockerjava.api.model.Image;
53
import org.junit.Test;
6-
import org.testcontainers.DockerClientFactory;
4+
import org.testcontainers.DockerRegistryContainer;
75
import org.testcontainers.containers.GenericContainer;
86
import org.testcontainers.utility.DockerImageName;
97

10-
import java.util.List;
11-
128
public class AmbiguousImagePullTest {
139

1410
@Test(timeout = 30_000)
1511
public void testNotUsingParse() {
16-
DockerClient client = DockerClientFactory.instance().client();
17-
List<Image> alpineImages = client.listImagesCmd()
18-
.withImageNameFilter("testcontainers/helloworld:latest")
19-
.exec();
20-
for (Image alpineImage : alpineImages) {
21-
client.removeImageCmd(alpineImage.getId()).exec();
22-
}
23-
24-
try (
25-
final GenericContainer<?> container = new GenericContainer<>(DockerImageName.parse("testcontainers/helloworld"))
26-
.withExposedPorts(8080)
27-
) {
28-
container.start();
29-
// do nothing other than start and stop
12+
try (DockerRegistryContainer registryContainer = new DockerRegistryContainer()) {
13+
registryContainer.start();
14+
DockerImageName imageName = registryContainer.createImage("latest");
15+
String imageNameWithoutTag = imageName.getRegistry() + "/" + imageName.getRepository();
16+
try (
17+
final GenericContainer<?> container = new GenericContainer<>(imageNameWithoutTag)
18+
.withExposedPorts(8080)
19+
) {
20+
container.start();
21+
// do nothing other than start and stop
22+
}
3023
}
3124
}
3225
}

core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
package org.testcontainers.images;
22

3-
import com.github.dockerjava.api.DockerClient;
4-
import com.github.dockerjava.api.async.ResultCallback;
5-
import com.github.dockerjava.api.command.PullImageResultCallback;
63
import com.github.dockerjava.api.exception.NotFoundException;
7-
import org.junit.AfterClass;
8-
import org.junit.Before;
9-
import org.junit.BeforeClass;
104
import org.junit.ClassRule;
115
import org.junit.Test;
126
import org.mockito.Mockito;
@@ -18,9 +12,6 @@
1812
import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy;
1913
import org.testcontainers.utility.DockerImageName;
2014

21-
import java.util.UUID;
22-
import java.util.concurrent.TimeUnit;
23-
2415
import static org.junit.Assert.fail;
2516
import static org.mockito.ArgumentMatchers.any;
2617

@@ -29,47 +20,13 @@ public class ImagePullPolicyTest {
2920
@ClassRule
3021
public static DockerRegistryContainer registry = new DockerRegistryContainer();
3122

32-
private static DockerImageName imageName;
33-
34-
@BeforeClass
35-
public static void beforeClass() throws Exception {
36-
String testRegistryAddress = registry.getEndpoint();
37-
String testImageName = testRegistryAddress + "/image-pull-policy-test";
38-
String tag = UUID.randomUUID().toString();
39-
imageName = DockerImageName.parse(testImageName).withTag(tag);
40-
41-
DockerClient client = DockerClientFactory.instance().client();
42-
String dummySourceImage = "hello-world:latest";
43-
client.pullImageCmd(dummySourceImage).exec(new PullImageResultCallback()).awaitCompletion();
44-
45-
String dummyImageId = client.inspectImageCmd(dummySourceImage).exec().getId();
46-
47-
// push the image to the registry
48-
client.tagImageCmd(dummyImageId, testImageName, tag).exec();
49-
50-
client.pushImageCmd(imageName.asCanonicalNameString())
51-
.exec(new ResultCallback.Adapter<>())
52-
.awaitCompletion(1, TimeUnit.MINUTES);
53-
}
54-
55-
@AfterClass
56-
public static void afterClass() {
57-
removeImage();
58-
}
59-
60-
@Before
61-
public void setUp() {
62-
// Clean up local cache
63-
removeImage();
64-
65-
LocalImagesCache.INSTANCE.cache.remove(imageName);
66-
}
23+
private final DockerImageName imageName = registry.createImage();
6724

6825
@Test
6926
public void pullsByDefault() {
7027
try (
7128
GenericContainer<?> container = new GenericContainer<>(imageName)
72-
.withStartupCheckStrategy(new OneShotStartupCheckStrategy())
29+
.withExposedPorts(8080)
7330
) {
7431
container.start();
7532
}
@@ -79,7 +36,7 @@ public void pullsByDefault() {
7936
public void shouldAlwaysPull() {
8037
try (
8138
GenericContainer<?> container = new GenericContainer<>(imageName)
82-
.withStartupCheckStrategy(new OneShotStartupCheckStrategy())
39+
.withExposedPorts(8080)
8340
) {
8441
container.start();
8542
}
@@ -88,7 +45,7 @@ public void shouldAlwaysPull() {
8845

8946
try (
9047
GenericContainer<?> container = new GenericContainer<>(imageName)
91-
.withStartupCheckStrategy(new OneShotStartupCheckStrategy())
48+
.withExposedPorts(8080)
9249
) {
9350
expectToFailWithNotFoundException(container);
9451
}
@@ -99,7 +56,7 @@ public void shouldAlwaysPull() {
9956
.withImagePullPolicy(PullPolicy.alwaysPull())
10057
// }
10158
) {
102-
container.withStartupCheckStrategy(new OneShotStartupCheckStrategy());
59+
container.withExposedPorts(8080);
10360
container.start();
10461
}
10562
}
@@ -117,7 +74,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma
11774
})
11875
// }
11976
) {
120-
container.withStartupCheckStrategy(new OneShotStartupCheckStrategy());
77+
container.withExposedPorts(8080);
12178
container.start();
12279
}
12380
}
@@ -133,7 +90,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma
13390
try (
13491
GenericContainer<?> container = new GenericContainer<>(imageName)
13592
.withImagePullPolicy(policy)
136-
.withStartupCheckStrategy(new OneShotStartupCheckStrategy())
93+
.withExposedPorts(8080)
13794
) {
13895
container.start();
13996

@@ -169,7 +126,7 @@ private void expectToFailWithNotFoundException(GenericContainer<?> container) {
169126
}
170127
}
171128

172-
private static void removeImage() {
129+
private void removeImage() {
173130
try {
174131
DockerClientFactory.instance().client()
175132
.removeImageCmd(imageName.asCanonicalNameString())

0 commit comments

Comments
 (0)