From 24dbee40ffd5de4225c3cbbbf3fea399a46d62d1 Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Thu, 11 Jul 2024 17:47:05 -0500 Subject: [PATCH] Add CDS test case to Paketo system tests Closes gh-41350 --- .../boot/image/paketo/PaketoBuilderTests.java | 39 +++++++++++++++++++ ...etoBuilderTests-classDataSharingApp.gradle | 36 +++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-classDataSharingApp.gradle diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/paketo/PaketoBuilderTests.java b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/paketo/PaketoBuilderTests.java index ff82c3c185f..b54a3dcd7b0 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/paketo/PaketoBuilderTests.java +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/paketo/PaketoBuilderTests.java @@ -336,6 +336,45 @@ class PaketoBuilderTests { } } + @Test + void classDataSharingApp() throws Exception { + writeMainClass(); + String imageName = "paketo-integration/" + this.gradleBuild.getProjectDir().getName(); + ImageReference imageReference = ImageReference.of(ImageName.of(imageName)); + BuildResult result = buildImage(imageName); + assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); + assertThat(result.getOutput()).contains("Running creator"); + try (GenericContainer container = new GenericContainer<>(imageName)) { + container.withExposedPorts(8080); + container.waitingFor(Wait.forHttp("/test")).start(); + ContainerConfig config = container.getContainerInfo().getConfig(); + assertLabelsMatchManifestAttributes(config); + ImageAssertions.assertThat(config).buildMetadata((metadata) -> { + metadata.buildpacks() + .contains("paketo-buildpacks/ca-certificates", "paketo-buildpacks/bellsoft-liberica", + "paketo-buildpacks/executable-jar", "paketo-buildpacks/dist-zip", + "paketo-buildpacks/spring-boot"); + metadata.processOfType("web") + .satisfiesExactly((command) -> assertThat(command).isEqualTo("java"), + (arg) -> assertThat(arg).isEqualTo("-cp"), + (arg) -> assertThat(arg).startsWith("runner.jar"), + (arg) -> assertThat(arg).isEqualTo("example.ExampleApplication")); + metadata.processOfType("spring-boot-app") + .satisfiesExactly((command) -> assertThat(command).isEqualTo("java"), + (arg) -> assertThat(arg).isEqualTo("-cp"), + (arg) -> assertThat(arg).startsWith("runner.jar"), + (arg) -> assertThat(arg).isEqualTo("example.ExampleApplication")); + metadata.processOfType("executable-jar") + .containsExactly("java", "org.springframework.boot.loader.launch.JarLauncher"); + }); + assertImageHasJvmSbomLayer(imageReference, config); + assertImageHasDependenciesSbomLayer(imageReference, config, "executable-jar"); + } + finally { + removeImage(imageReference); + } + } + private BuildResult buildImage(String imageName, String... arguments) { String[] buildImageArgs = { "bootBuildImage", "--imageName=" + imageName, "--pullPolicy=IF_NOT_PRESENT" }; String[] args = StringUtils.concatenateStringArrays(arguments, buildImageArgs); diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-classDataSharingApp.gradle b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-classDataSharingApp.gradle new file mode 100644 index 00000000000..2941dac9874 --- /dev/null +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/resources/org/springframework/boot/image/paketo/PaketoBuilderTests-classDataSharingApp.gradle @@ -0,0 +1,36 @@ +plugins { + id 'org.springframework.boot' version '{bootVersion}' + id 'io.spring.dependency-management' version '{dependencyManagementPluginVersion}' + id 'java' +} + +repositories { + exclusiveContent { + forRepository { + maven { url '{systemTestMavenRepository}' } + } + filter { + includeGroup "org.springframework.boot" + } + } + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } + maven { url 'https://repo.spring.io/snapshot' } +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web:{bootVersion}") +} + +bootJar { + manifest { + attributes( + 'Implementation-Version': '1.0.0', + 'Implementation-Title': "Paketo Test" + ) + } +} + +bootBuildImage { + environment = ['BP_JVM_CDS_ENABLED': 'true'] +} \ No newline at end of file