From e55f96a3542803682055511eee82dff842efa4d8 Mon Sep 17 00:00:00 2001 From: David Leong <116610336+leongdl@users.noreply.github.com> Date: Sat, 1 Aug 2026 19:35:21 -0700 Subject: [PATCH] test: Add base 2023-09 conformance fixtures for coverage gaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 34 new fixtures plus 6 strengthened: INT/FLOAT numeric boundary accepts, inclusive-boundary accepts, onExit-runs, cancelation defaults, SimpleAction argv desugaring, reference-grammar negatives, cross-type field misuse, EXPR/FEATURE_BUNDLE_1 gating from the base side, post-resolution name length, and off-diagonal forbidden lines added to six associative combination fixtures. Suite: 655 -> 687 passing. Spec-correct fixtures that FAIL against current implementations (the int64 acceptance family, type-name case gate, merge widening) are split to conformance-base-expected-failures. Review: quorum-review fixes — moved 2.3--int-value-above-int64-max .invalid.test to the expected-failures PR's proposed/ (the base spec states no int64 bound and openjd-model 0.11.2 accepts 2^63, so the fixture fails the reference implementation; it documents a defect, not settled spec); closed the two remaining partial-association escapes with extra forbidden lines in 3.4.3--associative-three-parameters and 3.4.3--product-with-associative; onexit header no longer claims a timing the runner cannot assert; float-boundary assertions accept both 0.5 and 0.50 renderings via anyOf; documented the deliberate duplication of the base let-gating template. Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com> --- .../jobs/8--simple-action-bash-argv.test.yaml | 26 ++++++++++++++ .../8--simple-action-python-argv.test.yaml | 22 ++++++++++++ .../2--unknown-key-in-param.invalid.yaml | 16 +++++++++ .../2.1--minvalue-on-string.invalid.yaml | 16 +++++++++ .../2.1--string-length-at-maxlength.yaml | 17 +++++++++ .../2.1--string-length-at-minlength.yaml | 17 +++++++++ .../2.3--int-allowedvalues-int64-max.yaml | 17 +++++++++ .../2.3--int-default-int64-max.yaml | 16 +++++++++ .../2.3--int-default-int64-min.yaml | 16 +++++++++ .../2.3--int-maxvalue-int64-max.yaml | 16 +++++++++ .../2.3--int-minvalue-int64-max.yaml | 16 +++++++++ .../2.3--minlength-on-int.invalid.yaml | 16 +++++++++ .../2.4--float-default-1e308.yaml | 16 +++++++++ .../2.4--float-default-1e309.invalid.yaml | 16 +++++++++ .../2.4--float-default-inf.invalid.yaml | 16 +++++++++ .../2.4--float-default-nan.invalid.yaml | 16 +++++++++ ...-in-step-script-requires-expr.invalid.yaml | 14 ++++++++ ...n-step-template-requires-expr.invalid.yaml | 16 +++++++++ ...5.3--cancelation-missing-mode.invalid.yaml | 14 ++++++++ ...-mode-requires-feature-bundle.invalid.yaml | 18 ++++++++++ ...-terminate-with-notify-period.invalid.yaml | 15 ++++++++ .../7.3--bare-reference.invalid.yaml | 11 ++++++ ....3--reference-dash-in-segment.invalid.yaml | 11 ++++++ ...reference-digit-start-segment.invalid.yaml | 11 ++++++ .../7.3--reference-empty-segment.invalid.yaml | 11 ++++++ .../7.3--reference-trailing-dot.invalid.yaml | 11 ++++++ ...ction-requires-feature-bundle.invalid.yaml | 8 +++++ .../1.1.1--resolved-name-128-chars.test.yaml | 21 +++++++++++ ...-resolved-name-129-chars.invalid.test.yaml | 19 ++++++++++ ...-int-value-at-min-max-boundaries.test.yaml | 28 +++++++++++++++ .../jobs/2.3--int-value-int64-max.test.yaml | 21 +++++++++++ ...loat-value-at-min-max-boundaries.test.yaml | 34 ++++++++++++++++++ ....3--associative-three-parameters.test.yaml | 8 +++++ ....4.3--associative-two-parameters.test.yaml | 3 ++ ...3.4.3--mixed-associative-product.test.yaml | 4 +++ .../jobs/3.4.3--nested-associative.test.yaml | 3 ++ ...ested-product-within-associative.test.yaml | 3 ++ .../3.4.3--product-with-associative.test.yaml | 7 ++++ .../base/jobs/4.3--onexit-runs.test.yaml | 35 +++++++++++++++++++ 39 files changed, 601 insertions(+) create mode 100644 conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-bash-argv.test.yaml create mode 100644 conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-python-argv.test.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2--unknown-key-in-param.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.1--minvalue-on-string.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.1--string-length-at-maxlength.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.1--string-length-at-minlength.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.3--int-allowedvalues-int64-max.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-max.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-min.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.3--int-maxvalue-int64-max.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.3--int-minvalue-int64-max.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.3--minlength-on-int.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.4--float-default-1e308.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.4--float-default-1e309.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.4--float-default-inf.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/2.4--float-default-nan.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/3.6--let-in-step-script-requires-expr.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/3.6--let-in-step-template-requires-expr.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/5.3--cancelation-missing-mode.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/5.3--fmtstring-mode-requires-feature-bundle.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/5.3.1--terminate-with-notify-period.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/7.3--bare-reference.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/7.3--reference-dash-in-segment.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/7.3--reference-digit-start-segment.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/7.3--reference-empty-segment.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/7.3--reference-trailing-dot.invalid.yaml create mode 100644 conformance-tests/2023-09/base/job_templates/8--simple-action-requires-feature-bundle.invalid.yaml create mode 100644 conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-128-chars.test.yaml create mode 100644 conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-129-chars.invalid.test.yaml create mode 100644 conformance-tests/2023-09/base/jobs/2.3--int-value-at-min-max-boundaries.test.yaml create mode 100644 conformance-tests/2023-09/base/jobs/2.3--int-value-int64-max.test.yaml create mode 100644 conformance-tests/2023-09/base/jobs/2.4--float-value-at-min-max-boundaries.test.yaml create mode 100644 conformance-tests/2023-09/base/jobs/4.3--onexit-runs.test.yaml diff --git a/conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-bash-argv.test.yaml b/conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-bash-argv.test.yaml new file mode 100644 index 00000000..561da9cf --- /dev/null +++ b/conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-bash-argv.test.yaml @@ -0,0 +1,26 @@ +# Pins the bash SimpleAction desugaring contract: $0 is the implicitly generated +# embedded file with a .sh extension, and user args follow it. +runOn: +- posix +template: + specificationVersion: jobtemplate-2023-09 + extensions: + - FEATURE_BUNDLE_1 + name: TestJob + steps: + - name: Step1 + bash: + args: + - --marker-arg + script: | + case "$0" in + *.sh) echo "EXT_IS_SH:True";; + *) echo "EXT_IS_SH:False";; + esac + echo "FIRST_ARG:$1" +expected: + output: + - EXT_IS_SH:True + - FIRST_ARG:--marker-arg + forbidden: + - EXT_IS_SH:False diff --git a/conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-python-argv.test.yaml b/conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-python-argv.test.yaml new file mode 100644 index 00000000..99f69564 --- /dev/null +++ b/conformance-tests/2023-09/FEATURE_BUNDLE_1/jobs/8--simple-action-python-argv.test.yaml @@ -0,0 +1,22 @@ +# Pins the python SimpleAction desugaring contract: argv[0] is the implicitly generated +# embedded file with a .py extension, and user args follow it. +template: + specificationVersion: jobtemplate-2023-09 + extensions: + - FEATURE_BUNDLE_1 + name: TestJob + steps: + - name: Step1 + python: + args: + - --marker-arg + script: | + import sys + print('EXT_IS_PY:' + str(sys.argv[0].endswith('.py'))) + print('FIRST_ARG:' + sys.argv[1]) +expected: + output: + - EXT_IS_PY:True + - FIRST_ARG:--marker-arg + forbidden: + - EXT_IS_PY:False diff --git a/conformance-tests/2023-09/base/job_templates/2--unknown-key-in-param.invalid.yaml b/conformance-tests/2023-09/base/job_templates/2--unknown-key-in-param.invalid.yaml new file mode 100644 index 00000000..c6a8d734 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2--unknown-key-in-param.invalid.yaml @@ -0,0 +1,16 @@ +# Parameter definition objects are closed; an unknown key inside one must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: STRING + unknownExtraField: value +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" diff --git a/conformance-tests/2023-09/base/job_templates/2.1--minvalue-on-string.invalid.yaml b/conformance-tests/2023-09/base/job_templates/2.1--minvalue-on-string.invalid.yaml new file mode 100644 index 00000000..10618bfe --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.1--minvalue-on-string.invalid.yaml @@ -0,0 +1,16 @@ +# minValue is not a JobStringParameterDefinition field; a STRING parameter with minValue must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: STRING + minValue: 1 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" diff --git a/conformance-tests/2023-09/base/job_templates/2.1--string-length-at-maxlength.yaml b/conformance-tests/2023-09/base/job_templates/2.1--string-length-at-maxlength.yaml new file mode 100644 index 00000000..186a0106 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.1--string-length-at-maxlength.yaml @@ -0,0 +1,17 @@ +# A STRING parameter default whose length exactly equals maxLength is accepted (bound is inclusive). +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: STRING + maxLength: 5 + default: abcde +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.1--string-length-at-minlength.yaml b/conformance-tests/2023-09/base/job_templates/2.1--string-length-at-minlength.yaml new file mode 100644 index 00000000..4e52a231 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.1--string-length-at-minlength.yaml @@ -0,0 +1,17 @@ +# A STRING parameter default whose length exactly equals minLength is accepted (bound is inclusive). +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: STRING + minLength: 3 + default: abc +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.3--int-allowedvalues-int64-max.yaml b/conformance-tests/2023-09/base/job_templates/2.3--int-allowedvalues-int64-max.yaml new file mode 100644 index 00000000..56317524 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.3--int-allowedvalues-int64-max.yaml @@ -0,0 +1,17 @@ +# An INT parameter allowedValues entry of 2^63-1 (largest signed 64-bit integer) is a valid integer value. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: INT + allowedValues: + - 9223372036854775807 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-max.yaml b/conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-max.yaml new file mode 100644 index 00000000..5a1053cd --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-max.yaml @@ -0,0 +1,16 @@ +# An INT parameter default of 2^63-1 (largest signed 64-bit integer) is a valid integer value. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: INT + default: 9223372036854775807 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-min.yaml b/conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-min.yaml new file mode 100644 index 00000000..c43d45af --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.3--int-default-int64-min.yaml @@ -0,0 +1,16 @@ +# An INT parameter default of -2^63 (smallest signed 64-bit integer) is a valid integer value. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: INT + default: -9223372036854775808 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.3--int-maxvalue-int64-max.yaml b/conformance-tests/2023-09/base/job_templates/2.3--int-maxvalue-int64-max.yaml new file mode 100644 index 00000000..1e4f2eed --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.3--int-maxvalue-int64-max.yaml @@ -0,0 +1,16 @@ +# An INT parameter maxValue of 2^63-1 (largest signed 64-bit integer) is a valid integer value. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: INT + maxValue: 9223372036854775807 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.3--int-minvalue-int64-max.yaml b/conformance-tests/2023-09/base/job_templates/2.3--int-minvalue-int64-max.yaml new file mode 100644 index 00000000..22aa927b --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.3--int-minvalue-int64-max.yaml @@ -0,0 +1,16 @@ +# An INT parameter minValue of 2^63-1 (largest signed 64-bit integer) is a valid integer value. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: INT + minValue: 9223372036854775807 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.3--minlength-on-int.invalid.yaml b/conformance-tests/2023-09/base/job_templates/2.3--minlength-on-int.invalid.yaml new file mode 100644 index 00000000..e98c5413 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.3--minlength-on-int.invalid.yaml @@ -0,0 +1,16 @@ +# minLength is not a JobIntParameterDefinition field; an INT parameter with minLength must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: INT + minLength: 1 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" diff --git a/conformance-tests/2023-09/base/job_templates/2.4--float-default-1e308.yaml b/conformance-tests/2023-09/base/job_templates/2.4--float-default-1e308.yaml new file mode 100644 index 00000000..751c1e11 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.4--float-default-1e308.yaml @@ -0,0 +1,16 @@ +# A FLOAT parameter default of 1e308 is within the double-precision range and is valid. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: FLOAT + default: 1.0e+308 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.4--float-default-1e309.invalid.yaml b/conformance-tests/2023-09/base/job_templates/2.4--float-default-1e309.invalid.yaml new file mode 100644 index 00000000..01333a82 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.4--float-default-1e309.invalid.yaml @@ -0,0 +1,16 @@ +# A FLOAT parameter default of 1e309 overflows double precision (infinity) and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: FLOAT + default: 1.0e+309 +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.4--float-default-inf.invalid.yaml b/conformance-tests/2023-09/base/job_templates/2.4--float-default-inf.invalid.yaml new file mode 100644 index 00000000..abeecea6 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.4--float-default-inf.invalid.yaml @@ -0,0 +1,16 @@ +# A FLOAT parameter default of infinity is not a base-10 floating point value and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: FLOAT + default: .inf +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/2.4--float-default-nan.invalid.yaml b/conformance-tests/2023-09/base/job_templates/2.4--float-default-nan.invalid.yaml new file mode 100644 index 00000000..e5c087bc --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/2.4--float-default-nan.invalid.yaml @@ -0,0 +1,16 @@ +# A FLOAT parameter default of NaN is not a base-10 floating point value and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: MyParam + type: FLOAT + default: .nan +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print('{{Param.MyParam}}')" diff --git a/conformance-tests/2023-09/base/job_templates/3.6--let-in-step-script-requires-expr.invalid.yaml b/conformance-tests/2023-09/base/job_templates/3.6--let-in-step-script-requires-expr.invalid.yaml new file mode 100644 index 00000000..f51ac926 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/3.6--let-in-step-script-requires-expr.invalid.yaml @@ -0,0 +1,14 @@ +# StepScript 'let' requires the EXPR extension (spec 3.6); in base it must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + let: + - x = 1 + actions: + onRun: + command: python + args: + - "-c" + - "print()" diff --git a/conformance-tests/2023-09/base/job_templates/3.6--let-in-step-template-requires-expr.invalid.yaml b/conformance-tests/2023-09/base/job_templates/3.6--let-in-step-template-requires-expr.invalid.yaml new file mode 100644 index 00000000..4e8505cf --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/3.6--let-in-step-template-requires-expr.invalid.yaml @@ -0,0 +1,16 @@ +# StepTemplate 'let' requires the EXPR extension (spec 3.6); in base it must be rejected. +# (Template body deliberately mirrors EXPR/job_templates/3.6--let-requires-expr +# .invalid.yaml: base-only conformance runs need their own copy of the gate.) +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + let: + - x = 1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" diff --git a/conformance-tests/2023-09/base/job_templates/5.3--cancelation-missing-mode.invalid.yaml b/conformance-tests/2023-09/base/job_templates/5.3--cancelation-missing-mode.invalid.yaml new file mode 100644 index 00000000..77ebe678 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/5.3--cancelation-missing-mode.invalid.yaml @@ -0,0 +1,14 @@ +# A cancelation object without the 'mode' key matches neither CancelationMethod form and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" + cancelation: + notifyPeriodInSeconds: 30 diff --git a/conformance-tests/2023-09/base/job_templates/5.3--fmtstring-mode-requires-feature-bundle.invalid.yaml b/conformance-tests/2023-09/base/job_templates/5.3--fmtstring-mode-requires-feature-bundle.invalid.yaml new file mode 100644 index 00000000..810d1fd1 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/5.3--fmtstring-mode-requires-feature-bundle.invalid.yaml @@ -0,0 +1,18 @@ +# A format-string cancelation mode requires the FEATURE_BUNDLE_1 extension; in base it must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +parameterDefinitions: +- name: Mode + type: STRING + default: TERMINATE +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" + cancelation: + mode: "{{Param.Mode}}" diff --git a/conformance-tests/2023-09/base/job_templates/5.3.1--terminate-with-notify-period.invalid.yaml b/conformance-tests/2023-09/base/job_templates/5.3.1--terminate-with-notify-period.invalid.yaml new file mode 100644 index 00000000..7ba13c96 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/5.3.1--terminate-with-notify-period.invalid.yaml @@ -0,0 +1,15 @@ +# CancelationMethodTerminate (5.3.1) has only the 'mode' key; notifyPeriodInSeconds with TERMINATE must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: python + args: + - "-c" + - "print()" + cancelation: + mode: TERMINATE + notifyPeriodInSeconds: 30 diff --git a/conformance-tests/2023-09/base/job_templates/7.3--bare-reference.invalid.yaml b/conformance-tests/2023-09/base/job_templates/7.3--bare-reference.invalid.yaml new file mode 100644 index 00000000..47356e22 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/7.3--bare-reference.invalid.yaml @@ -0,0 +1,11 @@ +# A bare dot-free reference {{MyParam}} names no value defined in base scope and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: echo + args: + - "{{MyParam}}" diff --git a/conformance-tests/2023-09/base/job_templates/7.3--reference-dash-in-segment.invalid.yaml b/conformance-tests/2023-09/base/job_templates/7.3--reference-dash-in-segment.invalid.yaml new file mode 100644 index 00000000..4b926c7e --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/7.3--reference-dash-in-segment.invalid.yaml @@ -0,0 +1,11 @@ +# A reference segment containing a dash ({{Param.a-b}}) is not a valid Identifier and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: echo + args: + - "{{Param.a-b}}" diff --git a/conformance-tests/2023-09/base/job_templates/7.3--reference-digit-start-segment.invalid.yaml b/conformance-tests/2023-09/base/job_templates/7.3--reference-digit-start-segment.invalid.yaml new file mode 100644 index 00000000..7ea5b7c5 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/7.3--reference-digit-start-segment.invalid.yaml @@ -0,0 +1,11 @@ +# A reference segment starting with a digit ({{Param.1X}}) is not a valid Identifier and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: echo + args: + - "{{Param.1X}}" diff --git a/conformance-tests/2023-09/base/job_templates/7.3--reference-empty-segment.invalid.yaml b/conformance-tests/2023-09/base/job_templates/7.3--reference-empty-segment.invalid.yaml new file mode 100644 index 00000000..995040b0 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/7.3--reference-empty-segment.invalid.yaml @@ -0,0 +1,11 @@ +# A reference with an empty inner segment ({{Param..X}}) is not a valid Name production and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: echo + args: + - "{{Param..X}}" diff --git a/conformance-tests/2023-09/base/job_templates/7.3--reference-trailing-dot.invalid.yaml b/conformance-tests/2023-09/base/job_templates/7.3--reference-trailing-dot.invalid.yaml new file mode 100644 index 00000000..377cd181 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/7.3--reference-trailing-dot.invalid.yaml @@ -0,0 +1,11 @@ +# A reference with a trailing dot ({{Param.}}) has an empty final segment and must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + script: + actions: + onRun: + command: echo + args: + - "{{Param.}}" diff --git a/conformance-tests/2023-09/base/job_templates/8--simple-action-requires-feature-bundle.invalid.yaml b/conformance-tests/2023-09/base/job_templates/8--simple-action-requires-feature-bundle.invalid.yaml new file mode 100644 index 00000000..2cbf0d20 --- /dev/null +++ b/conformance-tests/2023-09/base/job_templates/8--simple-action-requires-feature-bundle.invalid.yaml @@ -0,0 +1,8 @@ +# SimpleAction sugar keys (bash/cmd/node/powershell/python) require FEATURE_BUNDLE_1; in base they must be rejected. +specificationVersion: jobtemplate-2023-09 +name: TestJob +steps: +- name: Step1 + bash: + script: | + echo hello diff --git a/conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-128-chars.test.yaml b/conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-128-chars.test.yaml new file mode 100644 index 00000000..f5764fcc --- /dev/null +++ b/conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-128-chars.test.yaml @@ -0,0 +1,21 @@ +# A job name format string resolving to exactly 128 characters is accepted (limit is inclusive, +# measured after resolution per spec 1.1.1). +template: + specificationVersion: jobtemplate-2023-09 + name: X{{Param.Suffix}} + parameterDefinitions: + - name: Suffix + type: STRING + default: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + steps: + - name: Step1 + script: + actions: + onRun: + command: python + args: + - -c + - print(r'NAME_LENGTH_OK') +expected: + output: + - NAME_LENGTH_OK diff --git a/conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-129-chars.invalid.test.yaml b/conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-129-chars.invalid.test.yaml new file mode 100644 index 00000000..974ea5eb --- /dev/null +++ b/conformance-tests/2023-09/base/jobs/1.1.1--resolved-name-129-chars.invalid.test.yaml @@ -0,0 +1,19 @@ +# A job name format string resolving to 129 characters exceeds the 128-character post-resolution +# limit (spec 1.1.1) and must be rejected at job creation. The literal is short, so only a +# post-resolution check catches this. +template: + specificationVersion: jobtemplate-2023-09 + name: XY{{Param.Suffix}} + parameterDefinitions: + - name: Suffix + type: STRING + default: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + steps: + - name: Step1 + script: + actions: + onRun: + command: python + args: + - -c + - print(r'SHOULD_NOT_RUN') diff --git a/conformance-tests/2023-09/base/jobs/2.3--int-value-at-min-max-boundaries.test.yaml b/conformance-tests/2023-09/base/jobs/2.3--int-value-at-min-max-boundaries.test.yaml new file mode 100644 index 00000000..3e23fb39 --- /dev/null +++ b/conformance-tests/2023-09/base/jobs/2.3--int-value-at-min-max-boundaries.test.yaml @@ -0,0 +1,28 @@ +# Supplied INT values exactly equal to minValue and maxValue are accepted (bounds are inclusive). +template: + specificationVersion: jobtemplate-2023-09 + name: TestJob + parameterDefinitions: + - name: AtMin + type: INT + minValue: 10 + maxValue: 100 + - name: AtMax + type: INT + minValue: 10 + maxValue: 100 + steps: + - name: Step1 + script: + actions: + onRun: + command: python + args: + - -c + - print(r'BOUNDS:min={{Param.AtMin}},max={{Param.AtMax}}') +parameters: + AtMin: 10 + AtMax: 100 +expected: + output: + - BOUNDS:min=10,max=100 diff --git a/conformance-tests/2023-09/base/jobs/2.3--int-value-int64-max.test.yaml b/conformance-tests/2023-09/base/jobs/2.3--int-value-int64-max.test.yaml new file mode 100644 index 00000000..de1447a5 --- /dev/null +++ b/conformance-tests/2023-09/base/jobs/2.3--int-value-int64-max.test.yaml @@ -0,0 +1,21 @@ +# A supplied INT parameter value of 2^63-1 (largest signed 64-bit integer) is accepted and resolves exactly. +template: + specificationVersion: jobtemplate-2023-09 + name: TestJob + parameterDefinitions: + - name: MyParam + type: INT + steps: + - name: Step1 + script: + actions: + onRun: + command: python + args: + - -c + - print(r'OUTPUT:{{Param.MyParam}}') +parameters: + MyParam: 9223372036854775807 +expected: + output: + - OUTPUT:9223372036854775807 diff --git a/conformance-tests/2023-09/base/jobs/2.4--float-value-at-min-max-boundaries.test.yaml b/conformance-tests/2023-09/base/jobs/2.4--float-value-at-min-max-boundaries.test.yaml new file mode 100644 index 00000000..9ca2705b --- /dev/null +++ b/conformance-tests/2023-09/base/jobs/2.4--float-value-at-min-max-boundaries.test.yaml @@ -0,0 +1,34 @@ +# Supplied FLOAT values exactly equal to minValue and maxValue are accepted (bounds are inclusive). +template: + specificationVersion: jobtemplate-2023-09 + name: TestJob + parameterDefinitions: + - name: AtMin + type: FLOAT + minValue: 0.5 + maxValue: 99.5 + - name: AtMax + type: FLOAT + minValue: 0.5 + maxValue: 99.5 + steps: + - name: Step1 + script: + actions: + onRun: + command: python + args: + - -c + - print(r'BOUNDS:min={{Param.AtMin}},max={{Param.AtMax}}') +parameters: + AtMin: 0.5 + AtMax: 99.5 +# anyOf: the spec fixes no canonical float rendering; 0.5/99.5 are exactly +# representable so shortest-round-trip implementations print them as +# written, but a fixed-precision printer ("0.50") still honors the +# inclusive bounds under test. +expected: + output: + - anyOf: + - BOUNDS:min=0.5,max=99.5 + - BOUNDS:min=0.50,max=99.50 diff --git a/conformance-tests/2023-09/base/jobs/3.4.3--associative-three-parameters.test.yaml b/conformance-tests/2023-09/base/jobs/3.4.3--associative-three-parameters.test.yaml index ae4fbbb6..7e0f20d3 100644 --- a/conformance-tests/2023-09/base/jobs/3.4.3--associative-three-parameters.test.yaml +++ b/conformance-tests/2023-09/base/jobs/3.4.3--associative-three-parameters.test.yaml @@ -35,3 +35,11 @@ expected: forbidden: - TASK:A=0,B=y,C=True - TASK:A=2,B=0,C=True + - TASK:A=1,B=x,C=False + - TASK:A=1,B=y,C=False + - TASK:A=2,B=x,C=True + # The next two close the last partial-association escape: an + # implementation zipping (A,C) while producting B emits exactly + # (1,y,True) and (2,x,False) beyond the expected pair. + - TASK:A=1,B=y,C=True + - TASK:A=2,B=x,C=False diff --git a/conformance-tests/2023-09/base/jobs/3.4.3--associative-two-parameters.test.yaml b/conformance-tests/2023-09/base/jobs/3.4.3--associative-two-parameters.test.yaml index e9c17b71..b7780b4b 100644 --- a/conformance-tests/2023-09/base/jobs/3.4.3--associative-two-parameters.test.yaml +++ b/conformance-tests/2023-09/base/jobs/3.4.3--associative-two-parameters.test.yaml @@ -33,3 +33,6 @@ expected: forbidden: - TASK:A=0,B=z - TASK:A=2,B=0 + - TASK:A=1,B=y + - TASK:A=2,B=x + - TASK:A=3,B=x diff --git a/conformance-tests/2023-09/base/jobs/3.4.3--mixed-associative-product.test.yaml b/conformance-tests/2023-09/base/jobs/3.4.3--mixed-associative-product.test.yaml index d3b193bb..2d424300 100644 --- a/conformance-tests/2023-09/base/jobs/3.4.3--mixed-associative-product.test.yaml +++ b/conformance-tests/2023-09/base/jobs/3.4.3--mixed-associative-product.test.yaml @@ -37,3 +37,7 @@ expected: forbidden: - TASK:A=0,B=y,C=True - TASK:A=2,B=0,C=True + - TASK:A=1,B=y,C=True + - TASK:A=1,B=y,C=False + - TASK:A=2,B=x,C=True + - TASK:A=2,B=x,C=False diff --git a/conformance-tests/2023-09/base/jobs/3.4.3--nested-associative.test.yaml b/conformance-tests/2023-09/base/jobs/3.4.3--nested-associative.test.yaml index 5daa0cc0..a7fb7b47 100644 --- a/conformance-tests/2023-09/base/jobs/3.4.3--nested-associative.test.yaml +++ b/conformance-tests/2023-09/base/jobs/3.4.3--nested-associative.test.yaml @@ -35,3 +35,6 @@ expected: forbidden: - TASK:A=0,B=y,C=True - TASK:A=2,B=0,C=True + - TASK:A=1,B=x,C=False + - TASK:A=1,B=y,C=True + - TASK:A=2,B=x,C=False diff --git a/conformance-tests/2023-09/base/jobs/3.4.3--nested-product-within-associative.test.yaml b/conformance-tests/2023-09/base/jobs/3.4.3--nested-product-within-associative.test.yaml index 22453f1f..9d095be6 100644 --- a/conformance-tests/2023-09/base/jobs/3.4.3--nested-product-within-associative.test.yaml +++ b/conformance-tests/2023-09/base/jobs/3.4.3--nested-product-within-associative.test.yaml @@ -42,3 +42,6 @@ expected: forbidden: - TASK:A=0,B=y,C=10,D=b - TASK:A=2,B=0,C=10,D=b + - TASK:A=1,B=x,C=10,D=b + - TASK:A=1,B=x,C=20,D=a + - TASK:A=2,B=y,C=10,D=a diff --git a/conformance-tests/2023-09/base/jobs/3.4.3--product-with-associative.test.yaml b/conformance-tests/2023-09/base/jobs/3.4.3--product-with-associative.test.yaml index f7db10c6..9409dfb5 100644 --- a/conformance-tests/2023-09/base/jobs/3.4.3--product-with-associative.test.yaml +++ b/conformance-tests/2023-09/base/jobs/3.4.3--product-with-associative.test.yaml @@ -37,3 +37,10 @@ expected: forbidden: - TASK:A=0,B=y,C=True - TASK:A=2,B=0,C=True + - TASK:A=1,B=x,C=False + - TASK:A=2,B=y,C=True + # All four combos unique to the full A*B*C product are forbidden + # (matching the mixed-associative-product twin), so a product- + # instead-of-zip implementation cannot slip through on any pairing. + - TASK:A=1,B=y,C=True + - TASK:A=2,B=x,C=False diff --git a/conformance-tests/2023-09/base/jobs/4.3--onexit-runs.test.yaml b/conformance-tests/2023-09/base/jobs/4.3--onexit-runs.test.yaml new file mode 100644 index 00000000..f7d602bb --- /dev/null +++ b/conformance-tests/2023-09/base/jobs/4.3--onexit-runs.test.yaml @@ -0,0 +1,35 @@ +# An environment's onExit action RUNS: its marker must appear in the output. +# (Presence only — the runner's unordered matching cannot pin WHEN it ran; +# enter-before-task-before-exit ordering needs the harness branch's +# outputSequence and is not asserted here.) +template: + specificationVersion: jobtemplate-2023-09 + name: TestJob + jobEnvironments: + - name: MarkerEnv + script: + actions: + onEnter: + command: python + args: + - -c + - print(r'ONENTER_MARKER') + onExit: + command: python + args: + - -c + - print(r'ONEXIT_MARKER') + steps: + - name: Step1 + script: + actions: + onRun: + command: python + args: + - -c + - print(r'ONRUN_MARKER') +expected: + output: + - ONENTER_MARKER + - ONRUN_MARKER + - ONEXIT_MARKER