use strict;
use warnings;
use Setup;
use Test2::V0;
use Hydra::Helper::Exec;

# Ensure that `systemd-run` is
# - Available in the PATH/envionment
# - Accessable to the user executing it
# - Capable of using the command switches we use in our test
my $sd_res;
eval {
  ($sd_res) = captureStdoutStderr(3, (
    "systemd-run",
      "--user",
      "--collect",
      "--scope",
      "--property",
        "MemoryMax=25M",
    "--",
    "true"
  ));
} or do {
  # The command failed to execute, likely because `systemd-run` is not present
  # in `PATH`
  skip_all("`systemd-run` failed when invoked in this environment");
};
if ($sd_res != 0) {
  # `systemd-run` executed but `sytemd-run` failed to call `true` and return
  # successfully
  skip_all("`systemd-run` returned non-zero when executing `true` (expected 0)");
}

my $ctx = test_context();

# Contain the memory usage to 25 MegaBytes using `systemd-run`
# Run `hydra-eval-jobs` on test job that will purposefully consume all memory
# available
my ($res, $stdout, $stderr) = captureStdoutStderr(60, (
  "systemd-run",
    "--user",
    "--collect",
    "--scope",
    "--property",
      "MemoryMax=25M",
  "--",
  "hydra-eval-jobs",
    "-I", "/dev/zero",
    "-I", $ctx->jobsdir,
    ($ctx->jobsdir . "/oom.nix")
));

isnt($res, 0, "`hydra-eval-jobs` exits non-zero");
ok(utf8::decode($stderr), "Stderr output is UTF8-clean");
like(
  $stderr,
  # Assert error log contains messages added in PR
  # https://github.com/NixOS/hydra/pull/1203
  qr/^child process \(\d+?\) killed by signal=9$/m,
  "The stderr record includes a relevant error message"
);

done_testing;