@@ -170,6 +170,151 @@ func TestExtractBuildFilePath(t *testing.T) {
170170 }
171171}
172172
173+ // TestParseUserHomeFromJavaOutput tests the parsing of user.home from Java output
174+ func TestParseUserHomeFromJavaOutput (t * testing.T ) {
175+ tests := []struct {
176+ name string
177+ input string
178+ expected string
179+ expectError bool
180+ }{
181+ {
182+ name : "valid output with user.home" ,
183+ input : `Property settings:
184+ file.encoding = UTF-8
185+ java.home = /opt/java
186+ user.dir = /home/user/project
187+ user.home = /home/user
188+ user.name = testuser` ,
189+ expected : "/home/user" ,
190+ expectError : false ,
191+ },
192+ {
193+ name : "valid output with spaces around equals" ,
194+ input : `Property settings:
195+ user.home = /Users/developer
196+ user.name = dev` ,
197+ expected : "/Users/developer" ,
198+ expectError : false ,
199+ },
200+ {
201+ name : "valid output with Windows path" ,
202+ input : "Property settings:\n user.home = C:\\ Users\\ Developer\n user.name = dev" ,
203+ expected : "C:\\ Users\\ Developer" ,
204+ expectError : false ,
205+ },
206+ {
207+ name : "valid output with root user (container scenario)" ,
208+ input : `Property settings:
209+ user.home = /root
210+ user.name = root` ,
211+ expected : "/root" ,
212+ expectError : false ,
213+ },
214+ {
215+ name : "empty output" ,
216+ input : "" ,
217+ expected : "" ,
218+ expectError : true ,
219+ },
220+ {
221+ name : "output without user.home" ,
222+ input : `Property settings:
223+ java.home = /opt/java
224+ user.name = testuser` ,
225+ expected : "" ,
226+ expectError : true ,
227+ },
228+ {
229+ name : "malformed line without equals" ,
230+ input : "user.home /home/user" ,
231+ expected : "" ,
232+ expectError : true ,
233+ },
234+ }
235+
236+ for _ , tt := range tests {
237+ t .Run (tt .name , func (t * testing.T ) {
238+ result , err := parseUserHomeFromJavaOutput (tt .input )
239+ if tt .expectError {
240+ assert .Error (t , err )
241+ } else {
242+ assert .NoError (t , err )
243+ assert .Equal (t , tt .expected , result )
244+ }
245+ })
246+ }
247+ }
248+
249+ // TestWriteInitScriptUsesJavaUserHome specifically tests the new case where
250+ // Java's user.home is used instead of $HOME when GRADLE_USER_HOME is not set.
251+ // This is the fix for container environments where $HOME differs from Java's user.home.
252+ func TestWriteInitScriptUsesJavaUserHome (t * testing.T ) {
253+ // Get Java's user.home - skip if Java is not available
254+ javaHome , err := getJavaUserHome ()
255+ if err != nil {
256+ t .Skip ("Java not available, skipping test" )
257+ }
258+
259+ // Ensure GRADLE_USER_HOME is NOT set so we exercise the Java user.home path
260+ t .Setenv (UserHomeEnv , "" )
261+
262+ // Set $HOME to a DIFFERENT temp directory to simulate container environment
263+ // where $HOME differs from Java's user.home
264+ fakeHome := t .TempDir ()
265+ t .Setenv ("HOME" , fakeHome )
266+
267+ initScript := "test init script for java user.home case"
268+
269+ err = WriteInitScript (initScript )
270+ assert .NoError (t , err )
271+
272+ // Verify: init script should be in Java's user.home, NOT in fake $HOME
273+ expectedPath := filepath .Join (javaHome , ".gradle" , "init.d" , InitScriptName )
274+ wrongPath := filepath .Join (fakeHome , ".gradle" , "init.d" , InitScriptName )
275+
276+ // Should exist in Java user.home (the correct location)
277+ content , err := os .ReadFile (expectedPath )
278+ assert .NoError (t , err , "Init script should be written to Java user.home: %s" , expectedPath )
279+ assert .Equal (t , initScript , string (content ))
280+
281+ // Should NOT exist in fake $HOME (this was the bug!)
282+ _ , err = os .Stat (wrongPath )
283+ assert .True (t , os .IsNotExist (err ), "Init script should NOT be written to $HOME: %s" , wrongPath )
284+
285+ // Cleanup - use t.Cleanup for deferred cleanup
286+ t .Cleanup (func () {
287+ _ = os .Remove (expectedPath )
288+ })
289+ }
290+
291+ // TestWriteInitScriptFallsBackToHome tests that WriteInitScript falls back to $HOME
292+ // when both GRADLE_USER_HOME is not set AND Java is not available
293+ func TestWriteInitScriptFallsBackToHome (t * testing.T ) {
294+ // Ensure GRADLE_USER_HOME is NOT set
295+ t .Setenv (UserHomeEnv , "" )
296+
297+ // Set a known HOME for the fallback case
298+ tempDir := t .TempDir ()
299+ t .Setenv ("HOME" , tempDir )
300+
301+ // Temporarily modify PATH to ensure Java is not found
302+ // This simulates an environment where Java is not installed
303+ // Note: t.Setenv automatically restores the original value after the test
304+ t .Setenv ("PATH" , "/nonexistent" )
305+
306+ initScript := "test init script for HOME fallback case"
307+
308+ err := WriteInitScript (initScript )
309+ assert .NoError (t , err )
310+
311+ // Verify the init script was written to $HOME fallback location
312+ fallbackPath := filepath .Join (tempDir , ".gradle" , "init.d" , InitScriptName )
313+ content , err := os .ReadFile (fallbackPath )
314+ assert .NoError (t , err , "Init script should be written to $HOME fallback: %s" , fallbackPath )
315+ assert .Equal (t , initScript , string (content ))
316+ }
317+
173318// TestExtractBuildFilePathWindowsPaths tests Windows-style paths if on Windows
174319func TestExtractBuildFilePathWindowsPaths (t * testing.T ) {
175320 if runtime .GOOS != "windows" {
0 commit comments