@@ -58,13 +58,15 @@ class ForkerSpec {
5858 cwd : AbsolutePath ,
5959 args : Array [String ],
6060 extraClasspath : Array [AbsolutePath ] = Array .empty,
61- envs : List [String ] = Nil
61+ envs : List [String ] = Nil ,
62+ configJavaOptions : Array [String ] = Array .empty,
63+ jargs : Array [String ] = Array .empty
6264 )(
6365 op : (Int , List [(String , String )]) => Unit
6466 ): Unit =
6567 TestUtil .checkAfterCleanCompilation(runnableProject, dependencies) { state =>
6668 val project = TestUtil .getProject(TestUtil .RootProject , state)
67- val env = JdkConfig .default
69+ val env = JdkConfig .default.copy(javaOptions = configJavaOptions)
6870 val classpath = project.fullRuntimeClasspath(state.build.getDagFor(project), state.client)
6971 val config = JvmProcessForker (env, classpath)
7072 val logger = new RecordingLogger
@@ -76,7 +78,7 @@ class ForkerSpec {
7678 cwd,
7779 mainClass,
7880 args,
79- Array .empty ,
81+ jargs ,
8082 envVars = envs,
8183 logger.asVerbose,
8284 opts,
@@ -223,6 +225,25 @@ class ForkerSpec {
223225 }
224226 }
225227
228+ @ Test
229+ def callerJvmOptionsOverrideConfigJavaOptions (): Unit = TestUtil .withinWorkspace { tmp =>
230+ val injectedDir = tmp.resolve(" injected-dir" )
231+ val wantedDir = tmp.resolve(" wanted-dir" )
232+ Files .createDirectory(injectedDir.underlying)
233+ Files .createDirectory(wantedDir.underlying)
234+ run(
235+ tmp,
236+ Array .empty,
237+ configJavaOptions = Array (s " -Duser.dir= ${injectedDir.syntax}" ),
238+ jargs = Array (s " -Duser.dir= ${wantedDir.syntax}" )
239+ ) {
240+ case (exitCode, messages) =>
241+ val expected = " info" -> s " CWD: ${wantedDir.underlying.toRealPath()}"
242+ assertEquals(0 , exitCode.toLong)
243+ assert(messages.contains(expected), s " $messages did not contain $expected" )
244+ }
245+ }
246+
226247 @ Test
227248 def jdwpAgentArgKeepsDapDefaults (): Unit = {
228249 // The default debug mode (no fixed address, suspend) is what the DAP/Metals path relies on:
0 commit comments