def test_fetch_one_coord_with_transitive_deps(rule_runner: RuleRunner) -> None:
    junit_coord = Coordinate(group="junit", artifact="junit", version="4.13.2")
    classpath_entry = rule_runner.request(
        ClasspathEntry,
        [
            CoursierLockfileEntry(
                coord=junit_coord,
                file_name="junit-4.13.2.jar",
                direct_dependencies=Coordinates([HAMCREST_COORD]),
                dependencies=Coordinates([HAMCREST_COORD]),
                file_digest=FileDigest(
                    fingerprint=
                    "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
                    serialized_bytes_length=384581,
                ),
            )
        ],
    )
    assert classpath_entry.filenames == ("junit-4.13.2.jar", )
    file_digest = rule_runner.request(
        FileDigest,
        [ExtractFileDigest(classpath_entry.digest, "junit-4.13.2.jar")])
    assert file_digest == FileDigest(
        fingerprint=
        "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
        serialized_bytes_length=384581,
    )
def test_fetch_one_coord_with_no_deps(rule_runner: RuleRunner) -> None:

    classpath_entry = rule_runner.request(
        ClasspathEntry,
        [
            CoursierLockfileEntry(
                coord=HAMCREST_COORD,
                file_name="hamcrest-core-1.3.jar",
                direct_dependencies=Coordinates([]),
                dependencies=Coordinates([]),
                file_digest=FileDigest(
                    fingerprint=
                    "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
                    serialized_bytes_length=45024,
                ),
            )
        ],
    )
    assert classpath_entry.filenames == ("hamcrest-core-1.3.jar", )
    file_digest = rule_runner.request(
        FileDigest,
        [ExtractFileDigest(classpath_entry.digest, "hamcrest-core-1.3.jar")])
    assert file_digest == FileDigest(
        fingerprint=
        "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
        serialized_bytes_length=45024,
    )
def test_resolve_with_transitive_deps(rule_runner: RuleRunner) -> None:
    junit_coord = Coordinate(group="junit", artifact="junit", version="4.13.2")
    resolved_lockfile = rule_runner.request(
        CoursierResolvedLockfile,
        [
            ArtifactRequirements([junit_coord]),
        ],
    )

    assert resolved_lockfile == CoursierResolvedLockfile(entries=(
        CoursierLockfileEntry(
            coord=junit_coord,
            file_name="junit-4.13.2.jar",
            direct_dependencies=Coordinates([HAMCREST_COORD]),
            dependencies=Coordinates([HAMCREST_COORD]),
            file_digest=FileDigest(
                fingerprint=
                "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
                serialized_bytes_length=384581,
            ),
        ),
        CoursierLockfileEntry(
            coord=HAMCREST_COORD,
            file_name="hamcrest-core-1.3.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
                serialized_bytes_length=45024,
            ),
        ),
    ))
def test_fetch_one_coord_with_transitive_deps(rule_runner: RuleRunner) -> None:

    classpath_entry = rule_runner.request(
        ResolvedClasspathEntry,
        [
            CoursierLockfileEntry(
                coord=MavenCoord(coord="junit:junit:4.13.2"),
                file_name="junit-4.13.2.jar",
                direct_dependencies=MavenCoordinates(
                    [MavenCoord(coord="org.hamcrest:hamcrest-core:1.3")]),
                dependencies=MavenCoordinates(
                    [MavenCoord(coord="org.hamcrest:hamcrest-core:1.3")]),
                file_digest=FileDigest(
                    fingerprint=
                    "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
                    serialized_bytes_length=384581,
                ),
            )
        ],
    )
    assert classpath_entry.coord == MavenCoord(coord="junit:junit:4.13.2")
    assert classpath_entry.file_name == "junit-4.13.2.jar"
    file_digest = rule_runner.request(
        FileDigest,
        [ExtractFileDigest(classpath_entry.digest, "junit-4.13.2.jar")])
    assert file_digest == FileDigest(
        fingerprint=
        "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
        serialized_bytes_length=384581,
    )
Exemplo n.º 5
0
def test_path_globs_to_digest_entries(rule_runner: RuleRunner) -> None:
    setup_fs_test_tar(rule_runner)

    def get_entries(globs: Iterable[str]) -> Set[Union[FileEntry, Directory]]:
        return set(rule_runner.request(DigestEntries, [PathGlobs(globs)]))

    assert get_entries(["4.txt", "a/4.txt.ln"]) == {
        FileEntry(
            "4.txt",
            FileDigest("ab929fcd5594037960792ea0b98caf5fdaf6b60645e4ef248c28db74260f393e", 5),
        ),
        FileEntry(
            "a/4.txt.ln",
            FileDigest("ab929fcd5594037960792ea0b98caf5fdaf6b60645e4ef248c28db74260f393e", 5),
        ),
    }
    assert get_entries(["c.ln/../3.txt"]) == {
        FileEntry(
            "c.ln/../3.txt",
            FileDigest("f6936912184481f5edd4c304ce27c5a1a827804fc7f329f43d273b8621870776", 6),
        )
    }

    # Directories are empty.
    assert get_entries(["a/b"]) == {Directory("a/b")}
    assert get_entries(["c.ln"]) == {Directory("c.ln")}
Exemplo n.º 6
0
def test_coursier_resolve_noop_does_not_touch_lockfile(
        rule_runner: RuleRunner) -> None:
    expected_lockfile = CoursierResolvedLockfile(entries=(CoursierLockfileEntry(
        coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"),
        file_name="hamcrest-core-1.3.jar",
        direct_dependencies=MavenCoordinates([]),
        dependencies=MavenCoordinates([]),
        file_digest=FileDigest(
            fingerprint=
            "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
            serialized_bytes_length=45024,
        ),
    ), ))
    rule_runner.write_files({
        "BUILD":
        dedent("""\
                coursier_lockfile(
                    name = 'example-lockfile',
                    maven_requirements = [
                        'org.hamcrest:hamcrest-core:1.3',
                    ],
                    sources = [
                        "coursier_resolve.lockfile",
                    ],
                )
                """),
        "coursier_resolve.lockfile":
        expected_lockfile.to_json().decode("utf-8"),
    })
    result = rule_runner.run_goal_rule(CoursierResolve, args=["::"])
    assert result.exit_code == 0
    assert result.stderr == ""
def test_resolve_with_inexact_coord(rule_runner: RuleRunner) -> None:
    resolved_lockfile = rule_runner.request(
        CoursierResolvedLockfile,
        [
            # Note the open-ended coordinate here.  We will still resolve this for the user, but the result
            # will be exact and pinned.  As noted above, this is an especially brittle unit test, but version
            # 4.8 was chosen because it has multiple patch versions and no new versions have been uploaded
            # to 4.8.x in over a decade.
            ArtifactRequirements(
                [Coordinate(group="junit", artifact="junit", version="4.8+")]),
        ],
    )

    assert resolved_lockfile == CoursierResolvedLockfile(
        entries=(CoursierLockfileEntry(
            coord=Coordinate(group="junit", artifact="junit", version="4.8.2"),
            file_name="junit-4.8.2.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "a2aa2c3bb2b72da76c3e6a71531f1eefdc350494819baf2b1d80d7146e020f9e",
                serialized_bytes_length=237344,
            ),
        ), ))
def test_fetch_one_coord_with_mismatched_coord(
        rule_runner: RuleRunner) -> None:
    """This test demonstrates that fetch_one_coord is picky about inexact coordinates.

    Even though the expected jar was downloaded, the coordinate in the lockfile entry was inexact, meaning
    it wasn't an exact string match for the coordinate fetched and reported by Coursier, which is exact.

    This shouldn't happen in practice, because these lockfile entries are ultimately derived from Coursier
    reports which always give exact coordinate strings.
    """
    expected_exception_msg = (
        r'Coursier resolved coord.*?"org.hamcrest:hamcrest-core:1.3".*?'
        r'does not match requested coord.*?"org.hamcrest:hamcrest-core:1.3\+".*?'
    )
    lockfile_entry = CoursierLockfileEntry(
        coord=Coordinate(group="org.hamcrest",
                         artifact="hamcrest-core",
                         version="1.3+"),
        file_name="hamcrest-core-1.3.jar",
        direct_dependencies=Coordinates([]),
        dependencies=Coordinates([]),
        file_digest=FileDigest(
            fingerprint=
            "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
            serialized_bytes_length=45024,
        ),
    )
    with pytest.raises(ExecutionError, match=expected_exception_msg):
        rule_runner.request(ClasspathEntry, [lockfile_entry])
Exemplo n.º 9
0
 def get_request(self, plat: Platform) -> ExternalToolRequest:
     """Generate a request for this tool."""
     for known_version in self.known_versions:
         try:
             ver, plat_val, sha256, length = (
                 x.strip() for x in known_version.split("|"))
         except ValueError:
             raise ExternalToolError(
                 f"Bad value for --known-versions (see {self.options.pants_bin_name} "
                 f"help-advanced {self.options_scope}): {known_version}")
         if plat_val == plat.value and ver == self.version:
             digest = FileDigest(fingerprint=sha256,
                                 serialized_bytes_length=int(length))
             try:
                 url = self.generate_url(plat)
                 exe = self.generate_exe(plat)
             except ExternalToolError as e:
                 raise ExternalToolError(
                     f"Couldn't find {self.name} version {self.version} on {plat.value}"
                 ) from e
             return ExternalToolRequest(
                 DownloadFile(url=url, expected_digest=digest), exe)
     raise UnknownVersion(
         f"No known version of {self.name} {self.version} for {plat.value} found in "
         f"{self.known_versions}")
Exemplo n.º 10
0
def test_generate_lockfile(rule_runner: RuleRunner) -> None:
    artifacts = ArtifactRequirements([
        ArtifactRequirement(Coordinate("org.hamcrest", "hamcrest-core", "1.3"))
    ])
    result = rule_runner.request(
        GenerateLockfileResult,
        [
            GenerateJvmLockfile(artifacts=artifacts,
                                resolve_name="test",
                                lockfile_dest="lock.txt")
        ],
    )
    digest_contents = rule_runner.request(DigestContents, [result.digest])
    assert len(digest_contents) == 1

    expected = CoursierResolvedLockfile(
        entries=(CoursierLockfileEntry(
            coord=Coordinate(
                group="org.hamcrest",
                artifact="hamcrest-core",
                version="1.3",
            ),
            file_name="org.hamcrest_hamcrest-core_1.3.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
                serialized_bytes_length=45024,
            ),
        ), ),
        metadata=JVMLockfileMetadata.new(artifacts),
    )
    assert CoursierResolvedLockfile.from_serialized(
        digest_contents[0].content) == expected
Exemplo n.º 11
0
def test_coursier_resolve_updates_bogus_lockfile(
        rule_runner: RuleRunner) -> None:
    rule_runner.write_files({
        "BUILD":
        dedent("""\
                coursier_lockfile(
                    name = 'example-lockfile',
                    maven_requirements = [
                        'org.hamcrest:hamcrest-core:1.3',
                    ],
                )
                """),
        "coursier_resolve.lockfile":
        "]bad json[",
    })
    result = rule_runner.run_goal_rule(CoursierResolve, args=["::"])
    assert result.exit_code == 0
    assert result.stderr == "Updated lockfile at: coursier_resolve.lockfile\n"
    expected_lockfile = CoursierResolvedLockfile(entries=(CoursierLockfileEntry(
        coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"),
        file_name="hamcrest-core-1.3.jar",
        direct_dependencies=MavenCoordinates([]),
        dependencies=MavenCoordinates([]),
        file_digest=FileDigest(
            fingerprint=
            "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
            serialized_bytes_length=45024,
        ),
    ), ))
    assert (Path(rule_runner.build_root,
                 "coursier_resolve.lockfile").read_bytes() ==
            expected_lockfile.to_json())
Exemplo n.º 12
0
def test_compile_with_maven_deps(rule_runner: RuleRunner) -> None:
    resolved_joda_lockfile = CoursierResolvedLockfile(
        entries=(CoursierLockfileEntry(
            coord=Coordinate(
                group="joda-time", artifact="joda-time", version="2.10.10"),
            file_name="joda-time-2.10.10.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3",
                serialized_bytes_length=644419,
            ),
        ), ))
    rule_runner.write_files({
        "BUILD":
        dedent("""\
                jvm_artifact(
                    name = "joda-time_joda-time",
                    group = "joda-time",
                    artifact = "joda-time",
                    version = "2.10.10",
                )
                scala_sources(
                    name = 'main',
                    dependencies = [":joda-time_joda-time"],
                )
                """),
        "coursier_resolve.lockfile":
        resolved_joda_lockfile.to_json().decode("utf-8"),
        "Example.scala":
        dedent("""
                package org.pantsbuild.example

                import org.joda.time.DateTime

                object Main {
                    def main(args: Array[String]): Unit = {
                        val dt = new DateTime()
                        println(dt.getYear)
                    }
                }
                """),
    })
    request = CompileScalaSourceRequest(
        component=expect_single_expanded_coarsened_target(
            rule_runner, Address(spec_path="", target_name="main")),
        resolve=make_resolve(rule_runner),
    )
    compiled_classfiles = rule_runner.request(ClasspathEntry, [request])
    classpath = rule_runner.request(RenderedClasspath,
                                    [compiled_classfiles.digest])
    assert classpath.content == {
        ".Example.scala.main.jar": {
            "META-INF/MANIFEST.MF",
            "org/pantsbuild/example/Main$.class",
            "org/pantsbuild/example/Main.class",
        }
    }
Exemplo n.º 13
0
def test_compile_with_maven_deps(rule_runner: RuleRunner) -> None:
    resolved_joda_lockfile = CoursierResolvedLockfile(
        entries=(CoursierLockfileEntry(
            coord=Coordinate(
                group="joda-time", artifact="joda-time", version="2.10.10"),
            file_name="joda-time-2.10.10.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3",
                serialized_bytes_length=644419,
            ),
        ), ))
    rule_runner.write_files({
        "BUILD":
        dedent("""\
                jvm_artifact(
                    name = "joda-time_joda-time",
                    group = "joda-time",
                    artifact = "joda-time",
                    version = "2.10.10",
                )

                java_sources(
                    name = 'main',

                    dependencies = [
                        ':joda-time_joda-time',
                    ]
                )
                """),
        "coursier_resolve.lockfile":
        resolved_joda_lockfile.to_json().decode("utf-8"),
        "Example.java":
        dedent("""
                package org.pantsbuild.example;

                import org.joda.time.DateTime;

                public class Example {
                    public static void main(String[] args) {
                        DateTime dt = new DateTime();
                        System.out.println(dt.getYear());
                    }
                }
                """),
    })
    request = CompileJavaSourceRequest(
        component=expect_single_expanded_coarsened_target(
            rule_runner, Address(spec_path="", target_name="main")),
        resolve=make_resolve(rule_runner),
    )
    compiled_classfiles = rule_runner.request(ClasspathEntry, [request])
    classpath = rule_runner.request(RenderedClasspath,
                                    [compiled_classfiles.digest])
    assert classpath.content == {
        ".Example.java.main.jar": {"org/pantsbuild/example/Example.class"}
    }
Exemplo n.º 14
0
def test_fetch_one_coord_with_jar(rule_runner: RuleRunner) -> None:
    coord = Coordinate(group="jeremy", artifact="jeremy", version="4.13.2")
    file_name = f"{coord.group}_{coord.artifact}_{coord.version}.jar"
    rule_runner.write_files({
        "BUILD":
        textwrap.dedent(f"""\
            jvm_artifact(
              name="jeremy",
              group="{coord.group}",
              artifact="{coord.artifact}",
              version="{coord.version}",
              jar="jeremy.jar",
            )
            """),
        "jeremy.jar":
        "hello dave",
    })

    classpath_entry = rule_runner.request(
        ClasspathEntry,
        [
            CoursierLockfileEntry(
                coord=coord,
                file_name=file_name,
                direct_dependencies=Coordinates([]),
                dependencies=Coordinates([]),
                file_digest=FileDigest(
                    fingerprint=
                    "55b9afa8d7776cd6c318eec51f506e9c7f66c247dcec343d4667f5f269714f86",
                    serialized_bytes_length=10,
                ),
                pants_address="//:jeremy",
            )
        ],
    )
    assert classpath_entry.filenames == (file_name, )
    file_digest = rule_runner.request(
        FileDigest,
        [ExtractFileDigest(classpath_entry.digest, file_name)],
    )
    assert file_digest == FileDigest(
        fingerprint=
        "55b9afa8d7776cd6c318eec51f506e9c7f66c247dcec343d4667f5f269714f86",
        serialized_bytes_length=10,
    )
Exemplo n.º 15
0
def test_download_wrong_digest(downloads_rule_runner: RuleRunner) -> None:
    file_digest = FileDigest(DOWNLOADS_FILE_DIGEST.fingerprint,
                             DOWNLOADS_FILE_DIGEST.serialized_bytes_length + 1)
    with pytest.raises(ExecutionError) as exc:
        with http_server(StubHandler) as port:
            downloads_rule_runner.request(Snapshot, [
                DownloadFile(f"http://localhost:{port}/file.txt", file_digest)
            ])
    assert "wrong digest" in str(exc.value).lower()
Exemplo n.º 16
0
def test_resolve_with_a_jar(rule_runner: RuleRunner) -> None:

    rule_runner.write_files({
        "BUILD":
        textwrap.dedent("""\
            jvm_artifact(
              name="jeremy",
              group="jeremy",
              artifact="jeremy",
              version="4.13.2",
              jar="jeremy.jar",
            )
            """),
        "jeremy.jar":
        "hello dave",
    })

    targets = rule_runner.request(Targets, [
        RawSpecs(recursive_globs=(RecursiveGlobSpec(""), ),
                 description_of_origin="tests")
    ])
    jeremy_target = targets[0]

    jar_field = jeremy_target[JvmArtifactJarSourceField]

    requirement = ArtifactRequirement(
        coordinate=Coordinate(
            group="jeremy",
            artifact="jeremy",
            version="4.13.2",
        ),
        jar=jar_field,
    )

    resolved_lockfile = rule_runner.request(
        CoursierResolvedLockfile,
        [ArtifactRequirements([requirement])],
    )

    coordinate = requirement.coordinate
    assert resolved_lockfile == CoursierResolvedLockfile(
        entries=(CoursierLockfileEntry(
            coord=Coordinate(group=coordinate.group,
                             artifact=coordinate.artifact,
                             version=coordinate.version),
            file_name=
            f"{coordinate.group}_{coordinate.artifact}_{coordinate.version}.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "55b9afa8d7776cd6c318eec51f506e9c7f66c247dcec343d4667f5f269714f86",
                serialized_bytes_length=10,
            ),
            pants_address=jar_field.address.spec,
        ), ))
Exemplo n.º 17
0
def test_extract_nonempty_file(rule_runner: RuleRunner) -> None:
    digest = get_digest(rule_runner, {"foo.txt": "bar"})
    file_digest = rule_runner.request(
        FileDigest,
        [ExtractFileDigest(digest=digest, file_path="foo.txt")],
    )
    hasher = hashlib.sha256()
    hasher.update(b"bar")
    assert file_digest == FileDigest(fingerprint=hasher.hexdigest(),
                                     serialized_bytes_length=3)
Exemplo n.º 18
0
 def do_test(expected_url: str, expected_length: int, expected_sha256: str,
             plat: Platform, version: str) -> None:
     foobar = create_subsystem(FooBar,
                               version=version,
                               known_versions=FooBar.default_known_versions)
     assert (ExternalToolRequest(
         DownloadFile(url=expected_url,
                      expected_digest=FileDigest(expected_sha256,
                                                 expected_length)),
         f"foobar-{version}/bin/foobar",
     ) == foobar.get_request(plat))
Exemplo n.º 19
0
def test_digest_entries_handles_empty_directory(rule_runner: RuleRunner) -> None:
    digest = rule_runner.request(
        Digest, [CreateDigest([Directory("a/b"), FileContent("a/foo.txt", b"four\n")])]
    )
    entries = rule_runner.request(DigestEntries, [digest])
    assert entries == DigestEntries(
        [
            Directory("a/b"),
            FileEntry(
                "a/foo.txt",
                FileDigest("ab929fcd5594037960792ea0b98caf5fdaf6b60645e4ef248c28db74260f393e", 5),
            ),
        ]
    )
Exemplo n.º 20
0
 def get_request_for(self, plat_val: str, sha256: str,
                     length: int) -> ExternalToolRequest:
     """Generate a request for this tool from the given info."""
     plat = Platform(plat_val)
     digest = FileDigest(fingerprint=sha256, serialized_bytes_length=length)
     try:
         url = self.generate_url(plat)
         exe = self.generate_exe(plat)
     except ExternalToolError as e:
         raise ExternalToolError(
             f"Couldn't find {self.name} version {self.version} on {plat.value}"
         ) from e
     return ExternalToolRequest(
         DownloadFile(url=url, expected_digest=digest), exe)
def test_resolve_with_transitive_deps(rule_runner: RuleRunner) -> None:
    resolved_lockfile = rule_runner.request(
        CoursierResolvedLockfile,
        [
            MavenRequirements.create_from_maven_coordinates_fields(
                fields=(),
                additional_requirements=["junit:junit:4.13.2"],
            )
        ],
    )

    assert resolved_lockfile == CoursierResolvedLockfile(entries=(
        CoursierLockfileEntry(
            coord=MavenCoord(coord="junit:junit:4.13.2"),
            file_name="junit-4.13.2.jar",
            direct_dependencies=MavenCoordinates(
                [MavenCoord(coord="org.hamcrest:hamcrest-core:1.3")]),
            dependencies=MavenCoordinates(
                [MavenCoord(coord="org.hamcrest:hamcrest-core:1.3")]),
            file_digest=FileDigest(
                fingerprint=
                "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
                serialized_bytes_length=384581,
            ),
        ),
        CoursierLockfileEntry(
            coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"),
            file_name="hamcrest-core-1.3.jar",
            direct_dependencies=MavenCoordinates([]),
            dependencies=MavenCoordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
                serialized_bytes_length=45024,
            ),
        ),
    ))
Exemplo n.º 22
0
    def from_json_dict(cls, entry) -> CoursierLockfileEntry:
        """Construct a CoursierLockfileEntry from its JSON dictionary representation."""

        return cls(
            coord=Coordinate.from_json_dict(entry["coord"]),
            file_name=entry["file_name"],
            direct_dependencies=Coordinates(
                Coordinate.from_json_dict(d) for d in entry["directDependencies"]
            ),
            dependencies=Coordinates(Coordinate.from_json_dict(d) for d in entry["dependencies"]),
            file_digest=FileDigest(
                fingerprint=entry["file_digest"]["fingerprint"],
                serialized_bytes_length=entry["file_digest"]["serialized_bytes_length"],
            ),
        )
Exemplo n.º 23
0
def test_download_caches(downloads_rule_runner: RuleRunner) -> None:
    # We would error if we hit the HTTP server with 404, but we're not going to hit the HTTP
    # server because it's cached, so we shouldn't see an error.
    prime_store_with_roland_digest(downloads_rule_runner)
    with http_server(StubHandler) as port:
        download_file = DownloadFile(
            f"http://localhost:{port}/roland",
            FileDigest(
                "693d8db7b05e99c6b7a7c0616456039d89c555029026936248085193559a0b5d",
                16),
        )
        snapshot = downloads_rule_runner.request(Snapshot, [download_file])
    assert snapshot.files == ("roland", )
    assert snapshot.digest == Digest(
        "9341f76bef74170bedffe51e4f2e233f61786b7752d21c2339f8ee6070eba819", 82)
Exemplo n.º 24
0
def test_resolve_with_no_deps(rule_runner: RuleRunner) -> None:
    resolved_lockfile = rule_runner.request(
        CoursierResolvedLockfile,
        [ArtifactRequirements([HAMCREST_COORD])],
    )
    assert resolved_lockfile == CoursierResolvedLockfile(
        entries=(CoursierLockfileEntry(
            coord=HAMCREST_COORD,
            file_name="hamcrest-core-1.3.jar",
            direct_dependencies=Coordinates([]),
            dependencies=Coordinates([]),
            file_digest=FileDigest(
                fingerprint=
                "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
                serialized_bytes_length=45024,
            ),
        ), ))
Exemplo n.º 25
0
def test_coursier_resolve_updates_bogus_lockfile(
        rule_runner: RuleRunner) -> None:
    rule_runner.write_files({
        "BUILD":
        dedent("""\
                java_sources(
                    name = 'here_to_provide_dependencies',
                    dependencies = [
                        ':org.hamcrest_hamcrest-core',
                    ],
                    sources = ["*.txt"],
                )

                jvm_artifact(
                    name = 'org.hamcrest_hamcrest-core',
                    group = 'org.hamcrest',
                    artifact = 'hamcrest-core',
                    version = "1.3",
                )
                coursier_lockfile(
                    name = 'example-lockfile',
                )
                """),
        "coursier_resolve.lockfile":
        "]bad json[",
    })
    result = rule_runner.run_goal_rule(CoursierResolve,
                                       args=ARGS,
                                       env_inherit=PYTHON_BOOTSTRAP_ENV)
    assert result.exit_code == 0
    assert result.stderr == "Updated lockfile at: coursier_resolve.lockfile\n"
    expected_lockfile = CoursierResolvedLockfile(entries=(CoursierLockfileEntry(
        coord=HAMCREST_COORD,
        file_name="hamcrest-core-1.3.jar",
        direct_dependencies=Coordinates([]),
        dependencies=Coordinates([]),
        file_digest=FileDigest(
            fingerprint=
            "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
            serialized_bytes_length=45024,
        ),
    ), ))
    assert (Path(rule_runner.build_root,
                 "coursier_resolve.lockfile").read_bytes() ==
            expected_lockfile.to_json())
Exemplo n.º 26
0
 def test_download_wrong_digest(self) -> None:
     with self.isolated_local_store():
         with http_server(StubHandler) as port:
             with self.assertRaises(ExecutionError) as cm:
                 self.request(
                     Snapshot,
                     [
                         DownloadFile(
                             f"http://localhost:{port}/file.txt",
                             FileDigest(
                                 self.file_digest.fingerprint,
                                 self.file_digest.serialized_bytes_length +
                                 1,
                             ),
                         )
                     ],
                 )
             assert "wrong digest" in str(cm.exception).lower()
Exemplo n.º 27
0
async def fetch_nailgun() -> Nailgun:
    nailgun = await Get(
        ClasspathEntry,
        CoursierLockfileEntry(
            coord=Coordinate.from_coord_str(
                "com.martiansoftware:nailgun-server:0.9.1"),
            file_name="com.martiansoftware_nailgun-server_0.9.1.jar",
            direct_dependencies=Coordinates(),
            dependencies=Coordinates(),
            file_digest=FileDigest(
                fingerprint=
                "4518faa6bf4bd26fccdc4d85e1625dc679381a08d56872d8ad12151dda9cef25",
                serialized_bytes_length=32927,
            ),
        ),
    )

    return Nailgun(nailgun)
Exemplo n.º 28
0
def test_fetch_one_coord_with_bad_fingerprint(rule_runner: RuleRunner) -> None:
    expected_exception_msg = (
        r".*?CoursierError:.*?Coursier fetch for .*?hamcrest.*? succeeded.*?"
        r"66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9.*?"
        r"did not match.*?ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
    )
    lockfile_entry = CoursierLockfileEntry(
        coord=HAMCREST_COORD,
        file_name="hamcrest-core-1.3.jar",
        direct_dependencies=Coordinates([]),
        dependencies=Coordinates([]),
        file_digest=FileDigest(
            fingerprint=
            "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
            serialized_bytes_length=45024,
        ),
    )
    with pytest.raises(ExecutionError, match=expected_exception_msg):
        rule_runner.request(ClasspathEntry, [lockfile_entry])
Exemplo n.º 29
0
async def digest_to_file_digest(request: ExtractFileDigest) -> FileDigest:
    """TODO(#11806): This is just a workaround; this extraction should be provided directly by the engine."""

    digest = await Get(
        Digest, DigestSubset(request.digest, PathGlobs([request.file_path])))
    digest_contents = await Get(DigestContents, Digest, digest)
    if len(digest_contents) == 0:
        raise Exception(
            f"ExtractFileDigest: '{request.file_path}' not found in {request.digest}."
        )
    elif len(digest_contents) > 1:
        raise Exception(
            f"ExtractFileDigest: Unexpected error: '{request.file_path}' found multiple times in {request.digest}"
        )

    file_content = digest_contents[0]
    hasher = hashlib.sha256()
    hasher.update(file_content.content)
    return FileDigest(fingerprint=hasher.hexdigest(),
                      serialized_bytes_length=len(file_content.content))
Exemplo n.º 30
0
 def do_test(expected_url: str, expected_length: int, expected_sha256: str,
             plat: Platform, version: str) -> None:
     foobar = create_subsystem(
         FooBar,
         version=version,
         known_versions=FooBar.default_known_versions,
     )
     templated_foobar = create_subsystem(
         TemplatedFooBar,
         version=version,
         known_versions=TemplatedFooBar.default_known_versions,
         url_template=TemplatedFooBar.default_url_template,
         url_platform_mapping=TemplatedFooBar.default_url_platform_mapping,
     )
     expected = ExternalToolRequest(
         DownloadFile(url=expected_url,
                      expected_digest=FileDigest(expected_sha256,
                                                 expected_length)),
         f"foobar-{version}/bin/foobar",
     )
     assert expected == foobar.get_request(plat)
     assert expected == templated_foobar.get_request(plat)