@@ -2445,4 +2445,101 @@ abstract class BspTestDefinitions extends ScalaCliSuite
24452445 }
24462446 }
24472447 }
2448+
2449+ for {
2450+ isIntelliJ <- Seq (false , true )
2451+ clientDescription = if isIntelliJ then " IntelliJ" else " any client"
2452+ bspClientName = if isIntelliJ then " IntelliJ" else " test"
2453+ } {
2454+ def mainTargetOf (
2455+ remoteServer : b.BuildServer & b.ScalaBuildServer & b.JavaBuildServer & b.JvmBuildServer &
2456+ TestBspClient .WrappedSourcesBuildServer
2457+ ): b.BuildTarget = {
2458+ val buildTargetsResp = remoteServer.workspaceBuildTargets().asScala.await
2459+ val targets = buildTargetsResp.getTargets.asScala.toSeq
2460+ targets.find(t => ! t.getId.getUri.contains(" -test" )).getOrElse {
2461+ sys.error(s " No main build target found in ${targets.map(_.getId.getUri)}" )
2462+ }
2463+ }
2464+
2465+ def baseDirectoryOf (target : b.BuildTarget ): os.Path =
2466+ os.Path (Paths .get(new URI (target.getBaseDirectory)))
2467+
2468+ def collectSemDbFiles (root : os.Path ): Seq [os.Path ] =
2469+ os.walk(root)
2470+ .filter(_.last.endsWith(" .semanticdb" ))
2471+ .filter(p => ! p.segments.exists(_ == " bloop-internal-classes" ))
2472+
2473+ test(s " workspaceBuildTargets baseDirectory: default workspace ( $clientDescription) " ) {
2474+ withBsp(
2475+ inputs = TestInputs (
2476+ os.rel / " Hello.scala" ->
2477+ """ object Hello {
2478+ | def main(args: Array[String]): Unit = println("Hello")
2479+ |}
2480+ |""" .stripMargin
2481+ ),
2482+ args = Seq (" ." ),
2483+ bspClientName = bspClientName
2484+ ) { (root, _, remoteServer) =>
2485+ Future {
2486+ val mainTarget = mainTargetOf(remoteServer)
2487+ val baseDir = baseDirectoryOf(mainTarget)
2488+ if isIntelliJ then expect(baseDir == root)
2489+ else expect(baseDir == root / Constants .workspaceDirName)
2490+
2491+ val compileResp =
2492+ remoteServer
2493+ .buildTargetCompile(new b.CompileParams (List (mainTarget.getId).asJava))
2494+ .asScala
2495+ .await
2496+ expect(compileResp.getStatusCode == b.StatusCode .OK )
2497+
2498+ val semDbFiles = collectSemDbFiles(root)
2499+ expect(semDbFiles.nonEmpty)
2500+ expect(semDbFiles.forall(_.segments.contains(Constants .workspaceDirName)))
2501+ }
2502+ }
2503+ }
2504+
2505+ if ! Properties .isWin then
2506+ test(s " workspaceBuildTargets baseDirectory: non-writable workspace ( $clientDescription) " ) {
2507+ val simpleHelloInputsInDir = TestInputs (
2508+ os.rel / " dir" / " Hello.scala" ->
2509+ """ object Hello {
2510+ | def main(args: Array[String]): Unit = println("Hello")
2511+ |}
2512+ |""" .stripMargin
2513+ )
2514+ simpleHelloInputsInDir.fromRoot { root =>
2515+ os.perms.set(root / " dir" , " r-xr-xr-x" )
2516+ try
2517+ withBsp(
2518+ simpleHelloInputsInDir,
2519+ Seq (" dir" ),
2520+ reuseRoot = Some (root),
2521+ bspClientName = bspClientName
2522+ ) {
2523+ (_, _, remoteServer) =>
2524+ Future {
2525+ val mainTarget = mainTargetOf(remoteServer)
2526+ val baseDir = baseDirectoryOf(mainTarget)
2527+ val expectedBaseDir = root / " dir"
2528+ expect(baseDir == expectedBaseDir)
2529+
2530+ val compileResp =
2531+ remoteServer
2532+ .buildTargetCompile(new b.CompileParams (List (mainTarget.getId).asJava))
2533+ .asScala
2534+ .await
2535+ expect(compileResp.getStatusCode == b.StatusCode .OK )
2536+
2537+ val semDbFilesUnderRoot = collectSemDbFiles(root)
2538+ expect(semDbFilesUnderRoot.isEmpty)
2539+ }
2540+ }
2541+ finally os.perms.set(root / " dir" , " rwxr-xr-x" )
2542+ }
2543+ }
2544+ }
24482545}
0 commit comments