From 767f80e7296c41a4428c73cadc90b953d252f8d7 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Thu, 28 Aug 2025 20:09:50 +0100 Subject: e2e-tests: Add tests based off of examples in the ccwl manual. --- .guix/e2e-tests.scm | 25 +++- ...pture-output-file-with-parameter-reference.yaml | 4 + e2e-tests/jobs/capture-output-file.yaml | 3 + e2e-tests/jobs/checksum.yaml | 3 + e2e-tests/jobs/decompress-compile-run.yaml | 3 + e2e-tests/jobs/hello.c | 7 ++ e2e-tests/jobs/hello.c.gz | Bin 0 -> 101 bytes e2e-tests/jobs/hello.tar | Bin 0 -> 10240 bytes e2e-tests/jobs/inline-javascript-requirement.json | 1 + e2e-tests/jobs/prefix-arguments.json | 4 + e2e-tests/jobs/scatter.yaml | 5 + e2e-tests/jobs/spell-check-dictionary | 8 ++ e2e-tests/jobs/spell-check-text.txt | 1 + e2e-tests/jobs/spell-check.yaml | 6 + e2e-tests/jobs/staging-input-files.yaml | 3 + e2e-tests/manifest.scm | 2 +- e2e-tests/tests.yaml | 135 +++++++++++++++++++++ ...apture-output-file-with-parameter-reference.scm | 9 ++ e2e-tests/tools/capture-output-file.scm | 9 ++ e2e-tests/tools/capture-stdout.scm | 8 ++ e2e-tests/tools/checksum.scm | 22 ++++ e2e-tests/tools/decompress-compile-run.scm | 22 ++++ e2e-tests/tools/inline-javascript-requirement.scm | 4 + e2e-tests/tools/pass-stdin.scm | 8 ++ e2e-tests/tools/prefix-arguments.scm | 3 + e2e-tests/tools/scatter.scm | 8 ++ e2e-tests/tools/spell-check.scm | 33 +++++ e2e-tests/tools/staging-input-files.scm | 4 + 28 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 e2e-tests/jobs/capture-output-file-with-parameter-reference.yaml create mode 100644 e2e-tests/jobs/capture-output-file.yaml create mode 100644 e2e-tests/jobs/checksum.yaml create mode 100644 e2e-tests/jobs/decompress-compile-run.yaml create mode 100644 e2e-tests/jobs/hello.c create mode 100644 e2e-tests/jobs/hello.c.gz create mode 100644 e2e-tests/jobs/hello.tar create mode 100644 e2e-tests/jobs/inline-javascript-requirement.json create mode 100644 e2e-tests/jobs/prefix-arguments.json create mode 100644 e2e-tests/jobs/scatter.yaml create mode 100644 e2e-tests/jobs/spell-check-dictionary create mode 100644 e2e-tests/jobs/spell-check-text.txt create mode 100644 e2e-tests/jobs/spell-check.yaml create mode 100644 e2e-tests/jobs/staging-input-files.yaml create mode 100644 e2e-tests/tools/capture-output-file-with-parameter-reference.scm create mode 100644 e2e-tests/tools/capture-output-file.scm create mode 100644 e2e-tests/tools/capture-stdout.scm create mode 100644 e2e-tests/tools/checksum.scm create mode 100644 e2e-tests/tools/decompress-compile-run.scm create mode 100644 e2e-tests/tools/inline-javascript-requirement.scm create mode 100644 e2e-tests/tools/pass-stdin.scm create mode 100644 e2e-tests/tools/prefix-arguments.scm create mode 100644 e2e-tests/tools/scatter.scm create mode 100644 e2e-tests/tools/spell-check.scm create mode 100644 e2e-tests/tools/staging-input-files.scm diff --git a/.guix/e2e-tests.scm b/.guix/e2e-tests.scm index 58ba480..eaa249c 100644 --- a/.guix/e2e-tests.scm +++ b/.guix/e2e-tests.scm @@ -50,7 +50,30 @@ <>)))) (define e2e-tools-ccwl-sources - `(("hello-world.scm" . ,(local-file "../e2e-tests/tools/hello-world.scm")))) + `(("capture-output-file.scm" + . ,(local-file "../e2e-tests/tools/capture-output-file.scm")) + ("capture-output-file-with-parameter-reference.scm" + . ,(local-file "../e2e-tests/tools/capture-output-file-with-parameter-reference.scm")) + ("capture-stdout" + . ,(local-file "../e2e-tests/tools/capture-stdout.scm")) + ("checksum" + . ,(local-file "../e2e-tests/tools/checksum.scm")) + ("decompress-compile-run" + . ,(local-file "../e2e-tests/tools/decompress-compile-run.scm")) + ("inline-javascript-requirement" + . ,(local-file "../e2e-tests/tools/inline-javascript-requirement.scm")) + ("hello-world.scm" + . ,(local-file "../e2e-tests/tools/hello-world.scm")) + ("pass-stdin" + . ,(local-file "../e2e-tests/tools/pass-stdin.scm")) + ("prefix-arguments" + . ,(local-file "../e2e-tests/tools/prefix-arguments.scm")) + ("scatter" + . ,(local-file "../e2e-tests/tools/scatter.scm")) + ("spell-check" + . ,(local-file "../e2e-tests/tools/spell-check.scm")) + ("staging-input-files" + . ,(local-file "../e2e-tests/tools/staging-input-files.scm")))) (define e2e-tools (file-union "e2e-tools" diff --git a/e2e-tests/jobs/capture-output-file-with-parameter-reference.yaml b/e2e-tests/jobs/capture-output-file-with-parameter-reference.yaml new file mode 100644 index 0000000..892dbe7 --- /dev/null +++ b/e2e-tests/jobs/capture-output-file-with-parameter-reference.yaml @@ -0,0 +1,4 @@ +archive: + class: File + location: hello.tar +extractfile: hello.txt diff --git a/e2e-tests/jobs/capture-output-file.yaml b/e2e-tests/jobs/capture-output-file.yaml new file mode 100644 index 0000000..faf24d2 --- /dev/null +++ b/e2e-tests/jobs/capture-output-file.yaml @@ -0,0 +1,3 @@ +archive: + class: File + location: hello.tar diff --git a/e2e-tests/jobs/checksum.yaml b/e2e-tests/jobs/checksum.yaml new file mode 100644 index 0000000..dce679c --- /dev/null +++ b/e2e-tests/jobs/checksum.yaml @@ -0,0 +1,3 @@ +file: + class: File + location: hello.tar diff --git a/e2e-tests/jobs/decompress-compile-run.yaml b/e2e-tests/jobs/decompress-compile-run.yaml new file mode 100644 index 0000000..e2a0b74 --- /dev/null +++ b/e2e-tests/jobs/decompress-compile-run.yaml @@ -0,0 +1,3 @@ +compressed_source: + class: File + location: hello.c.gz diff --git a/e2e-tests/jobs/hello.c b/e2e-tests/jobs/hello.c new file mode 100644 index 0000000..07f4fc2 --- /dev/null +++ b/e2e-tests/jobs/hello.c @@ -0,0 +1,7 @@ +#include + +int main () +{ + printf("Hello World!\n"); + return 0; +} diff --git a/e2e-tests/jobs/hello.c.gz b/e2e-tests/jobs/hello.c.gz new file mode 100644 index 0000000..81c4d84 Binary files /dev/null and b/e2e-tests/jobs/hello.c.gz differ diff --git a/e2e-tests/jobs/hello.tar b/e2e-tests/jobs/hello.tar new file mode 100644 index 0000000..edcc4a8 Binary files /dev/null and b/e2e-tests/jobs/hello.tar differ diff --git a/e2e-tests/jobs/inline-javascript-requirement.json b/e2e-tests/jobs/inline-javascript-requirement.json new file mode 100644 index 0000000..32c4275 --- /dev/null +++ b/e2e-tests/jobs/inline-javascript-requirement.json @@ -0,0 +1 @@ +{"number": 13} diff --git a/e2e-tests/jobs/prefix-arguments.json b/e2e-tests/jobs/prefix-arguments.json new file mode 100644 index 0000000..aca82bd --- /dev/null +++ b/e2e-tests/jobs/prefix-arguments.json @@ -0,0 +1,4 @@ +{ + "separator": ",", + "last": 10 +} diff --git a/e2e-tests/jobs/scatter.yaml b/e2e-tests/jobs/scatter.yaml new file mode 100644 index 0000000..702d6f3 --- /dev/null +++ b/e2e-tests/jobs/scatter.yaml @@ -0,0 +1,5 @@ +message: foo +other_messages: + - bar + - foobar + - barbar diff --git a/e2e-tests/jobs/spell-check-dictionary b/e2e-tests/jobs/spell-check-dictionary new file mode 100644 index 0000000..71df044 --- /dev/null +++ b/e2e-tests/jobs/spell-check-dictionary @@ -0,0 +1,8 @@ +brown +dog +fox +jumps +lazy +over +quick +the \ No newline at end of file diff --git a/e2e-tests/jobs/spell-check-text.txt b/e2e-tests/jobs/spell-check-text.txt new file mode 100644 index 0000000..a116b9a --- /dev/null +++ b/e2e-tests/jobs/spell-check-text.txt @@ -0,0 +1 @@ +The quick brown fox jumps over the laazy dog. diff --git a/e2e-tests/jobs/spell-check.yaml b/e2e-tests/jobs/spell-check.yaml new file mode 100644 index 0000000..b01a8e1 --- /dev/null +++ b/e2e-tests/jobs/spell-check.yaml @@ -0,0 +1,6 @@ +text-file: + class: File + location: spell-check-text.txt +dictionary: + class: File + location: spell-check-dictionary diff --git a/e2e-tests/jobs/staging-input-files.yaml b/e2e-tests/jobs/staging-input-files.yaml new file mode 100644 index 0000000..94b5224 --- /dev/null +++ b/e2e-tests/jobs/staging-input-files.yaml @@ -0,0 +1,3 @@ +file: + class: File + location: hello.c diff --git a/e2e-tests/manifest.scm b/e2e-tests/manifest.scm index da7eb55..dfa4780 100644 --- a/e2e-tests/manifest.scm +++ b/e2e-tests/manifest.scm @@ -1,2 +1,2 @@ (specifications->manifest - (list "coreutils")) + (list "coreutils" "gcc-toolchain" "gzip" "tar")) diff --git a/e2e-tests/tests.yaml b/e2e-tests/tests.yaml index 5c0ab22..295e8d7 100644 --- a/e2e-tests/tests.yaml +++ b/e2e-tests/tests.yaml @@ -7,3 +7,138 @@ class: File size: 13 checksum: sha1$47a013e660d408619d894b20806b1d5086aab03b +- id: capture-output-file + doc: Capture output file using a glob + tool: tools/capture-output-file.cwl + job: jobs/capture-output-file.yaml + output: + extracted_file: + class: File + basename: hello.txt + nameroot: hello + nameext: .txt + size: 13 + checksum: sha1$a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b +- id: capture-output-file-with-parameter-reference + doc: Capture output file using a glob and a parameter reference + tool: tools/capture-output-file-with-parameter-reference.cwl + job: jobs/capture-output-file-with-parameter-reference.yaml + output: + extracted_file: + class: File + basename: hello.txt + nameroot: hello + nameext: .txt + size: 13 + checksum: sha1$a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b +- id: capture-stdout + doc: Capture standard output as a file + tool: tools/capture-stdout.cwl + job: jobs/hello-world.yaml + output: + printed_message: + class: File + basename: printed-message-output.txt + nameroot: printed-message-output + nameext: .txt + size: 13 + checksum: sha1$47a013e660d408619d894b20806b1d5086aab03b +- id: checksum + doc: Compute several hashes + tool: tools/checksum.cwl + job: jobs/checksum.yaml + output: + md5: + class: File + basename: md5 + nameroot: md5 + nameext: "" + size: 44 + checksum: sha1$9fa7df2256ce2e726bd9e89485d596b9985971a7 + sha1: + class: File + basename: sha1 + nameroot: sha1 + nameext: "" + size: 52 + checksum: sha1$5beabf5a3d41d2c4a494d4342419894d9d7800e0 + sha256: + class: File + basename: sha256 + nameroot: sha256 + nameext: "" + size: 76 + checksum: sha1$1d4d44c8563d8e5279dd8d0eb1e3e599c7c3ef3f +- id: decompress-compile-run + doc: Decompress a compressed C source file, compile and run it + tool: tools/decompress-compile-run.cwl + job: jobs/decompress-compile-run.yaml + output: + stdout: + class: File + basename: run-output.txt + nameroot: run-output + nameext: .txt + size: 13 + checksum: sha1$a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b +- id: inline-javascript-requirement + doc: Run javascript for InlineJavascriptRequirement + tool: tools/inline-javascript-requirement.cwl + job: jobs/inline-javascript-requirement.json + output: + sum: + class: File + size: 3 + checksum: sha1$030514d80869744a4e2f60d2fd37d6081f5ed01a +- id: pass-stdin + doc: Pass standard input into command + tool: tools/pass-stdin.cwl + job: jobs/checksum.yaml + output: + bytes: + class: File + size: 6 + checksum: sha1$0929a71b2f03c579afed345f79635816595c2041 +- id: prefix-arguments + doc: Command with prefix arguments + tool: tools/prefix-arguments.cwl + job: jobs/prefix-arguments.json + output: + sequence: + class: File + size: 21 + checksum: sha1$474f936f3e4a4db3f01ee46f9fa8fc928a07c2ab +- id: scatter + doc: Workflow with a scattering step + tool: tools/scatter.cwl + job: jobs/scatter.yaml + output: + printed_output: + - class: File + size: 8 + checksum: sha1$d53a205a336e07cf9eac45471b3870f9489288ec + - class: File + size: 11 + checksum: sha1$f784299d4fcaf81aba0b0647264a959fdfe8180d + - class: File + size: 11 + checksum: sha1$b7ee58e14913c07256e9255e69310ddcde4bdb51 +- id: spell-check + doc: Spell-check workflow using Unix utilities + tool: tools/spell-check.cwl + job: jobs/spell-check.yaml + output: + misspellings: + class: File + basename: misspelt-words + size: 6 + checksum: sha1$e701a33e7681ea185a709168c44e13217497d220 +- id: staging-input-files + doc: Stage input files to working directory + tool: tools/staging-input-files.cwl + job: jobs/staging-input-files.yaml + output: + output_file: + class: File + size: 76 + checksum: sha1$a43e1394643339f6a203147ccbf82cc3be1777e0 diff --git a/e2e-tests/tools/capture-output-file-with-parameter-reference.scm b/e2e-tests/tools/capture-output-file-with-parameter-reference.scm new file mode 100644 index 0000000..6bc4b7d --- /dev/null +++ b/e2e-tests/tools/capture-output-file-with-parameter-reference.scm @@ -0,0 +1,9 @@ +(define extract-specific-file + (command #:inputs (archive #:type File) (extractfile #:type string) + #:run "tar" "--extract" "--file" archive extractfile + #:outputs (extracted_file + #:type File + #:binding ((glob . "$(inputs.extractfile)"))))) + +(workflow ((archive #:type File) (extractfile #:type string)) + (extract-specific-file #:archive archive #:extractfile extractfile)) diff --git a/e2e-tests/tools/capture-output-file.scm b/e2e-tests/tools/capture-output-file.scm new file mode 100644 index 0000000..80b4654 --- /dev/null +++ b/e2e-tests/tools/capture-output-file.scm @@ -0,0 +1,9 @@ +(define extract + (command #:inputs (archive #:type File) + #:run "tar" "--extract" "--file" archive + #:outputs (extracted_file + #:type File + #:binding ((glob . "hello.txt"))))) + +(workflow ((archive #:type File)) + (extract #:archive archive)) diff --git a/e2e-tests/tools/capture-stdout.scm b/e2e-tests/tools/capture-stdout.scm new file mode 100644 index 0000000..0901f4d --- /dev/null +++ b/e2e-tests/tools/capture-stdout.scm @@ -0,0 +1,8 @@ +(define print + (command #:inputs (message #:type string) + #:run "echo" message + #:outputs (printed_message #:type stdout) + #:stdout "printed-message-output.txt")) + +(workflow ((message #:type string)) + (print #:message message)) diff --git a/e2e-tests/tools/checksum.scm b/e2e-tests/tools/checksum.scm new file mode 100644 index 0000000..27dec78 --- /dev/null +++ b/e2e-tests/tools/checksum.scm @@ -0,0 +1,22 @@ +(define md5sum + (command #:inputs (file #:type File #:stage? #t) + #:run "md5sum" "$(inputs.file.basename)" + #:outputs (md5 #:type stdout) + #:stdout "md5")) + +(define sha1sum + (command #:inputs (file #:type File #:stage? #t) + #:run "sha1sum" "$(inputs.file.basename)" + #:outputs (sha1 #:type stdout) + #:stdout "sha1")) + +(define sha256sum + (command #:inputs (file #:type File #:stage? #t) + #:run "sha256sum" "$(inputs.file.basename)" + #:outputs (sha256 #:type stdout) + #:stdout "sha256")) + +(workflow ((file #:type File)) + (tee (md5sum #:file file) + (sha1sum #:file file) + (sha256sum #:file file))) diff --git a/e2e-tests/tools/decompress-compile-run.scm b/e2e-tests/tools/decompress-compile-run.scm new file mode 100644 index 0000000..884f6a4 --- /dev/null +++ b/e2e-tests/tools/decompress-compile-run.scm @@ -0,0 +1,22 @@ +(define decompress + (command #:inputs (compressed #:type File) + #:run "gzip" "--stdout" "--decompress" compressed + #:outputs (decompressed #:type stdout))) + +(define compile + (command #:inputs (source #:type File) + #:run "gcc" "-x" "c" source + #:outputs (executable + #:type File + #:binding ((glob . "a.out"))))) + +(define run + (command #:inputs executable + #:run executable + #:outputs (stdout #:type stdout) + #:stdout "run-output.txt")) + +(workflow ((compressed_source #:type File)) + (pipe (decompress #:compressed compressed_source) + (compile #:source decompressed) + (run #:executable executable))) diff --git a/e2e-tests/tools/inline-javascript-requirement.scm b/e2e-tests/tools/inline-javascript-requirement.scm new file mode 100644 index 0000000..cd6a4e5 --- /dev/null +++ b/e2e-tests/tools/inline-javascript-requirement.scm @@ -0,0 +1,4 @@ +(command #:inputs (number #:type int) + #:run "echo" "$(1 + inputs.number)" + #:outputs (sum #:type stdout) + #:requirements ((InlineJavascriptRequirement))) diff --git a/e2e-tests/tools/pass-stdin.scm b/e2e-tests/tools/pass-stdin.scm new file mode 100644 index 0000000..4ba251c --- /dev/null +++ b/e2e-tests/tools/pass-stdin.scm @@ -0,0 +1,8 @@ +(define count-bytes + (command #:inputs (file #:type File) + #:run "wc" "-c" + #:outputs (bytes #:type stdout) + #:stdin file)) + +(workflow ((file #:type File)) + (count-bytes #:file file)) diff --git a/e2e-tests/tools/prefix-arguments.scm b/e2e-tests/tools/prefix-arguments.scm new file mode 100644 index 0000000..d680ace --- /dev/null +++ b/e2e-tests/tools/prefix-arguments.scm @@ -0,0 +1,3 @@ +(command #:inputs (last #:type int) (separator #:type string) + #:run "seq" ("-s" separator) last + #:outputs (sequence #:type stdout)) diff --git a/e2e-tests/tools/scatter.scm b/e2e-tests/tools/scatter.scm new file mode 100644 index 0000000..805f4df --- /dev/null +++ b/e2e-tests/tools/scatter.scm @@ -0,0 +1,8 @@ +(define print + (command #:inputs (message #:type string) (other-message #:type string) + #:run "echo" message other-message + #:outputs (printed_output #:type stdout))) + +(workflow ((message #:type string) (other_messages #:type (array string))) + (scatter (print #:message message) + #:other-message other_messages)) diff --git a/e2e-tests/tools/spell-check.scm b/e2e-tests/tools/spell-check.scm new file mode 100644 index 0000000..d5ccebb --- /dev/null +++ b/e2e-tests/tools/spell-check.scm @@ -0,0 +1,33 @@ +(define split-words + (command #:inputs text + #:run "tr" "--complement" "--squeeze-repeats" "A-Za-z" "\\n" + #:stdin text + #:outputs (words #:type stdout))) + +(define downcase + (command #:inputs words + #:run "tr" "A-Z" "a-z" + #:stdin words + #:outputs (downcased-words #:type stdout))) + +(define sort + (command #:inputs words + #:run "sort" "--unique" + #:stdin words + #:outputs (sorted #:type stdout))) + +(define find-misspellings + (command #:inputs words dictionary + #:run "comm" "-23" words dictionary + #:outputs (misspellings #:type stdout) + #:stdout "misspelt-words")) + +(workflow (text-file dictionary) + (pipe (tee (pipe (split-words #:text text-file) + (downcase #:words words) + (sort (sort-words) #:words downcased-words) + (rename #:sorted-words sorted)) + (pipe (sort (sort-dictionary) #:words dictionary) + (rename #:sorted-dictionary sorted))) + (find-misspellings #:words sorted-words + #:dictionary sorted-dictionary))) diff --git a/e2e-tests/tools/staging-input-files.scm b/e2e-tests/tools/staging-input-files.scm new file mode 100644 index 0000000..f81ee47 --- /dev/null +++ b/e2e-tests/tools/staging-input-files.scm @@ -0,0 +1,4 @@ +(command #:inputs (file #:type File + #:stage? #t) + #:run "cat" "./$(inputs.file.basename)" + #:outputs (output_file #:type stdout)) -- cgit 1.4.1