Skip to content

Commit e417623

Browse files
committed
test: refactored layered jar tests, no mocks required
Signed-off-by: Marc Nuri <marc@marcnuri.com>
1 parent 1636d4b commit e417623

File tree

10 files changed

+409
-428
lines changed

10 files changed

+409
-428
lines changed

gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,6 @@ public File resolveDefaultOpenShiftResourceDir() {
8686
return resolveFile("build", "classes", "java", "main", "META-INF", "jkube", "openshift");
8787
}
8888

89-
public File resolveDefaultDockerfile(String imageNamespace, String imageName, String imageTag) {
90-
return resolveFile("build", "docker", imageNamespace, imageName, imageTag, "build", "Dockerfile");
91-
}
92-
9389
public BuildResult build() {
9490
return gradleRunner.build();
9591
}

gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootIT.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package org.eclipse.jkube.gradle.plugin.tests;
1515

16+
import java.io.File;
1617
import java.io.IOException;
1718
import java.nio.file.Files;
1819

@@ -27,7 +28,30 @@
2728

2829
class SpringBootIT {
2930
@RegisterExtension
30-
private final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension();
31+
protected final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension();
32+
33+
@Test
34+
void k8sBuild_whenRunWithJibBuildStrategy_generatesLayeredImage() throws IOException {
35+
// When
36+
final BuildResult result = gradleRunner.withITProject("spring-boot")
37+
.withArguments("clean", "build", "k8sBuild", "-Pjkube.build.strategy=jib", "--stacktrace")
38+
.build();
39+
// Then
40+
final File dockerFile = gradleRunner.resolveFile("build", "docker", "gradle", "spring-boot", "latest", "build", "Dockerfile");
41+
assertThat(new String(Files.readAllBytes(dockerFile.toPath())))
42+
.contains("FROM quay.io/jkube/jkube-java:")
43+
.contains("ENV JAVA_MAIN_CLASS=org.springframework.boot.loader.JarLauncher JAVA_APP_DIR=/deployments")
44+
.contains("EXPOSE 8080 8778 9779")
45+
.contains("COPY /dependencies/deployments /deployments/")
46+
.contains("COPY /spring-boot-loader/deployments /deployments/")
47+
.contains("COPY /application/deployments /deployments/")
48+
.contains("WORKDIR /deployments")
49+
.contains("ENTRYPOINT [\"java\",\"org.springframework.boot.loader.JarLauncher\"]");
50+
assertThat(result).extracting(BuildResult::getOutput).asString()
51+
.contains("Running generator spring-boot")
52+
.contains("Spring Boot layered jar detected")
53+
.contains("JIB image build started");
54+
}
3155

3256
@Test
3357
void k8sResource_whenRun_generatesK8sManifests() throws IOException, ParseException {
@@ -68,25 +92,4 @@ void ocResource_whenRun_generatesOpenShiftManifests() throws IOException, ParseE
6892
.contains("jkube-revision-history: Adding revision history limit to 2");
6993
}
7094

71-
@Test
72-
void k8sBuild_whenRunWithJibBuildStrategy_generatesLayeredImage() throws IOException {
73-
// When
74-
final BuildResult result = gradleRunner.withITProject("spring-boot")
75-
.withArguments("clean", "build", "k8sBuild", "-Pjkube.build.strategy=jib", "--stacktrace")
76-
.build();
77-
// Then
78-
String generatedDockerfileContent = new String(Files.readAllBytes(gradleRunner.resolveDefaultDockerfile( "gradle", "spring-boot", "latest").toPath()));
79-
assertThat(generatedDockerfileContent)
80-
.contains("FROM quay.io/jkube/jkube-java:")
81-
.contains("ENV JAVA_MAIN_CLASS=org.springframework.boot.loader.JarLauncher JAVA_APP_DIR=/deployments")
82-
.contains("EXPOSE 8080 8778 9779")
83-
.contains("COPY /dependencies/deployments /deployments/")
84-
.contains("COPY /spring-boot-loader/deployments /deployments/")
85-
.contains("COPY /application/deployments /deployments/")
86-
.contains("WORKDIR /deployments")
87-
.contains("ENTRYPOINT [\"java\",\"org.springframework.boot.loader.JarLauncher\"]");
88-
assertThat(result).extracting(BuildResult::getOutput).asString()
89-
.contains("Running generator spring-boot")
90-
.contains("Spring Boot layered jar detected");
91-
}
9295
}

jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/ExternalCommand.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
/**
3434
* @author roland
35-
* @since 14/09/16
3635
*/
3736
public abstract class ExternalCommand {
3837
protected final KitLogger log;
Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package org.eclipse.jkube.springboot;
1515

16+
import lombok.Getter;
1617
import org.eclipse.jkube.kit.common.ExternalCommand;
1718
import org.eclipse.jkube.kit.common.KitLogger;
1819

@@ -21,11 +22,18 @@
2122
import java.util.ArrayList;
2223
import java.util.List;
2324

24-
public class SpringBootLayeredJarExecUtils {
25-
private SpringBootLayeredJarExecUtils() { }
25+
public class SpringBootLayeredJar {
2626

27-
public static List<String> listLayers(KitLogger kitLogger, File layeredJar) {
28-
LayerListCommand layerListCommand = new LayerListCommand(kitLogger, layeredJar);
27+
private final File layeredJar;
28+
private final KitLogger kitLogger;
29+
30+
public SpringBootLayeredJar(File layeredJar, KitLogger kitLogger) {
31+
this.layeredJar = layeredJar;
32+
this.kitLogger = kitLogger;
33+
}
34+
35+
public List<String> listLayers() {
36+
final LayerListCommand layerListCommand = new LayerListCommand(kitLogger, layeredJar);
2937
try {
3038
layerListCommand.execute();
3139
return layerListCommand.getLayers();
@@ -34,10 +42,9 @@ public static List<String> listLayers(KitLogger kitLogger, File layeredJar) {
3442
}
3543
}
3644

37-
public static void extractLayers(KitLogger kitLogger, File extractionDir, File layeredJar) {
38-
LayerExtractorCommand layerExtractorCommand = new LayerExtractorCommand(kitLogger, extractionDir, layeredJar);
45+
public void extractLayers(File extractionDir) {
3946
try {
40-
layerExtractorCommand.execute();
47+
new LayerExtractorCommand(kitLogger, extractionDir, layeredJar).execute();
4148
} catch (IOException ioException) {
4249
throw new IllegalStateException("Failure in extracting spring boot jar layers", ioException);
4350
}
@@ -57,12 +64,14 @@ protected String[] getArgs() {
5764
}
5865

5966
private static class LayerListCommand extends ExternalCommand {
60-
private final List<String> layers;
6167
private final File layeredJar;
68+
@Getter
69+
private final List<String> layers;
70+
6271
protected LayerListCommand(KitLogger log, File layeredJar) {
6372
super(log);
64-
layers = new ArrayList<>();
6573
this.layeredJar = layeredJar;
74+
layers = new ArrayList<>();
6675
}
6776

6877
@Override
@@ -75,8 +84,5 @@ protected void processLine(String line) {
7584
layers.add(line);
7685
}
7786

78-
public List<String> getLayers() {
79-
return layers;
80-
}
8187
}
8288
}

jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/generator/LayeredJarGenerator.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515

1616
import org.eclipse.jkube.generator.api.GeneratorConfig;
1717
import org.eclipse.jkube.generator.api.GeneratorContext;
18-
import org.eclipse.jkube.generator.javaexec.FatJarDetector;
1918
import org.eclipse.jkube.kit.common.Arguments;
2019
import org.eclipse.jkube.kit.common.Assembly;
2120
import org.eclipse.jkube.kit.common.AssemblyConfiguration;
2221
import org.eclipse.jkube.kit.common.AssemblyFileSet;
22+
import org.eclipse.jkube.springboot.SpringBootLayeredJar;
2323

2424
import java.io.File;
2525
import java.util.ArrayList;
@@ -29,38 +29,37 @@
2929
import java.util.Map;
3030

3131
import static org.eclipse.jkube.kit.common.util.FileUtil.getRelativePath;
32-
import static org.eclipse.jkube.springboot.SpringBootLayeredJarExecUtils.extractLayers;
33-
import static org.eclipse.jkube.springboot.SpringBootLayeredJarExecUtils.listLayers;
3432

3533
public class LayeredJarGenerator extends AbstractSpringBootNestedGenerator {
36-
private final FatJarDetector.Result fatJarDetectorResult;
37-
public LayeredJarGenerator(GeneratorContext generatorContext, GeneratorConfig generatorConfig, FatJarDetector.Result result) {
34+
35+
private static final String MAIN_CLASS = "org.springframework.boot.loader.JarLauncher";
36+
private final SpringBootLayeredJar springBootLayeredJar;
37+
38+
public LayeredJarGenerator(GeneratorContext generatorContext, GeneratorConfig generatorConfig, File layeredJar) {
3839
super(generatorContext, generatorConfig);
39-
fatJarDetectorResult = result;
40+
springBootLayeredJar = new SpringBootLayeredJar(layeredJar, getLogger());
4041
}
4142

4243
@Override
4344
public Arguments getBuildEntryPoint() {
4445
return Arguments.builder()
45-
.exec(Arrays.asList("java", "org.springframework.boot.loader.JarLauncher"))
46+
.exec(Arrays.asList("java", MAIN_CLASS))
4647
.build();
4748
}
4849

4950
@Override
5051
public Map<String, String> getEnv() {
51-
return Collections.singletonMap("JAVA_MAIN_CLASS", "org.springframework.boot.loader.JarLauncher");
52+
return Collections.singletonMap("JAVA_MAIN_CLASS", MAIN_CLASS);
5253
}
5354

5455
@Override
5556
public AssemblyConfiguration createAssemblyConfiguration(List<AssemblyFileSet> defaultFileSets) {
5657
getLogger().info("Spring Boot layered jar detected");
57-
58-
List<String> layerNames = listLayers(getLogger(), fatJarDetectorResult.getArchiveFile());
59-
List<Assembly> layerAssemblies = new ArrayList<>();
58+
final List<Assembly> layerAssemblies = new ArrayList<>();
6059
layerAssemblies.add(Assembly.builder().id("jkube-includes").fileSets(defaultFileSets).build());
61-
extractLayers(getLogger(), getProject().getBuildPackageDirectory(), fatJarDetectorResult.getArchiveFile());
60+
springBootLayeredJar.extractLayers(getProject().getBuildPackageDirectory());
6261

63-
for (String springBootLayer : layerNames) {
62+
for (String springBootLayer : springBootLayeredJar.listLayers()) {
6463
File layerDir = new File(getProject().getBuildPackageDirectory(), springBootLayer);
6564
layerAssemblies.add(Assembly.builder()
6665
.id(springBootLayer)

jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/generator/SpringBootNestedGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ default Map<String, String> getEnv() {
6363
static SpringBootNestedGenerator from(GeneratorContext generatorContext, GeneratorConfig generatorConfig, FatJarDetector.Result fatJarDetectorResult) {
6464
if (fatJarDetectorResult != null && fatJarDetectorResult.getArchiveFile() != null &&
6565
isLayeredJar(fatJarDetectorResult.getArchiveFile())) {
66-
return new LayeredJarGenerator(generatorContext, generatorConfig, fatJarDetectorResult);
66+
return new LayeredJarGenerator(generatorContext, generatorConfig, fatJarDetectorResult.getArchiveFile());
6767
}
6868
return new FatJarGenerator(generatorContext, generatorConfig);
6969
}

jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/SpringBootLayeredJarExecUtilsTest.java

Lines changed: 0 additions & 57 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* Copyright (c) 2019 Red Hat, Inc.
3+
* This program and the accompanying materials are made
4+
* available under the terms of the Eclipse Public License 2.0
5+
* which is available at:
6+
*
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* Red Hat, Inc. - initial API and implementation
13+
*/
14+
package org.eclipse.jkube.springboot;
15+
16+
import org.eclipse.jkube.kit.common.KitLogger;
17+
import org.eclipse.jkube.kit.common.assertj.FileAssertions;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.DisplayName;
20+
import org.junit.jupiter.api.Nested;
21+
import org.junit.jupiter.api.Test;
22+
import org.junit.jupiter.api.io.TempDir;
23+
24+
import java.io.File;
25+
import java.io.IOException;
26+
import java.nio.file.Files;
27+
import java.util.List;
28+
import java.util.Objects;
29+
30+
import static org.assertj.core.api.Assertions.assertThat;
31+
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
32+
33+
class SpringBootLayeredJarTest {
34+
35+
@TempDir
36+
private File projectDir;
37+
38+
private SpringBootLayeredJar springBootLayeredJar;
39+
40+
@Nested
41+
@DisplayName("with invalid jar")
42+
class InvalidJar {
43+
@BeforeEach
44+
void setup() {
45+
springBootLayeredJar = new SpringBootLayeredJar(new File(projectDir, "invalid.jar"), new KitLogger.SilentLogger());
46+
}
47+
48+
@Test
49+
void listLayers_whenJarInvalid_thenThrowException() {
50+
assertThatIllegalStateException()
51+
.isThrownBy(() -> springBootLayeredJar.listLayers())
52+
.withMessage("Failure in getting spring boot jar layers information");
53+
}
54+
55+
@Test
56+
void extractLayers_whenJarInvalid_thenThrowException() {
57+
assertThatIllegalStateException()
58+
.isThrownBy(() -> springBootLayeredJar.extractLayers(projectDir))
59+
.withMessage("Failure in extracting spring boot jar layers");
60+
}
61+
}
62+
@Nested
63+
@DisplayName("with valid jar")
64+
class ValidJar {
65+
@BeforeEach
66+
void setup() throws IOException {
67+
final File layeredJar = new File(projectDir, "layered.jar");
68+
Files.copy(
69+
Objects.requireNonNull(SpringBootLayeredJarTest.class.getResourceAsStream("/generator-integration-test/layered-jar.jar")),
70+
new File(projectDir, "layered.jar").toPath()
71+
);
72+
springBootLayeredJar = new SpringBootLayeredJar(layeredJar, new KitLogger.SilentLogger());
73+
}
74+
75+
@Test
76+
void listLayers_whenJarInvalid_thenThrowException() {
77+
// When
78+
final List<String> result = springBootLayeredJar.listLayers();
79+
// Then
80+
assertThat(result)
81+
.containsExactly("dependencies", "spring-boot-loader", "snapshot-dependencies", "application");
82+
}
83+
84+
@Test
85+
void extractLayers_whenJarInvalid_thenThrowException() throws IOException {
86+
// Given
87+
final File extractionDir = Files.createDirectory(new File(projectDir, "extracted").toPath()).toFile();
88+
// When
89+
springBootLayeredJar.extractLayers(extractionDir);
90+
// Then
91+
FileAssertions.assertThat(extractionDir)
92+
.fileTree()
93+
.contains("dependencies", "spring-boot-loader", "snapshot-dependencies", "application");
94+
}
95+
}
96+
}

0 commit comments

Comments
 (0)