Files
lix/tests/functional2/commands/test_hash.py
T
Commentator2.0 acf6e1c6b7 tests/functional2/file_helper: add a way to interpolate environment variables into files
So far it was impossible to put absolute paths into files, as one
wouldn't know whre the test would be placed.
This commit adds a new Fileish variant called `EnvTemplate` which uses
the given string as a template and replaces the `@ENV_VARIABLE_NAME@`
placeholders with the according value of the environment variable.
This way one can use `@HOME@` or `@TEST_ROOT@` to build absolute paths

Change-Id: I425cb6408dceb8d7f26d136ace4ac98b1ca31ec3
2025-11-03 12:58:37 +00:00

138 lines
4.6 KiB
Python

from pathlib import Path
from collections.abc import Callable
import pytest
from functional2.testlib.fixtures.file_helper import (
_init_files,
File,
AssetSymlink,
with_files,
Symlink,
)
from functional2.testlib.fixtures.nix import Nix
from functional2.testlib.fixtures.snapshot import Snapshot
@pytest.mark.parametrize("algo", ["md5", "sha1", "sha256", "sha512"])
@pytest.mark.parametrize(
"content",
["", "a", "abc", "message_digest", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"],
)
@pytest.mark.parametrize("format_flag", ["--base16", "--base32", "--sri"])
@pytest.mark.parametrize("classic", [True, False])
def test_hash(
algo: str,
content: str,
format_flag: str,
classic: bool,
nix: Nix,
snapshot: Callable[[str], Snapshot],
files: Path,
):
_init_files(
{
"vector": File(content),
"expected_hash.txt": AssetSymlink(
f"assets/test_hash/{content}_{algo}_{format_flag}_{classic}.out.exp"
),
},
files,
Path(__file__).parent,
nix.env,
)
args = [format_flag, "--type", algo, files / "vector"]
if classic:
res = nix.nix(["--flat", *args], nix_exe="nix-hash").run().ok()
else:
res = nix.nix(["hash", "file", *args], flake=True).run().ok()
assert snapshot("expected_hash.txt") == res.stdout_s
@with_files({"vector": File("abc")})
def test_hash_classic_defaults_base16(nix: Nix, files: Path):
res = nix.nix(["--flat", "--type", "sha512", files / "vector"], nix_exe="nix-hash").run().ok()
assert (
res.stdout_plain
== "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"
)
@with_files({"vector": File("abc")})
def test_hash_command_defaults_sri(nix: Nix, files: Path):
res = nix.nix(["hash", "file", "--type", "sha512", files / "vector"], flake=True).run().ok()
assert (
res.stdout_plain
== "sha512-3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw=="
)
@with_files(
{
"hash-part": {
"hello": File("Hello World\n", 0o644) # Default perms
}
}
)
def test_hash_part(nix: Nix, files: Path):
res = nix.nix(["--type", "md5", files / "hash-part"], nix_exe="nix-hash").run().ok()
assert res.stdout_plain == "ea9b55537dd4c7e104515b2ccfaf4100"
@with_files(
{
"hash-part": {
"hello": File("Hello World\n", 0o755) # chmod +x
}
}
)
def test_hash_part_exec_matters(nix: Nix, files: Path):
res = nix.nix(["--type", "md5", files / "hash-part"], nix_exe="nix-hash").run().ok()
assert res.stdout_plain == "20f3ffe011d4cfa7d72bfabef7882836"
@with_files({"hash-part": {"hello": File("Hello World\n", 0o744)}})
def test_hash_part_everything_else_doesnt(nix: Nix, files: Path):
res = nix.nix(["--type", "md5", files / "hash-part"], nix_exe="nix-hash").run().ok()
assert res.stdout_plain == "20f3ffe011d4cfa7d72bfabef7882836"
@with_files({"hash-part": {"hello": Symlink("x")}})
def test_hash_part_filetype_matters(nix: Nix, files: Path):
res = nix.nix(["--type", "md5", files / "hash-part"], nix_exe="nix-hash").run().ok()
assert res.stdout_plain == "f78b733a68f5edbdf9413899339eaa4a"
@pytest.mark.parametrize(
("algo", "orig", "b32", "b64"),
[
(
"sha1",
"800d59cfcd3c05e900cb4e214be48f6b886a08df",
"vw46m23bizj4n8afrc0fj19wrp7mj3c0",
"gA1Zz808BekAy04hS+SPa4hqCN8=",
),
(
"sha256",
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
"1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s",
"ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=",
),
(
"sha512",
"204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445",
"12k9jiq29iyqm03swfsgiw5mlqs173qazm3n7daz43infy12pyrcdf30fkk3qwv4yl2ick8yipc2mqnlh48xsvvxl60lbx8vp38yji0",
"IEqPxt2oLwoM7XvrjgikFlfBbvRosiioJ5vjMacDwzWW/RXBOxsH+aodO+pXeJygMa2Fx6cd1wNU7GMSOMo0RQ==",
),
],
)
def test_hash_conversion(algo: str, orig: str, b32: str, b64: str, nix: Nix):
for target_type, exp in zip(
["to-base16", "to-base32", "to-base64", "to-sri"], [orig, b32, b64, f"{algo}-{b64}"]
):
res = nix.nix(["--type", algo, f"--{target_type}", orig], nix_exe="nix-hash").run().ok()
assert res.stdout_plain == exp
res = nix.nix(["hash", target_type, "--type", algo, orig], flake=True).run().ok()
assert res.stdout_plain == exp