{
  lib,
  testers,
  buildFHSEnv,
  writeShellScriptBin,

  system,
  self,
  withRace ? false,
}:

testers.nixosTest {
  name = "hakurei" + (if withRace then "-race" else "");
  nodes.machine =
    { options, pkgs, ... }:
    let
      fhs =
        let
          hakurei = options.environment.hakurei.package.default;
        in
        buildFHSEnv {
          pname = "hakurei-fhs";
          inherit (hakurei) version;
          targetPkgs = _: hakurei.targetPkgs;
          extraOutputsToInstall = [ "dev" ];
          profile = ''
            export PKG_CONFIG_PATH="/usr/share/pkgconfig:$PKG_CONFIG_PATH"
          '';
        };
    in
    {
      environment.systemPackages = [
        # For go tests:
        (writeShellScriptBin "hakurei-test" ''
          # Assert hst CGO_ENABLED=0: ${
            with pkgs;
            runCommand "hakurei-hst-cgo" { nativeBuildInputs = [ self.packages.${system}.hakurei.go ]; } ''
              cp -r ${options.environment.hakurei.package.default.src} "$out"
              chmod -R +w "$out"
              cp ${writeText "hst_cgo_test.go" ''package hakurei_test;import("testing";"hakurei.app/hst");func TestTemplate(t *testing.T){hst.Template()}''} "$out/hst_cgo_test.go"
              (cd "$out" && HOME="$(mktemp -d)" CGO_ENABLED=0 go test .)
            ''
          }

          cd ${self.packages.${system}.hakurei.src}
          ${fhs}/bin/hakurei-fhs -c \
            'CC="clang -O3 -Werror" go test --tags=noskip ${if withRace then "-race" else "-count 16"} ./...' \
            &> /tmp/hakurei-test.log && \
            touch /tmp/hakurei-test-ok
          touch /tmp/hakurei-test-done
        '')
      ];

      # Run with Go race detector:
      environment.hakurei = lib.mkIf withRace rec {
        # race detector does not support static linking
        package = (pkgs.callPackage ../package.nix { }).overrideAttrs (previousAttrs: {
          env = previousAttrs.env // {
            GOFLAGS = previousAttrs.env.GOFLAGS + " -race";
          };
        });
        hsuPackage = options.environment.hakurei.hsuPackage.default.override { hakurei = package; };
      };

      imports = [
        ./configuration.nix

        self.nixosModules.hakurei
        self.inputs.home-manager.nixosModules.home-manager
      ];
    };

  # adapted from nixos sway integration tests

  # testScriptWithTypes:49: error: Cannot call function of unknown type
  #           (machine.succeed if succeed else machine.execute)(
  #           ^
  # Found 1 error in 1 file (checked 1 source file)
  skipTypeCheck = true;
  testScript = builtins.readFile ./test.py;
}
