|
1 | 1 | package finalize_test |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "github.com/cloudfoundry/java-buildpack/src/internal/mocks" |
5 | | - "github.com/golang/mock/gomock" |
6 | 4 | "os" |
7 | 5 | "path/filepath" |
| 6 | + "regexp" |
8 | 7 | "time" |
9 | 8 |
|
| 9 | + "github.com/cloudfoundry/java-buildpack/src/internal/mocks" |
10 | 10 | "github.com/cloudfoundry/java-buildpack/src/java/finalize" |
11 | 11 | "github.com/cloudfoundry/libbuildpack" |
| 12 | + "github.com/golang/mock/gomock" |
12 | 13 | . "github.com/onsi/ginkgo/v2" |
13 | 14 | . "github.com/onsi/gomega" |
| 15 | + "gopkg.in/yaml.v2" |
14 | 16 | ) |
15 | 17 |
|
16 | 18 | var _ = Describe("Finalize", func() { |
@@ -243,6 +245,50 @@ dependencies: [] |
243 | 245 | }) |
244 | 246 | }) |
245 | 247 |
|
| 248 | + Describe("Release YAML", func() { |
| 249 | + BeforeEach(func() { |
| 250 | + os.Setenv("JBP_CONFIG_JAVA_MAIN", "{java_main_class: com.example.App}") |
| 251 | + finalizer.JREName = "OpenJDK" |
| 252 | + finalizer.ContainerName = "Java Main" |
| 253 | + }) |
| 254 | + |
| 255 | + AfterEach(func() { |
| 256 | + os.Unsetenv("JBP_CONFIG_JAVA_MAIN") |
| 257 | + }) |
| 258 | + |
| 259 | + It("emits web and task process types with identical commands", func() { |
| 260 | + Expect(finalize.Run(finalizer)).To(Succeed()) |
| 261 | + content, err := os.ReadFile(filepath.Join(buildDir, "tmp", "java-buildpack-release-step.yml")) |
| 262 | + Expect(err).NotTo(HaveOccurred()) |
| 263 | + |
| 264 | + re := regexp.MustCompile(`(?m)^\s+(web|task):\s+'(.+)'$`) |
| 265 | + matches := re.FindAllStringSubmatch(string(content), -1) |
| 266 | + Expect(matches).To(HaveLen(2), "expected both web and task process types") |
| 267 | + |
| 268 | + commands := map[string]string{} |
| 269 | + for _, m := range matches { |
| 270 | + commands[m[1]] = m[2] |
| 271 | + } |
| 272 | + Expect(commands).To(HaveKey("web")) |
| 273 | + Expect(commands).To(HaveKey("task")) |
| 274 | + Expect(commands["web"]).To(Equal(commands["task"])) |
| 275 | + }) |
| 276 | + |
| 277 | + It("escapes single quotes in commands so release YAML is valid", func() { |
| 278 | + os.Setenv("JBP_CONFIG_JAVA_MAIN", `{java_main_class: com.example.App, arguments: "--message=it's alive"}`) |
| 279 | + Expect(finalize.Run(finalizer)).To(Succeed()) |
| 280 | + content, err := os.ReadFile(filepath.Join(buildDir, "tmp", "java-buildpack-release-step.yml")) |
| 281 | + Expect(err).NotTo(HaveOccurred()) |
| 282 | + |
| 283 | + var parsed struct { |
| 284 | + DefaultProcessTypes map[string]string `yaml:"default_process_types"` |
| 285 | + } |
| 286 | + Expect(yaml.Unmarshal(content, &parsed)).To(Succeed(), "release YAML must be valid") |
| 287 | + Expect(parsed.DefaultProcessTypes["web"]).To(ContainSubstring("it's alive")) |
| 288 | + Expect(parsed.DefaultProcessTypes["task"]).To(ContainSubstring("it's alive")) |
| 289 | + }) |
| 290 | + }) |
| 291 | + |
246 | 292 | Describe("javaexec launcher installation", func() { |
247 | 293 | It("installs launcher from buildpack bin/ for packaged buildpack usage", func() { |
248 | 294 | // Default path: <buildpackDir>/bin/javaexec already written in BeforeEach. |
|
0 commit comments