@@ -2,14 +2,55 @@ package frameworks_test
22
33import (
44 "os"
5+ "os/exec"
6+ "path/filepath"
57
68 . "github.com/onsi/ginkgo/v2"
79 . "github.com/onsi/gomega"
10+
11+ "github.com/cloudfoundry/java-buildpack/src/java/common"
12+ "github.com/cloudfoundry/java-buildpack/src/java/frameworks"
13+ "github.com/cloudfoundry/libbuildpack"
814)
915
16+ func newJavaOptsContext (buildDir , cacheDir , depsDir string ) * common.Context {
17+ logger := libbuildpack .NewLogger (GinkgoWriter )
18+ manifest := & libbuildpack.Manifest {}
19+ installer := & libbuildpack.Installer {}
20+ stager := libbuildpack .NewStager ([]string {buildDir , cacheDir , depsDir , "0" }, logger , manifest )
21+ return & common.Context {
22+ Stager : stager ,
23+ Manifest : manifest ,
24+ Installer : installer ,
25+ Log : logger ,
26+ Command : & libbuildpack.Command {},
27+ }
28+ }
29+
1030var _ = Describe ("Java Opts Writer" , func () {
31+ var (
32+ buildDir string
33+ cacheDir string
34+ depsDir string
35+ ctx * common.Context
36+ )
37+
38+ BeforeEach (func () {
39+ var err error
40+ buildDir , err = os .MkdirTemp ("" , "build" )
41+ Expect (err ).NotTo (HaveOccurred ())
42+ cacheDir , err = os .MkdirTemp ("" , "cache" )
43+ Expect (err ).NotTo (HaveOccurred ())
44+ depsDir , err = os .MkdirTemp ("" , "deps" )
45+ Expect (err ).NotTo (HaveOccurred ())
46+ ctx = newJavaOptsContext (buildDir , cacheDir , depsDir )
47+ })
48+
1149 AfterEach (func () {
1250 os .Unsetenv ("JAVA_OPTS" )
51+ os .RemoveAll (buildDir )
52+ os .RemoveAll (cacheDir )
53+ os .RemoveAll (depsDir )
1354 })
1455
1556 Describe ("Basic options" , func () {
@@ -20,4 +61,61 @@ var _ = Describe("Java Opts Writer", func() {
2061 Expect (os .Getenv ("JAVA_OPTS" )).To (Equal (javaOpts ))
2162 })
2263 })
64+
65+ Describe ("CreateJavaOptsAssemblyScript" , func () {
66+ runScript := func (javaOpts string , optsFileContent string ) (string , error ) {
67+ err := frameworks .CreateJavaOptsAssemblyScript (ctx )
68+ Expect (err ).NotTo (HaveOccurred ())
69+
70+ optsDir := filepath .Join (depsDir , "0" , "java_opts" )
71+ Expect (os .MkdirAll (optsDir , 0755 )).To (Succeed ())
72+ Expect (os .WriteFile (filepath .Join (optsDir , "42_agent.opts" ), []byte (optsFileContent ), 0644 )).To (Succeed ())
73+
74+ scriptPath := filepath .Join (depsDir , "0" , "profile.d" , "00_java_opts.sh" )
75+ cmd := exec .Command ("bash" , "-c" , "source " + scriptPath + " && echo \" $JAVA_OPTS\" " )
76+ cmd .Env = append (os .Environ (),
77+ "JAVA_OPTS=" + javaOpts ,
78+ "DEPS_DIR=" + depsDir ,
79+ "HOME=/home/vcap/app" ,
80+ )
81+ output , err := cmd .CombinedOutput ()
82+ return string (output ), err
83+ }
84+
85+ It ("handles multiline JAVA_OPTS from YAML block scalar without sed error" , func () {
86+ // Reproduce the manifest pattern:
87+ // JAVA_OPTS: >
88+ // -javaagent:$HOME/BOOT-INF/lib/agent.jar
89+ // -XX:+UseZGC
90+ // YAML '>' folds newlines to spaces, but CF may deliver them as literal newlines
91+ multilineJavaOpts := "-javaagent:$HOME/BOOT-INF/lib/agent.jar\n -XX:+UseZGC\n -XX:+AlwaysPreTouch"
92+
93+ output , err := runScript (multilineJavaOpts , "-javaagent:somepath.jar $JAVA_OPTS" )
94+ Expect (err ).NotTo (HaveOccurred (), "script failed with output: %s" , output )
95+ Expect (output ).To (ContainSubstring ("-XX:+UseZGC" ))
96+ })
97+
98+ It ("handles pipe character in JAVA_OPTS (e.g. javaagent options) without sed error" , func () {
99+ // Reproduce the manifest pattern:
100+ // JAVA_OPTS: >
101+ // -javaagent:$HOME/BOOT-INF/lib/jfr-exporter.jar=enableExecutorMBeans|disableMyFeature
102+ pipeJavaOpts := "-javaagent:$HOME/BOOT-INF/lib/jfr-exporter.jar=enableExecutorMBeans|disableMyFeature"
103+
104+ output , err := runScript (pipeJavaOpts , "-javaagent:somepath.jar $JAVA_OPTS" )
105+ Expect (err ).NotTo (HaveOccurred (), "script failed with output: %s" , output )
106+ Expect (output ).To (ContainSubstring ("enableExecutorMBeans|disableMyFeature" ))
107+ })
108+
109+ It ("expands $HOME in opts file content" , func () {
110+ output , err := runScript ("" , "-javaagent:$HOME/BOOT-INF/lib/agent.jar" )
111+ Expect (err ).NotTo (HaveOccurred (), "script failed with output: %s" , output )
112+ Expect (output ).To (ContainSubstring ("-javaagent:/home/vcap/app/BOOT-INF/lib/agent.jar" ))
113+ })
114+
115+ It ("expands $DEPS_DIR in opts file content" , func () {
116+ output , err := runScript ("" , "-Djava.security.properties=$DEPS_DIR/0/security.properties" )
117+ Expect (err ).NotTo (HaveOccurred (), "script failed with output: %s" , output )
118+ Expect (output ).To (ContainSubstring ("-Djava.security.properties=" + depsDir + "/0/security.properties" ))
119+ })
120+ })
23121})
0 commit comments