Skip to content

Commit 7674c97

Browse files
committed
WIP
1 parent 151bbc9 commit 7674c97

File tree

10 files changed

+383
-0
lines changed

10 files changed

+383
-0
lines changed

CONTRIBUTING.adoc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
= Contributing
2+
3+
You want to contribute to GitLab4J-API and don't know how to do it?
4+
We hope this page will help you to contribute to this project.
5+
6+
=== Create a new issue
7+
8+
=== Contribute code
9+
10+
==== Write and run tests
11+
12+
Since version 4.20.0, we use junit 5 and testcontainer for

pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,13 @@
446446
<version>${junit.version}</version>
447447
<scope>test</scope>
448448
</dependency>
449+
<dependency>
450+
<groupId>org.junit.platform</groupId>
451+
<artifactId>junit-platform-launcher</artifactId>
452+
<version>1.8.2</version>
453+
<scope>test</scope>
454+
</dependency>
455+
449456
<dependency>
450457
<groupId>org.mockito</groupId>
451458
<artifactId>mockito-core</artifactId>
@@ -464,6 +471,12 @@
464471
<version>${hamcrest.version}</version>
465472
<scope>test</scope>
466473
</dependency>
474+
<dependency>
475+
<groupId>org.testcontainers</groupId>
476+
<artifactId>junit-jupiter</artifactId>
477+
<version>1.16.3</version>
478+
<scope>test</scope>
479+
</dependency>
467480
<dependency>
468481
<groupId>uk.org.webcompere</groupId>
469482
<artifactId>system-stubs-jupiter</artifactId>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.gitlab4j.api;
2+
3+
import org.junit.jupiter.api.BeforeAll;
4+
5+
public abstract class AbstractIT {
6+
7+
8+
@BeforeAll
9+
public static void testSetup() {
10+
System.out.println("AbstractIT#testSetup");
11+
}
12+
13+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.gitlab4j.api;
2+
3+
import java.util.Arrays;
4+
5+
import org.testcontainers.containers.GenericContainer;
6+
import org.testcontainers.utility.DockerImageName;
7+
8+
/**
9+
* Container definition for testing purpose.
10+
* @author jabberwock
11+
*/
12+
public class GitLabContainer extends GenericContainer<GitLabContainer> {
13+
14+
private static final String IMAGE_NAME = "gitlab/gitlab-ce";
15+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse(IMAGE_NAME);
16+
17+
private int port = 80;
18+
private String version;
19+
20+
public GitLabContainer(final String version) {
21+
this(DockerImageName.parse(IMAGE_NAME + ":" + version));
22+
this.version = version;
23+
}
24+
25+
private GitLabContainer(final DockerImageName dockerImageName) {
26+
super(dockerImageName);
27+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
28+
withEnv("GITLAB_OMNIBUS_CONFIG", "gitlab_rails['initial_root_password']=\"password\";gitlab_rails['lfs_enabled']=false;");
29+
}
30+
31+
public GitLabContainer withGitLabPort(int port) {
32+
setPortBindings(Arrays.asList(String.valueOf(port) + ":80"));
33+
withExposedPorts(port);
34+
this.port = port;
35+
return this;
36+
}
37+
38+
public int getPort() {
39+
return port;
40+
}
41+
42+
public String getVersion() {
43+
return version;
44+
}
45+
46+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package org.gitlab4j.api;
2+
3+
import java.time.Duration;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Properties;
10+
import java.util.stream.Collectors;
11+
12+
import org.junit.platform.launcher.LauncherSession;
13+
import org.junit.platform.launcher.LauncherSessionListener;
14+
import org.testcontainers.containers.wait.strategy.Wait;
15+
16+
public class GitLabContainersSetupTeardownListener implements LauncherSessionListener {
17+
18+
private static final List<String> GITLAB_TESTED_VERSIONS = Arrays.asList("12.9.2-ce.0", "13.0.14-ce.0",
19+
"13.12.15-ce.0");
20+
private static final Map<String, GitLabContainer> gitLabContainers = new HashMap<>();
21+
22+
@Override
23+
public void launcherSessionOpened(LauncherSession session) {
24+
if (gitLabContainers.isEmpty()) {
25+
26+
List<String> gitLabVersions = new ArrayList<>();
27+
28+
String gitLabVersionsFromProperties = System.getenv("GITLAB4JAPI_GITLAB_VERSIONS");
29+
30+
if (gitLabVersionsFromProperties != null && !gitLabVersionsFromProperties.isEmpty()) {
31+
gitLabVersions.addAll(Arrays.stream(gitLabVersionsFromProperties.split(","))
32+
.filter(s -> s != null && !s.isEmpty())
33+
.collect(Collectors.toList()));
34+
} else {
35+
gitLabVersions.addAll(GITLAB_TESTED_VERSIONS);
36+
}
37+
38+
gitLabVersions.forEach(version -> {
39+
Version parsedVersion = new Version(version);
40+
int port = parsedVersion.getPort();
41+
42+
GitLabContainer container = new GitLabContainer(version)
43+
.withGitLabPort(port)
44+
.waitingFor(Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(300)));
45+
46+
System.out.println("GitLab container version " + container.getVersion()
47+
+ " started on http://localhost:" + container.getPort() + "/");
48+
49+
gitLabContainers.put(version, container);
50+
});
51+
}
52+
}
53+
54+
@Override
55+
public void launcherSessionClosed(LauncherSession session) {
56+
gitLabContainers.values().forEach(container -> {
57+
container.stop();
58+
System.out.println("GitLab container version " + container.getVersion() + " stopped");
59+
});
60+
61+
}
62+
63+
class Version {
64+
private Integer major;
65+
private Integer minor;
66+
private String fix;
67+
private Integer build;
68+
69+
public Version(String version) {
70+
String[] splittedVersion = version.split("\\.");
71+
this.major = Integer.valueOf(splittedVersion[0]);
72+
this.minor = Integer.valueOf(splittedVersion[1]);
73+
this.fix = splittedVersion[2];
74+
this.build = Integer.valueOf(splittedVersion[3]);
75+
}
76+
77+
public int getMajor() {
78+
return major;
79+
}
80+
81+
public int getMinor() {
82+
return minor;
83+
}
84+
85+
public String getFix() {
86+
return fix;
87+
}
88+
89+
public int getBuild() {
90+
return build;
91+
}
92+
93+
int getPort() {
94+
String port = "8" + major.toString() + String.format("%02d", minor);
95+
return Integer.valueOf(port);
96+
}
97+
}
98+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.gitlab4j.api;
2+
3+
import static java.util.Arrays.asList;
4+
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.stream.Stream;
10+
11+
import org.junit.jupiter.api.extension.AfterAllCallback;
12+
import org.junit.jupiter.api.extension.BeforeEachCallback;
13+
import org.junit.jupiter.api.extension.Extension;
14+
import org.junit.jupiter.api.extension.ExtensionContext;
15+
import org.junit.jupiter.api.extension.ParameterContext;
16+
import org.junit.jupiter.api.extension.ParameterResolver;
17+
import org.junit.jupiter.api.extension.TestTemplateInvocationContext;
18+
import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider;
19+
import org.testcontainers.containers.GenericContainer;
20+
import org.testcontainers.containers.wait.strategy.Wait;
21+
import org.testcontainers.utility.DockerImageName;
22+
23+
public class GitLabInvocationContextProvider implements TestTemplateInvocationContextProvider {
24+
25+
private static final List<String> GITLAB_TESTED_VERSIONS = Arrays.asList("12.9.2-ce.0");
26+
27+
private final Map<String, GitLabContainer> gitLabContainers;
28+
29+
public GitLabInvocationContextProvider() {
30+
gitLabContainers = new HashMap<>();
31+
GITLAB_TESTED_VERSIONS.forEach(version -> {
32+
33+
GitLabContainer container = new GitLabContainer(version)
34+
.withGitLabPort(8090)
35+
.waitingFor(Wait.forHttp("/")
36+
.forStatusCode(200));
37+
38+
gitLabContainers.put(version, container);
39+
});
40+
}
41+
42+
@Override
43+
public boolean supportsTestTemplate(ExtensionContext context) {
44+
return true;
45+
}
46+
47+
@Override
48+
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
49+
return gitLabContainers.keySet().stream().map(this::invocationContext);
50+
}
51+
52+
private TestTemplateInvocationContext invocationContext(final String gitLabVersion) {
53+
return new TestTemplateInvocationContext() {
54+
55+
@Override
56+
public String getDisplayName(int invocationIndex) {
57+
return gitLabVersion;
58+
}
59+
60+
@Override
61+
public List<Extension> getAdditionalExtensions() {
62+
final GenericContainer<?> gitLabContainer = gitLabContainers.get(gitLabVersion);
63+
return asList(
64+
(BeforeEachCallback) context -> {
65+
System.out.println("Start container: " + System.currentTimeMillis() );
66+
gitLabContainer.start();
67+
System.out.println("Container started: " + System.currentTimeMillis() );
68+
},
69+
(AfterAllCallback) context -> gitLabContainer.stop(),
70+
new ParameterResolver() {
71+
@Override
72+
public boolean supportsParameter(ParameterContext parameterCtx, ExtensionContext extensionCtx) {
73+
return parameterCtx.getParameter().getType().equals(GenericContainer.class);
74+
}
75+
76+
@Override
77+
public Object resolveParameter(ParameterContext parameterCtx, ExtensionContext extensionCtx) {
78+
return gitLabContainer;
79+
}
80+
});
81+
}
82+
};
83+
}
84+
85+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package org.gitlab4j.api;
2+
3+
import java.time.Duration;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import org.junit.jupiter.api.extension.BeforeAllCallback;
10+
import org.junit.jupiter.api.extension.ExtensionContext;
11+
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
12+
import org.junit.jupiter.api.extension.ExtensionContext.Store;
13+
import org.testcontainers.containers.wait.strategy.Wait;
14+
import org.testcontainers.utility.DockerImageName;
15+
16+
public class GitLabTestContainersExtension implements BeforeAllCallback {
17+
18+
private static final List<String> GITLAB_TESTED_VERSIONS = Arrays.asList("12.9.2-ce.0", "13.0.14-ce.0");
19+
private static final Map<String, GitLabContainer> gitLabContainers = new HashMap<>();
20+
21+
@Override
22+
public void beforeAll(ExtensionContext context) throws Exception {
23+
GITLAB_TESTED_VERSIONS.forEach(version -> {
24+
Version parsedVersion = new Version(version);
25+
int port = parsedVersion.getPort();
26+
27+
GitLabContainer container = new GitLabContainer(version)
28+
.withGitLabPort(port)
29+
.waitingFor(Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(300)));
30+
31+
System.out.println("Starting GitLab container version " + version + " on http://localhost:" + port);
32+
container.start();
33+
System.out.println("GitLab container version " + version + " started on http://localhost:" + port);
34+
35+
gitLabContainers.put(version, container);
36+
});
37+
38+
getStore(context).put("gitLabContainers", gitLabContainers);
39+
}
40+
41+
class Version {
42+
private Integer major;
43+
private Integer minor;
44+
private String fix;
45+
private Integer build;
46+
47+
public Version(String version) {
48+
String[] splittedVersion = version.split("\\.");
49+
this.major = Integer.valueOf(splittedVersion[0]);
50+
this.minor = Integer.valueOf(splittedVersion[1]);
51+
this.fix = splittedVersion[2];
52+
this.build = Integer.valueOf(splittedVersion[3]);
53+
}
54+
55+
public int getMajor() {
56+
return major;
57+
}
58+
59+
public int getMinor() {
60+
return minor;
61+
}
62+
63+
public String getFix() {
64+
return fix;
65+
}
66+
67+
public int getBuild() {
68+
return build;
69+
}
70+
71+
int getPort() {
72+
String port = "8" + major.toString() + minor.toString();
73+
return Integer.valueOf(port);
74+
}
75+
}
76+
77+
private Store getStore(ExtensionContext context) {
78+
return context.getStore(Namespace.create(getClass(), context.getRequiredTestMethod()));
79+
}
80+
81+
82+
}

src/test/java/org/gitlab4j/api/TestAccessToken.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*
2424
*/
2525
@Tag("integration")
26+
@ExtendWith(GitLabInvocationContextProvider.class)
2627
@ExtendWith(SetupIntegrationTestExtension.class)
2728
public class TestAccessToken extends AbstractIntegrationTest {
2829

0 commit comments

Comments
 (0)