builder/build/cnb/lang_java_test.go
Rama main · réplica de lectura del repositorio original.
package cnb
import (
"os"
"path/filepath"
"testing"
"github.com/goodrain/rainbond/builder/build"
"github.com/goodrain/rainbond/builder/parser/code"
)
func TestJavaLanguageConfigAnnotationsAndProcfile(t *testing.T) {
dir := t.TempDir()
re := &build.Request{
Lang: code.JavaMaven,
BuildStrategy: "cnb",
SourceDir: dir,
BuildEnvs: map[string]string{
"BP_JVM_VERSION": "17",
"BP_JVM_TYPE": "JDK",
"BP_MAVEN_BUILD_ARGUMENTS": "clean package",
"BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS": "-DskipTests",
"BP_MAVEN_BUILT_MODULE": "service-a",
"BP_MAVEN_BUILT_ARTIFACT": "service-a/target/app.jar",
"BUILD_MAVEN_JAVA_OPTS": "-Xmx1024m",
"BUILD_PROCFILE": "web: java $JAVA_OPTS -jar target/app.jar",
},
}
if _, ok := getLanguageConfig(re).(*javaConfig); !ok {
t.Fatal("expected javaConfig for java build")
}
if err := validateSupportedBuildParams(re); err != nil {
t.Fatalf("validateSupportedBuildParams returned error: %v", err)
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-jvm-version"] != "17" {
t.Fatalf("expected cnb-bp-jvm-version=17, got %q", annotations["cnb-bp-jvm-version"])
}
if annotations["cnb-bp-jvm-type"] != "JDK" {
t.Fatalf("expected cnb-bp-jvm-type=JDK, got %q", annotations["cnb-bp-jvm-type"])
}
if annotations["cnb-bp-maven-build-arguments"] != "clean package" {
t.Fatalf("expected maven build arguments, got %q", annotations["cnb-bp-maven-build-arguments"])
}
if annotations["cnb-bp-maven-additional-build-arguments"] != "-DskipTests" {
t.Fatalf("expected maven additional build arguments, got %q", annotations["cnb-bp-maven-additional-build-arguments"])
}
if annotations["cnb-bp-maven-version"] != "3.9.14" {
t.Fatalf("expected fixed cnb-bp-maven-version=3.9.14, got %q", annotations["cnb-bp-maven-version"])
}
if annotations["cnb-bp-maven-built-module"] != "service-a" {
t.Fatalf("expected cnb-bp-maven-built-module=service-a, got %q", annotations["cnb-bp-maven-built-module"])
}
if annotations["cnb-bp-maven-built-artifact"] != "service-a/target/app.jar" {
t.Fatalf("expected cnb-bp-maven-built-artifact=service-a/target/app.jar, got %q", annotations["cnb-bp-maven-built-artifact"])
}
if annotations["rainbond.io/cnb-language"] != "java" {
t.Fatalf("expected java debug annotation, got %q", annotations["rainbond.io/cnb-language"])
}
if annotations["rainbond.io/cnb-start-command-source"] != "procfile" {
t.Fatalf("expected procfile source annotation, got %q", annotations["rainbond.io/cnb-start-command-source"])
}
if err := getLanguageConfig(re).InjectMirrorConfig(re); err != nil {
t.Fatalf("InjectMirrorConfig returned error: %v", err)
}
if _, err := os.Stat(filepath.Join(dir, "Procfile")); !os.IsNotExist(err) {
t.Fatalf("expected CNB java config to avoid writing source Procfile, got err=%v", err)
}
envs := (&Builder{}).buildEnvVars(re)
wantEnv := map[string]string{
"BP_MAVEN_BUILD_ARGUMENTS": "clean package",
"BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS": "-DskipTests",
"BP_MAVEN_BUILT_MODULE": "service-a",
"BP_MAVEN_BUILT_ARTIFACT": "service-a/target/app.jar",
"MAVEN_OPTS": "-Xmx1024m -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8",
}
found := map[string]bool{}
for _, env := range envs {
if wantValue, ok := wantEnv[env.Name]; ok {
found[env.Name] = true
if env.Value != wantValue {
t.Fatalf("expected %s=%q, got %q", env.Name, wantValue, env.Value)
}
}
}
for name := range wantEnv {
if !found[name] {
t.Fatalf("expected %s env var for java cnb build", name)
}
}
}
func TestJavaCNBBuildEnvUsesUTF8Locale(t *testing.T) {
re := &build.Request{
Lang: code.JavaMaven,
SourceDir: t.TempDir(),
BuildEnvs: map[string]string{},
}
envs := (&Builder{}).buildEnvVars(re)
found := map[string]string{}
for _, env := range envs {
found[env.Name] = env.Value
}
if got := found["LANG"]; got != "C.UTF-8" {
t.Fatalf("expected LANG=C.UTF-8 for CNB java builds, got %q", got)
}
if got := found["LC_ALL"]; got != "C.UTF-8" {
t.Fatalf("expected LC_ALL=C.UTF-8 for CNB java builds, got %q", got)
}
}
func TestJavaLanguageConfigPrefersBPFieldsOverLegacyBuildFields(t *testing.T) {
re := &build.Request{
Lang: code.JavaMaven,
SourceDir: t.TempDir(),
BuildEnvs: map[string]string{
"BP_JVM_VERSION": "21",
"BUILD_RUNTIMES": "17",
"BP_MAVEN_BUILD_ARGUMENTS": "verify",
"BUILD_MAVEN_CUSTOM_GOALS": "clean package",
"BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS": "-Pprod",
"BUILD_MAVEN_CUSTOM_OPTS": "-DskipTests",
"BP_MAVEN_BUILT_MODULE": "bp-module",
"BUILD_MAVEN_BUILT_MODULE": "legacy-module",
"BP_MAVEN_BUILT_ARTIFACT": "bp-module/target/app.jar",
"BUILD_MAVEN_BUILT_ARTIFACT": "legacy-module/target/app.jar",
},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-jvm-version"] != "21" {
t.Fatalf("expected BP_JVM_VERSION to win, got %q", annotations["cnb-bp-jvm-version"])
}
if annotations["cnb-bp-maven-build-arguments"] != "verify" {
t.Fatalf("expected BP_MAVEN_BUILD_ARGUMENTS to win, got %q", annotations["cnb-bp-maven-build-arguments"])
}
if annotations["cnb-bp-maven-additional-build-arguments"] != "-Pprod" {
t.Fatalf("expected BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS to win, got %q", annotations["cnb-bp-maven-additional-build-arguments"])
}
if annotations["cnb-bp-maven-built-module"] != "bp-module" {
t.Fatalf("expected BP_MAVEN_BUILT_MODULE to win, got %q", annotations["cnb-bp-maven-built-module"])
}
if annotations["cnb-bp-maven-built-artifact"] != "bp-module/target/app.jar" {
t.Fatalf("expected BP_MAVEN_BUILT_ARTIFACT to win, got %q", annotations["cnb-bp-maven-built-artifact"])
}
envs := (&Builder{}).buildEnvVars(re)
wantEnv := map[string]string{
"BP_MAVEN_BUILD_ARGUMENTS": "verify",
"BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS": "-Pprod",
"BP_MAVEN_BUILT_MODULE": "bp-module",
"BP_MAVEN_BUILT_ARTIFACT": "bp-module/target/app.jar",
"MAVEN_OPTS": "-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8",
}
found := map[string]string{}
for _, env := range envs {
found[env.Name] = env.Value
}
for name, want := range wantEnv {
if got := found[name]; got != want {
t.Fatalf("expected %s=%q, got %q", name, want, got)
}
}
}
func TestGradleLanguageConfigPrefersBPFieldsOverLegacyBuildFields(t *testing.T) {
re := &build.Request{
Lang: code.Gradle,
SourceDir: t.TempDir(),
BuildEnvs: map[string]string{
"BP_JVM_VERSION": "21",
"BUILD_RUNTIMES": "17",
"BP_GRADLE_BUILD_ARGUMENTS": "assemble",
"BUILD_GRADLE_BUILD_ARGUMENTS": "build",
"BP_GRADLE_ADDITIONAL_BUILD_ARGUMENTS": "--info",
"BUILD_GRADLE_ADDITIONAL_BUILD_ARGUMENTS": "--stacktrace",
"BP_GRADLE_BUILT_MODULE": "bp-service",
"BUILD_GRADLE_BUILT_MODULE": "legacy-service",
"BP_GRADLE_BUILT_ARTIFACT": "bp-service/build/libs/app.jar",
"BUILD_GRADLE_BUILT_ARTIFACT": "legacy-service/build/libs/app.jar",
},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-jvm-version"] != "21" {
t.Fatalf("expected BP_JVM_VERSION to win, got %q", annotations["cnb-bp-jvm-version"])
}
if annotations["cnb-bp-gradle-build-arguments"] != "assemble" {
t.Fatalf("expected BP_GRADLE_BUILD_ARGUMENTS to win, got %q", annotations["cnb-bp-gradle-build-arguments"])
}
if annotations["cnb-bp-gradle-additional-build-arguments"] != "--info" {
t.Fatalf("expected BP_GRADLE_ADDITIONAL_BUILD_ARGUMENTS to win, got %q", annotations["cnb-bp-gradle-additional-build-arguments"])
}
if annotations["cnb-bp-gradle-built-module"] != "bp-service" {
t.Fatalf("expected BP_GRADLE_BUILT_MODULE to win, got %q", annotations["cnb-bp-gradle-built-module"])
}
if annotations["cnb-bp-gradle-built-artifact"] != "bp-service/build/libs/app.jar" {
t.Fatalf("expected BP_GRADLE_BUILT_ARTIFACT to win, got %q", annotations["cnb-bp-gradle-built-artifact"])
}
}
func TestJavaJarLanguageConfigExposesExecutableJarLocation(t *testing.T) {
re := &build.Request{
Lang: code.JavaJar,
SourceDir: t.TempDir(),
BuildEnvs: map[string]string{
"BP_EXECUTABLE_JAR_LOCATION": "target/app.jar",
},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-executable-jar-location"] != "target/app.jar" {
t.Fatalf("expected executable jar location annotation, got %q", annotations["cnb-bp-executable-jar-location"])
}
}
func TestJavaLanguageConfigAutoDetectsUniqueMavenModule(t *testing.T) {
root := t.TempDir()
writeFile := func(dir, content string) {
t.Helper()
if err := os.MkdirAll(dir, 0755); err != nil {
t.Fatalf("mkdir %s: %v", dir, err)
}
if err := os.WriteFile(filepath.Join(dir, "pom.xml"), []byte(content), 0644); err != nil {
t.Fatalf("write pom.xml in %s: %v", dir, err)
}
}
writeFile(root, `<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>root</artifactId>
<packaging>pom</packaging>
<modules>
<module>service-a</module>
</modules>
</project>`)
writeFile(filepath.Join(root, "service-a"), `<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>service-a</artifactId>
<packaging>jar</packaging>
</project>`)
re := &build.Request{
Lang: code.JavaMaven,
SourceDir: root,
BuildEnvs: map[string]string{},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-maven-built-module"] != "service-a" {
t.Fatalf("expected unique maven module service-a, got %q", annotations["cnb-bp-maven-built-module"])
}
if artifact := annotations["cnb-bp-maven-built-artifact"]; artifact != "" {
t.Fatalf("expected Maven auto-detection not to set a built artifact, got %q", artifact)
}
}
func TestJavaLanguageConfigSkipsAmbiguousMavenModules(t *testing.T) {
root := t.TempDir()
writeFile := func(dir, content string) {
t.Helper()
if err := os.MkdirAll(dir, 0755); err != nil {
t.Fatalf("mkdir %s: %v", dir, err)
}
if err := os.WriteFile(filepath.Join(dir, "pom.xml"), []byte(content), 0644); err != nil {
t.Fatalf("write pom.xml in %s: %v", dir, err)
}
}
writeFile(root, `<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>root</artifactId>
<packaging>pom</packaging>
<modules>
<module>service-a</module>
<module>service-b</module>
</modules>
</project>`)
writeFile(filepath.Join(root, "service-a"), `<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>service-a</artifactId><packaging>jar</packaging></project>`)
writeFile(filepath.Join(root, "service-b"), `<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>service-b</artifactId><packaging>jar</packaging></project>`)
re := &build.Request{
Lang: code.JavaMaven,
SourceDir: root,
BuildEnvs: map[string]string{},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-maven-built-module"] != "" {
t.Fatalf("expected ambiguous modules to skip auto-detect, got %q", annotations["cnb-bp-maven-built-module"])
}
if annotations["cnb-bp-maven-built-artifact"] != "" {
t.Fatalf("expected ambiguous artifacts to skip auto-detect, got %q", annotations["cnb-bp-maven-built-artifact"])
}
}
func TestJavaLanguageConfigDerivesModuleFromBuiltArtifact(t *testing.T) {
re := &build.Request{
Lang: code.JavaMaven,
SourceDir: t.TempDir(),
BuildEnvs: map[string]string{
"BUILD_MAVEN_BUILT_ARTIFACT": "ruoyi-admin/target/ruoyi-admin.jar",
},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-maven-built-module"] != "ruoyi-admin" {
t.Fatalf("expected derived maven module ruoyi-admin, got %q", annotations["cnb-bp-maven-built-module"])
}
if annotations["cnb-bp-maven-built-artifact"] != "ruoyi-admin/target/ruoyi-admin.jar" {
t.Fatalf("expected built artifact annotation to remain set, got %q", annotations["cnb-bp-maven-built-artifact"])
}
envs := (&Builder{}).buildEnvVars(re)
found := map[string]string{}
for _, env := range envs {
found[env.Name] = env.Value
}
if found["BP_MAVEN_BUILT_MODULE"] != "ruoyi-admin" {
t.Fatalf("expected derived BP_MAVEN_BUILT_MODULE ruoyi-admin, got %q", found["BP_MAVEN_BUILT_MODULE"])
}
if found["BP_MAVEN_BUILT_ARTIFACT"] != "ruoyi-admin/target/ruoyi-admin.jar" {
t.Fatalf("expected BP_MAVEN_BUILT_ARTIFACT to remain set, got %q", found["BP_MAVEN_BUILT_ARTIFACT"])
}
}
func TestGradleLanguageConfigAnnotations(t *testing.T) {
re := &build.Request{
Lang: code.Gradle,
SourceDir: t.TempDir(),
BuildEnvs: map[string]string{
"BUILD_RUNTIMES": "17",
"BUILD_GRADLE_BUILD_ARGUMENTS": "build",
"BUILD_GRADLE_ADDITIONAL_BUILD_ARGUMENTS": "--stacktrace",
"BUILD_GRADLE_BUILT_MODULE": "service",
"BUILD_GRADLE_BUILT_ARTIFACT": "service/build/libs/app.jar",
},
}
annotations := (&Builder{}).buildPlatformAnnotations(re)
if annotations["cnb-bp-gradle-build-arguments"] != "build" {
t.Fatalf("expected gradle build arguments, got %q", annotations["cnb-bp-gradle-build-arguments"])
}
if annotations["cnb-bp-gradle-additional-build-arguments"] != "--stacktrace" {
t.Fatalf("expected gradle additional build arguments, got %q", annotations["cnb-bp-gradle-additional-build-arguments"])
}
if annotations["cnb-bp-gradle-built-module"] != "service" {
t.Fatalf("expected gradle built module, got %q", annotations["cnb-bp-gradle-built-module"])
}
if annotations["cnb-bp-gradle-built-artifact"] != "service/build/libs/app.jar" {
t.Fatalf("expected gradle built artifact, got %q", annotations["cnb-bp-gradle-built-artifact"])
}
if annotations["cnb-bp-jvm-version"] != "17" {
t.Fatalf("expected cnb-bp-jvm-version=17, got %q", annotations["cnb-bp-jvm-version"])
}
}