about summary refs log tree commit diff
path: root/pkgs/profpatsch/execline/run-execline-tests.nix
blob: c2c4c23e0711fc516d3e175bac1917f5337982eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
{ stdenv, drvSeqL, runExecline
, ifCommand, redirfdCommand, s6GrepCommand
, importasCommand, s6TouchCommand, s6CatCommand
, execlinebCommand, s6TestCommand, s6ChmodCommand
# https://www.mail-archive.com/skaware@list.skarnet.org/msg01256.html
, coreutils }:

# TODO: run all of these locally! runExeclineLocal

let

  # lol
  writeScript = name: script: runExecline {
    inherit name;
    derivationArgs = {
      inherit script;
      passAsFile = [ "script" ];
    };
    execline = ''
      importas -ui s scriptPath
      importas -ui out out
      foreground {
        ${coreutils}/bin/mv $s $out
      }
      ${s6ChmodCommand} 0755 $out
    '';
   };

  # execline block of depth 1
  block = args: builtins.map (arg: " ${arg}") args ++ [ "" ];

  # derivation that tests whether a given line exists
  # in the given file. Does not use runExecline, because
  # that should be tested after all.
  fileHasLine = line: file: derivation {
    name = "file-${file.name}-has-line";
    inherit (stdenv) system;
    builder = ifCommand;
    args =
      (block [
        redirfdCommand "-r" "0" file   # read file to stdin
        s6GrepCommand "-F" "-q" line      # and grep for the line
      ])
      ++ [
        # if the block succeeded, touch $out
        importasCommand "-ui" "out" "out"
        s6TouchCommand "$out"
      ];
  };

  # basic test that touches out
  basic = runExecline {
    name = "basic";
    execline = ''
      importas -ui out out
      ${s6TouchCommand} $out
    '';
  };

  # whether the stdin argument works as intended
  stdin = fileHasLine "foo" (runExecline {
    name = "stdin";
    stdin = "foo\nbar\nfoo";
    execline = ''
      importas -ui out out
      # this pipes stdout of s6-cat to $out
      # and s6-cat redirects from stdin to stdout
      redirfd -w 1 $out ${s6CatCommand}
    '';
  });

  wrapWithVar = runExecline {
    name = "wrap-with-var";
    builderWrapper = writeScript "var-wrapper" ''
      #!${execlinebCommand} -S0
      export myvar myvalue $@
    '';
    execline = ''
      importas -ui v myvar
      if { ${s6TestCommand} myvalue = $v }
        importas out out
        ${s6TouchCommand} $out
    '';
  };

in args: drvSeqL [ basic stdin wrapWithVar ] (runExecline args)