Esempio n. 1
0
def test_intellij_test(jvm_rule_runner: RuleRunner,
                       jvm_lockfile: JVMLockfileFixture) -> None:
    jvm_rule_runner.write_files({
        "3rdparty/jvm/BUILD":
        jvm_lockfile.requirements_as_jvm_artifact_targets(),
        "3rdparty/jvm/default.lock":
        jvm_lockfile.serialized_lockfile,
        "BUILD":
        "scalatest_tests(name='main')",
        "Spec.scala":
        dedent("""\
                package org.pantsbuild.example

                import org.scalatest.funspec.AnyFunSpec

                import org.pantsbuild.example.lib.ExampleLib

                class ExampleLibSpec extends AnyFunSpec {
                  describe("ExampleLib") {
                    it("should say hello") {
                      assert(ExampleLib.HELLO == "hello!")
                    }
                  }
                }
                """),
        "lib/BUILD":
        "java_sources()",
        "lib/ExampleLib.java":
        dedent("""\
                package org.pantsbuild.example.lib;

                public class ExampleLib {
                    public static String HELLO = "hello!";
                }
                """),
        "bsp-groups.toml":
        dedent("""\
                [groups.default]
                addresses = ["::"]
                """),
    })

    target_ids = (BuildTargetIdentifier("pants:default"), )

    # We set a very high timeout here (was 15s) due to CI flakes as documented in:
    #   https://github.com/pantsbuild/pants/issues/15657
    # This seems to paper over some slow interaction between requests and the LMDB
    # store as noted in the ticket.
    timeout = 45

    with setup_bsp_server(
            jvm_rule_runner,
            notification_names={
                "build/taskStart", "build/taskProgress", "build/taskFinish"
            },
    ) as (endpoint, notifications):
        build_root = Path(jvm_rule_runner.build_root)

        # build/initialize
        _ = endpoint.request(
            "build/initialize",
            InitializeBuildParams(
                display_name="IntelliJ-BSP",
                version="2022.1.13",
                bsp_version="2.0",
                root_uri=build_root.as_uri(),
                capabilities=BuildClientCapabilities(language_ids=("scala",
                                                                   "java")),
                data={
                    "clientClassesRootDir": (build_root / "out").as_uri(),
                    "supportedScalaVersions": [],
                },
            ).to_json_dict(),
        ).result(timeout=timeout)

        # build/initialized
        endpoint.notify("build/initialized")

        # workspace/buildTargets
        build_targets = WorkspaceBuildTargetsResult.from_json_dict(
            endpoint.request("workspace/buildTargets").result(timeout=timeout))
        assert len(build_targets.targets) == 1
        assert build_targets.targets[
            0].capabilities == BuildTargetCapabilities(can_compile=True)
        assert build_targets.targets[0].language_ids == ("java", "scala")

        # buildTarget/sources
        sources = SourcesResult.from_json_dict(
            endpoint.request("buildTarget/sources",
                             SourcesParams(target_ids).to_json_dict()).result(
                                 timeout=timeout))
        assert len(sources.items[0].sources) == 2

        # buildTarget/dependencySources - (NB: stubbed)
        _ = endpoint.request(
            "buildTarget/dependencySources",
            DependencySourcesParams(target_ids).to_json_dict()).result(
                timeout=timeout)

        # buildTarget/resources - (NB: used only to index resources)
        _ = endpoint.request(
            "buildTarget/resources",
            ResourcesParams(target_ids).to_json_dict()).result(timeout=timeout)

        # buildTarget/scalacOptions
        scalac_options = ScalacOptionsResult.from_json_dict(
            endpoint.request(
                "buildTarget/scalacOptions",
                ScalacOptionsParams(target_ids).to_json_dict()).result(
                    timeout=timeout))
        assert scalac_options.items[0].classpath
        class_directory = Path(
            urlparse(scalac_options.items[0].class_directory).path)
        assert not class_directory.exists()

        # buildTarget/compile
        compile_result = CompileResult.from_json_dict(
            endpoint.request("buildTarget/compile",
                             CompileParams(target_ids).to_json_dict()).result(
                                 timeout=timeout))
        assert StatusCode(compile_result.status_code) == StatusCode.OK
        notifications.assert_received_unordered([
            ("build/taskStart", {}),
            ("build/taskProgress", {
                "message": "//Spec.scala:main succeeded."
            }),
            ("build/taskProgress", {
                "message": "lib/ExampleLib.java succeeded."
            }),
            ("build/taskFinish", {}),
        ])
        assert list(class_directory.iterdir())