@voxgig/sdkgen 4.8.2 → 4.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/action/doctor.d.ts +1 -0
- package/dist/action/doctor.js +50 -2
- package/dist/action/doctor.js.map +1 -1
- package/dist/helpers/naming.js +4 -2
- package/dist/helpers/naming.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/model/sdkgen.aon +21 -0
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +120 -18
- package/project/.sdk/model/target/c.aon +10 -0
- package/project/.sdk/model/target/clojure.aon +13 -0
- package/project/.sdk/model/target/cpp.aon +10 -0
- package/project/.sdk/model/target/csharp.aon +9 -0
- package/project/.sdk/model/target/dart.aon +10 -0
- package/project/.sdk/model/target/elixir.aon +9 -0
- package/project/.sdk/model/target/go.aon +13 -0
- package/project/.sdk/model/target/java.aon +9 -0
- package/project/.sdk/model/target/js.aon +7 -0
- package/project/.sdk/model/target/kotlin.aon +9 -0
- package/project/.sdk/model/target/lean.aon +17 -0
- package/project/.sdk/model/target/lua.aon +8 -0
- package/project/.sdk/model/target/ocaml.aon +9 -0
- package/project/.sdk/model/target/perl.aon +8 -0
- package/project/.sdk/model/target/php.aon +8 -0
- package/project/.sdk/model/target/py.aon +13 -0
- package/project/.sdk/model/target/rb.aon +8 -0
- package/project/.sdk/model/target/rust.aon +10 -0
- package/project/.sdk/model/target/scala.aon +21 -2
- package/project/.sdk/model/target/swift.aon +18 -0
- package/project/.sdk/model/target/ts.aon +13 -0
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
- package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
- package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
- package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
- package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
- package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
- package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
- package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
- package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
- package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
- package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
- package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
- package/project/.sdk/tm/c/Makefile +38 -3
- package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
- package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
- package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
- package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
- package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
- package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
- package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
- package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
- package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
- package/project/.sdk/tm/cpp/Makefile +5 -1
- package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
- package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
- package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
- package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
- package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
- package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
- package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
- package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
- package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
- package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
- package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
- package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
- package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
- package/project/.sdk/tm/dart/test/omni.dart +520 -0
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
- package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
- package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
- package/project/.sdk/tm/elixir/Makefile +11 -3
- package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
- package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
- package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
- package/project/.sdk/tm/go/core/context.go +32 -16
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +209 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +151 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +439 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +685 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
- package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
- package/project/.sdk/tm/go/test/omni/omni.go +897 -0
- package/project/.sdk/tm/go/test/omni/util.go +360 -0
- package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
- package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
- package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
- package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
- package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
- package/project/.sdk/tm/go/utility/make_options.go +8 -1
- package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
- package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
- package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
- package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
- package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
- package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
- package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
- package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
- package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
- package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
- package/project/.sdk/tm/js/test/omni.js +251 -0
- package/project/.sdk/tm/js/test/omni.test.js +105 -0
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
- package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
- package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +613 -0
- package/project/.sdk/tm/js/test/vendor/omni/util.js +212 -0
- package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
- package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
- package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
- package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
- package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
- package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
- package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
- package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
- package/project/.sdk/tm/lean/Makefile +12 -5
- package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
- package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
- package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
- package/project/.sdk/tm/lua/test/omni.lua +456 -0
- package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
- package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
- package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
- package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
- package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
- package/project/.sdk/tm/ocaml/Makefile +37 -12
- package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
- package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
- package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
- package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
- package/project/.sdk/tm/perl/t/omni.pm +647 -0
- package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
- package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
- package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
- package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
- package/project/.sdk/tm/php/test/Omni.php +691 -0
- package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
- package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
- package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
- package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
- package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +74 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +152 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +92 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +455 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
- package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
- package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
- package/project/.sdk/tm/py/test/omni.py +415 -0
- package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
- package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
- package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +566 -0
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +237 -0
- package/project/.sdk/tm/rb/test/omni.rb +505 -0
- package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
- package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
- package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
- package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
- package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
- package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
- package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
- package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
- package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
- package/project/.sdk/tm/scala/Makefile +16 -6
- package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
- package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
- package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
- package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
- package/project/.sdk/tm/ts/test/omni.ts +104 -32
- package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
- package/project/.sdk/tm/zig/test/primary_utility_test.zig +1 -1
- package/project/.sdk/tm/zig/test/struct_runner.zig +5 -4
- package/project/sdkgen-package.json +1 -1
- package/src/action/doctor.ts +66 -2
- package/src/helpers/naming.ts +4 -2
- package/project/.sdk/tm/c/tests/runner.h +0 -274
- package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
- package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
- package/project/.sdk/tm/dart/test/runner.dart +0 -406
- package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
- package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
- package/project/.sdk/tm/go/test/runner_test.go +0 -629
- package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
- package/project/.sdk/tm/java/test/StructRunner.java +0 -281
- package/project/.sdk/tm/js/test/runner.js +0 -387
- package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
- package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
- package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
- package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
- package/project/.sdk/tm/php/test/StructRunner.php +0 -275
- package/project/.sdk/tm/py/test/struct_runner.py +0 -411
- package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
- package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
- package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
|
@@ -0,0 +1,897 @@
|
|
|
1
|
+
// VENDORED: @voxgig/omni sdk-20260904-1610-0 (go/omni.go)
|
|
2
|
+
// Source: https://github.com/voxgig/omni @ 8c3e1b573a8d35796f7fc45e3226b977023cabf7 [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
// Omni: the shared multi-language test runner.
|
|
5
|
+
//
|
|
6
|
+
// A test spec is plain JSON. The same spec file drives the same tests in
|
|
7
|
+
// every language that ships an omni port.
|
|
8
|
+
//
|
|
9
|
+
// Port of the canonical TypeScript implementation
|
|
10
|
+
// (typescript/src/Runner.ts). Behaviour must match, case for case.
|
|
11
|
+
//
|
|
12
|
+
// Go has no exceptions, so a failing check is returned as an error rather
|
|
13
|
+
// than thrown: `if err := runset(spec, subject); nil != err { t.Fatal(err) }`.
|
|
14
|
+
|
|
15
|
+
package omni
|
|
16
|
+
|
|
17
|
+
import (
|
|
18
|
+
"encoding/json"
|
|
19
|
+
"fmt"
|
|
20
|
+
"math"
|
|
21
|
+
"os"
|
|
22
|
+
"reflect"
|
|
23
|
+
"regexp"
|
|
24
|
+
"slices"
|
|
25
|
+
"sort"
|
|
26
|
+
"strconv"
|
|
27
|
+
"strings"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
// Subject is the function under test. A spec entry's arguments arrive as a
|
|
31
|
+
// list of JSON values.
|
|
32
|
+
type Subject func(args ...any) (any, error)
|
|
33
|
+
|
|
34
|
+
// Flags are the run-time options for a set of test entries.
|
|
35
|
+
type Flags map[string]any
|
|
36
|
+
|
|
37
|
+
// Provider hosts the system under test. Every hook is optional.
|
|
38
|
+
type Provider struct {
|
|
39
|
+
// Subject resolves a test subject by name.
|
|
40
|
+
Subject func(name string) Subject
|
|
41
|
+
// Client builds a sub-provider from a DEF.client entry's options.
|
|
42
|
+
Client func(options any) (*Provider, error)
|
|
43
|
+
// Contextify wraps a map argument as a call context.
|
|
44
|
+
Contextify func(val any) any
|
|
45
|
+
// Inject resolves references in client options against the store.
|
|
46
|
+
Inject func(options any, store any) any
|
|
47
|
+
// Errify builds the `match.err` base from the raised error, REPLACING
|
|
48
|
+
// the default Errify. A library whose errors carry a code can then
|
|
49
|
+
// assert on it with `match: {err: {code: "x"}}` instead of
|
|
50
|
+
// pattern-matching prose.
|
|
51
|
+
//
|
|
52
|
+
// `any`, not `map[string]any`, because the canonical is `(err) => Json`
|
|
53
|
+
// and `match.err` compares a scalar or a list as readily as a map. The
|
|
54
|
+
// built-in Errify happens to return a map; a hook is not held to that.
|
|
55
|
+
Errify func(err any) any
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// RunSet runs one set of test entries.
|
|
59
|
+
type RunSet func(testspec any, subject Subject) error
|
|
60
|
+
|
|
61
|
+
// RunSetFlags runs one set of test entries with flags.
|
|
62
|
+
type RunSetFlags func(testspec any, flags Flags, subject Subject) error
|
|
63
|
+
|
|
64
|
+
// RunPack is what a runner returns for one named spec section.
|
|
65
|
+
type RunPack struct {
|
|
66
|
+
Spec any
|
|
67
|
+
RunSet RunSet
|
|
68
|
+
RunSetFlags RunSetFlags
|
|
69
|
+
Subject Subject
|
|
70
|
+
Client *Provider
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Set returns a named group of the resolved spec.
|
|
74
|
+
func (runpack *RunPack) Set(name string) any {
|
|
75
|
+
if spec, is := runpack.Spec.(map[string]any); is {
|
|
76
|
+
return spec[name]
|
|
77
|
+
}
|
|
78
|
+
return nil
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Runner resolves one named section of a spec.
|
|
82
|
+
type Runner func(name string, store any) (*RunPack, error)
|
|
83
|
+
|
|
84
|
+
// SPECVERSION is the newest spec format version this runner understands. A
|
|
85
|
+
// spec with no OMNI block is version 0: the original, lenient format,
|
|
86
|
+
// frozen forever. Version 1 turns on strict entry validation (see
|
|
87
|
+
// checkentry).
|
|
88
|
+
const SPECVERSION = 1
|
|
89
|
+
|
|
90
|
+
// CAPABILITIES are the capability strings this runner supports beyond the
|
|
91
|
+
// version baseline. A spec's OMNI.requires list is checked against this: an
|
|
92
|
+
// unknown capability refuses the spec loudly at load time, instead of a
|
|
93
|
+
// lagging port silently mis-running it. (Empty today; future format
|
|
94
|
+
// features mint a string here.)
|
|
95
|
+
var CAPABILITIES = []string{}
|
|
96
|
+
|
|
97
|
+
// ENTRYFIELDS is the complete set of fields an entry may carry. Under
|
|
98
|
+
// version 1 anything else is an error: an unrecognised key is almost
|
|
99
|
+
// always a typo'd assertion, and a typo'd assertion is a test that
|
|
100
|
+
// silently stopped testing.
|
|
101
|
+
var ENTRYFIELDS = []string{"in", "args", "ctx", "out", "err", "match", "client", "id", "doc"}
|
|
102
|
+
|
|
103
|
+
// OmniError is a test failure (or a malformed spec). Distinct from errors
|
|
104
|
+
// returned by the subject under test, which are candidates for an `err`
|
|
105
|
+
// expectation.
|
|
106
|
+
type OmniError struct {
|
|
107
|
+
Message string
|
|
108
|
+
Entry any
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
func (omnierr *OmniError) Error() string {
|
|
112
|
+
return omnierr.Message
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// IsOmniError reports whether an error is a test failure.
|
|
116
|
+
func IsOmniError(err error) bool {
|
|
117
|
+
_, is := err.(*OmniError)
|
|
118
|
+
return is
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// LoadSpec loads a spec: a path to a JSON file, or an already-parsed value.
|
|
122
|
+
func LoadSpec(specref any) (any, error) {
|
|
123
|
+
if path, is := specref.(string); is {
|
|
124
|
+
text, err := os.ReadFile(path)
|
|
125
|
+
if nil != err {
|
|
126
|
+
return nil, &OmniError{Message: "omni: cannot read spec: " + path}
|
|
127
|
+
}
|
|
128
|
+
var alltests any
|
|
129
|
+
if err := json.Unmarshal(text, &alltests); nil != err {
|
|
130
|
+
return nil, &OmniError{Message: "omni: cannot parse spec: " + path + ": " + err.Error()}
|
|
131
|
+
}
|
|
132
|
+
return alltests, nil
|
|
133
|
+
}
|
|
134
|
+
return specref, nil
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// resolveversion reads the spec's format version from its optional
|
|
138
|
+
// top-level OMNI block, and refuses a spec this runner cannot faithfully
|
|
139
|
+
// run: a version newer than SPECVERSION, or a required capability not in
|
|
140
|
+
// CAPABILITIES.
|
|
141
|
+
func resolveversion(alltests any) (int, error) {
|
|
142
|
+
specmap, is := alltests.(map[string]any)
|
|
143
|
+
if !is {
|
|
144
|
+
return 0, nil
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// A present-but-null block is malformed, exactly as in canonical -
|
|
148
|
+
// only a genuinely absent OMNI key means version 0.
|
|
149
|
+
meta, has := specmap["OMNI"]
|
|
150
|
+
if !has {
|
|
151
|
+
return 0, nil
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
metamap, ismetamap := meta.(map[string]any)
|
|
155
|
+
version, isnum := ToNum(metamap["version"])
|
|
156
|
+
if !ismetamap || !isnum || version != math.Trunc(version) {
|
|
157
|
+
return 0, &OmniError{Message: "omni: malformed OMNI version block"}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if version < 0 || SPECVERSION < version {
|
|
161
|
+
return 0, &OmniError{Message: "omni: unsupported spec version: " + strconv.Itoa(int(version))}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if requires, has := metamap["requires"]; has {
|
|
165
|
+
list, is := requires.([]any)
|
|
166
|
+
if !is {
|
|
167
|
+
return 0, &OmniError{Message: "omni: malformed OMNI requires list"}
|
|
168
|
+
}
|
|
169
|
+
for _, cap := range list {
|
|
170
|
+
capstr, is := cap.(string)
|
|
171
|
+
if !is || !slices.Contains(CAPABILITIES, capstr) {
|
|
172
|
+
return 0, &OmniError{Message: "omni: spec requires unsupported capability: " + Stringify(cap)}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return int(version), nil
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// checkentry is strict entry validation, applied when the spec declares
|
|
181
|
+
// version 1 or later. The lenient format converts each of these mistakes
|
|
182
|
+
// into a silent pass or a dead field; here they fail with the entry named.
|
|
183
|
+
func checkentry(flags Flags, index int, entry map[string]any) error {
|
|
184
|
+
keys := make([]string, 0, len(entry))
|
|
185
|
+
for key := range entry {
|
|
186
|
+
keys = append(keys, key)
|
|
187
|
+
}
|
|
188
|
+
sort.Strings(keys)
|
|
189
|
+
|
|
190
|
+
for _, key := range keys {
|
|
191
|
+
if !slices.Contains(ENTRYFIELDS, key) {
|
|
192
|
+
return fail(flags, index, entry, "unknown entry field: "+key, nil, nil)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
argsources := 0
|
|
197
|
+
for _, key := range []string{"in", "args", "ctx"} {
|
|
198
|
+
if _, has := entry[key]; has {
|
|
199
|
+
argsources++
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if 1 < argsources {
|
|
203
|
+
return fail(flags, index, entry, "entry has more than one of in, args, ctx", nil, nil)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if entryerr, has := entry["err"]; has && nil != entryerr {
|
|
207
|
+
if _, has := entry["out"]; has {
|
|
208
|
+
return fail(flags, index, entry, "entry has both err and out", nil, nil)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if id, has := entry["id"]; has {
|
|
213
|
+
if _, is := id.(string); !is {
|
|
214
|
+
return fail(flags, index, entry, "entry id is not a string", nil, nil)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return nil
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// checkset validates a version-1 group up front, against the AUTHORED
|
|
222
|
+
// entries - null-normalisation would otherwise rewrite an authored null
|
|
223
|
+
// (e.g. id: null) into a sentinel string and hide it from validation. A
|
|
224
|
+
// malformed spec is a spec error, not a test result, so it fails before
|
|
225
|
+
// any subject runs.
|
|
226
|
+
func checkset(flags Flags, testspec any, normalset []any) error {
|
|
227
|
+
origset := normalset
|
|
228
|
+
var origmap map[string]any
|
|
229
|
+
if tmap, is := testspec.(map[string]any); is {
|
|
230
|
+
origmap = tmap
|
|
231
|
+
if oset, is := tmap["set"].([]any); is {
|
|
232
|
+
origset = oset
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if 0 == len(origset) {
|
|
237
|
+
isempty, _ := origmap["empty"].(bool)
|
|
238
|
+
if !isempty {
|
|
239
|
+
return &OmniError{Message: "omni: empty test set: " + Stringify(flags["name"])}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
for index, rawentry := range origset {
|
|
244
|
+
entry, is := rawentry.(map[string]any)
|
|
245
|
+
if !is {
|
|
246
|
+
return fail(flags, index, nil, "entry is not a map", nil, nil)
|
|
247
|
+
}
|
|
248
|
+
if err := checkentry(flags, index, entry); nil != err {
|
|
249
|
+
return err
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return nil
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ResolveSpec finds `primary.<name>`, then `<name>`, then the whole spec.
|
|
257
|
+
func ResolveSpec(name string, alltests any) any {
|
|
258
|
+
if "" == name {
|
|
259
|
+
return alltests
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if amap, is := alltests.(map[string]any); is {
|
|
263
|
+
if primary, is := amap["primary"].(map[string]any); is {
|
|
264
|
+
if section, has := primary[name]; has && nil != section {
|
|
265
|
+
return section
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if section, has := amap[name]; has && nil != section {
|
|
269
|
+
return section
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return alltests
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
func resolveclients(provider *Provider, spec any, store any) (map[string]*Provider, error) {
|
|
277
|
+
clients := map[string]*Provider{}
|
|
278
|
+
|
|
279
|
+
specmap, is := spec.(map[string]any)
|
|
280
|
+
if !is {
|
|
281
|
+
return clients, nil
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
defmap, is := specmap["DEF"].(map[string]any)
|
|
285
|
+
if !is {
|
|
286
|
+
return clients, nil
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
defclient, is := defmap["client"].(map[string]any)
|
|
290
|
+
if !is {
|
|
291
|
+
return clients, nil
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// A spec may define clients that a given test run never references.
|
|
295
|
+
if nil == provider.Client {
|
|
296
|
+
return clients, nil
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
names := make([]string, 0, len(defclient))
|
|
300
|
+
for name := range defclient {
|
|
301
|
+
names = append(names, name)
|
|
302
|
+
}
|
|
303
|
+
sort.Strings(names)
|
|
304
|
+
|
|
305
|
+
for _, clientname := range names {
|
|
306
|
+
copts := any(map[string]any{})
|
|
307
|
+
if cdef, is := defclient[clientname].(map[string]any); is {
|
|
308
|
+
if ctest, is := cdef["test"].(map[string]any); is {
|
|
309
|
+
if options, has := ctest["options"]; has {
|
|
310
|
+
copts = Clone(options)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if nil != provider.Inject && IsMap(store) {
|
|
316
|
+
provider.Inject(copts, store)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
client, err := provider.Client(copts)
|
|
320
|
+
if nil != err {
|
|
321
|
+
return nil, &OmniError{Message: "omni: cannot make client: " + clientname + ": " + err.Error()}
|
|
322
|
+
}
|
|
323
|
+
clients[clientname] = client
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return clients, nil
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
func resolvesubject(name string, provider *Provider) Subject {
|
|
330
|
+
if "" == name || nil == provider || nil == provider.Subject {
|
|
331
|
+
return nil
|
|
332
|
+
}
|
|
333
|
+
return provider.Subject(name)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
func resolveflags(flags Flags) Flags {
|
|
337
|
+
out := Flags{}
|
|
338
|
+
for key, val := range flags {
|
|
339
|
+
out[key] = val
|
|
340
|
+
}
|
|
341
|
+
if _, has := out["null"]; !has {
|
|
342
|
+
out["null"] = true
|
|
343
|
+
}
|
|
344
|
+
return out
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
func flagbool(flags Flags, name string) bool {
|
|
348
|
+
val, has := flags[name]
|
|
349
|
+
if !has || nil == val {
|
|
350
|
+
return false
|
|
351
|
+
}
|
|
352
|
+
flag, is := val.(bool)
|
|
353
|
+
return is && flag
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// An entry with no `out` expects a null (or absent) result.
|
|
357
|
+
func resolveentry(entry map[string]any, flags Flags) map[string]any {
|
|
358
|
+
if out, has := entry["out"]; (!has || nil == out) && flagbool(flags, "null") {
|
|
359
|
+
entry["out"] = NULLMARK
|
|
360
|
+
}
|
|
361
|
+
return entry
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
type testpack struct {
|
|
365
|
+
client *Provider
|
|
366
|
+
subject Subject
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
func resolvetestpack(
|
|
370
|
+
name string,
|
|
371
|
+
entry map[string]any,
|
|
372
|
+
subject Subject,
|
|
373
|
+
provider *Provider,
|
|
374
|
+
clients map[string]*Provider,
|
|
375
|
+
) (*testpack, error) {
|
|
376
|
+
pack := &testpack{client: provider, subject: subject}
|
|
377
|
+
|
|
378
|
+
clientname, has := entry["client"].(string)
|
|
379
|
+
if !has {
|
|
380
|
+
return pack, nil
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
client, found := clients[clientname]
|
|
384
|
+
if !found {
|
|
385
|
+
return nil, &OmniError{Message: "omni: unknown client: " + clientname, Entry: entry}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
pack.client = client
|
|
389
|
+
if clientsubject := resolvesubject(name, client); nil != clientsubject {
|
|
390
|
+
pack.subject = clientsubject
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return pack, nil
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Build the argument list: `ctx`, `args`, or `in`.
|
|
397
|
+
func resolveargs(entry map[string]any, pack *testpack, provider *Provider) []any {
|
|
398
|
+
var args []any
|
|
399
|
+
|
|
400
|
+
ctx, hasctx := entry["ctx"]
|
|
401
|
+
rawargs, hasargs := entry["args"]
|
|
402
|
+
|
|
403
|
+
if hasctx {
|
|
404
|
+
args = []any{ctx}
|
|
405
|
+
} else if hasargs {
|
|
406
|
+
if list, is := rawargs.([]any); is {
|
|
407
|
+
args = list
|
|
408
|
+
} else {
|
|
409
|
+
args = []any{rawargs}
|
|
410
|
+
}
|
|
411
|
+
} else {
|
|
412
|
+
args = []any{Clone(entry["in"])}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (hasctx || hasargs) && 0 < len(args) {
|
|
416
|
+
if first, is := args[0].(map[string]any); is {
|
|
417
|
+
cloned := Clone(first)
|
|
418
|
+
if nil != provider.Contextify {
|
|
419
|
+
cloned = provider.Contextify(cloned)
|
|
420
|
+
}
|
|
421
|
+
if asmap, is := cloned.(map[string]any); is {
|
|
422
|
+
asmap["client"] = pack.client
|
|
423
|
+
}
|
|
424
|
+
args[0] = cloned
|
|
425
|
+
entry["ctx"] = cloned
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return args
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// FixJson normalises a value: nulls (and absent values) become NULLMARK,
|
|
433
|
+
// errors become {name,message} maps, containers become []any/map[string]any.
|
|
434
|
+
// Always returns a fresh copy.
|
|
435
|
+
func FixJson(val any, flags Flags) any {
|
|
436
|
+
donull := true
|
|
437
|
+
if nil != flags {
|
|
438
|
+
if raw, has := flags["null"]; has && nil != raw {
|
|
439
|
+
flag, is := raw.(bool)
|
|
440
|
+
donull = !is || flag
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return fixjsonval(val, donull)
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
func fixjsonval(val any, donull bool) any {
|
|
447
|
+
if nil == val || IsAbsent(val) {
|
|
448
|
+
if donull {
|
|
449
|
+
return NULLMARK
|
|
450
|
+
}
|
|
451
|
+
return nil
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
if err, is := val.(error); is {
|
|
455
|
+
return Errify(err)
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
switch typed := val.(type) {
|
|
459
|
+
case string, bool, float64, float32,
|
|
460
|
+
int, int8, int16, int32, int64,
|
|
461
|
+
uint, uint8, uint16, uint32, uint64:
|
|
462
|
+
return typed
|
|
463
|
+
case []any:
|
|
464
|
+
out := make([]any, len(typed))
|
|
465
|
+
for index, entry := range typed {
|
|
466
|
+
out[index] = fixjsonval(entry, donull)
|
|
467
|
+
}
|
|
468
|
+
return out
|
|
469
|
+
case map[string]any:
|
|
470
|
+
out := make(map[string]any, len(typed))
|
|
471
|
+
for key, entry := range typed {
|
|
472
|
+
out[key] = fixjsonval(entry, donull)
|
|
473
|
+
}
|
|
474
|
+
return out
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// Any other Go container: normalise via reflection.
|
|
478
|
+
value := reflect.ValueOf(val)
|
|
479
|
+
switch value.Kind() {
|
|
480
|
+
case reflect.Pointer, reflect.Interface:
|
|
481
|
+
if value.IsNil() {
|
|
482
|
+
if donull {
|
|
483
|
+
return NULLMARK
|
|
484
|
+
}
|
|
485
|
+
return nil
|
|
486
|
+
}
|
|
487
|
+
return fixjsonval(value.Elem().Interface(), donull)
|
|
488
|
+
case reflect.Slice, reflect.Array:
|
|
489
|
+
out := make([]any, value.Len())
|
|
490
|
+
for index := 0; index < value.Len(); index++ {
|
|
491
|
+
out[index] = fixjsonval(value.Index(index).Interface(), donull)
|
|
492
|
+
}
|
|
493
|
+
return out
|
|
494
|
+
case reflect.Map:
|
|
495
|
+
out := make(map[string]any, value.Len())
|
|
496
|
+
iter := value.MapRange()
|
|
497
|
+
for iter.Next() {
|
|
498
|
+
out[StrKey(iter.Key().Interface())] = fixjsonval(iter.Value().Interface(), donull)
|
|
499
|
+
}
|
|
500
|
+
return out
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
return val
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Errify is the JSON form of an error: always at least {name,message}.
|
|
507
|
+
func Errify(err any) map[string]any {
|
|
508
|
+
if aserr, is := err.(error); is {
|
|
509
|
+
name := reflect.TypeOf(aserr).String()
|
|
510
|
+
if strings.HasPrefix(name, "*") {
|
|
511
|
+
name = name[1:]
|
|
512
|
+
}
|
|
513
|
+
return map[string]any{"name": name, "message": aserr.Error()}
|
|
514
|
+
}
|
|
515
|
+
return map[string]any{"name": "Error", "message": fmt.Sprintf("%v", err)}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// errbase is the error base a `match.err` sees: the provider's own, when
|
|
519
|
+
// it has one.
|
|
520
|
+
func errbase(err any, provider *Provider) any {
|
|
521
|
+
if nil != provider && nil != provider.Errify {
|
|
522
|
+
return provider.Errify(err)
|
|
523
|
+
}
|
|
524
|
+
return Errify(err)
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
func errmessage(err error) string {
|
|
528
|
+
if nil == err {
|
|
529
|
+
return ""
|
|
530
|
+
}
|
|
531
|
+
return err.Error()
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// The label of one entry, for failure messages.
|
|
535
|
+
func entryref(flags Flags, index int, entry map[string]any) string {
|
|
536
|
+
label := "set"
|
|
537
|
+
if name, is := flags["name"].(string); is && "" != name {
|
|
538
|
+
label = name
|
|
539
|
+
}
|
|
540
|
+
entryid := ""
|
|
541
|
+
if id, has := entry["id"]; has && nil != id {
|
|
542
|
+
entryid = " (" + Stringify(id) + ")"
|
|
543
|
+
}
|
|
544
|
+
return fmt.Sprintf("%s[%d]%s", label, index, entryid)
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
func fail(flags Flags, index int, entry map[string]any, reason string, expected *string, actual *string) *OmniError {
|
|
548
|
+
msg := "omni: " + entryref(flags, index, entry) + ": " + reason
|
|
549
|
+
if nil != expected {
|
|
550
|
+
msg += "\n expected: " + *expected
|
|
551
|
+
}
|
|
552
|
+
if nil != actual {
|
|
553
|
+
msg += "\n actual: " + *actual
|
|
554
|
+
}
|
|
555
|
+
msg += "\n entry: " + Stringify(entrysummary(entry))
|
|
556
|
+
return &OmniError{Message: msg, Entry: entry}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
func strptr(val string) *string {
|
|
560
|
+
return &val
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// The spec-defined part of an entry (drop runner bookkeeping).
|
|
564
|
+
func entrysummary(entry map[string]any) any {
|
|
565
|
+
out := map[string]any{}
|
|
566
|
+
for key, val := range entry {
|
|
567
|
+
if "res" != key && "thrown" != key && "ctx" != key {
|
|
568
|
+
out[key] = val
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return out
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
func checkresult(flags Flags, index int, entry map[string]any, args []any, res any) error {
|
|
575
|
+
matched := false
|
|
576
|
+
|
|
577
|
+
if entryerr, has := entry["err"]; has && nil != entryerr {
|
|
578
|
+
return fail(flags, index, entry, "expected error did not occur",
|
|
579
|
+
strptr(Stringify(entryerr)), strptr(Stringify(res)))
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if check, has := entry["match"]; has && nil != check {
|
|
583
|
+
base := map[string]any{
|
|
584
|
+
"in": entry["in"],
|
|
585
|
+
"args": args,
|
|
586
|
+
"out": entry["res"],
|
|
587
|
+
"ctx": entry["ctx"],
|
|
588
|
+
}
|
|
589
|
+
if err := Match(flags, index, entry, check, base); nil != err {
|
|
590
|
+
return err
|
|
591
|
+
}
|
|
592
|
+
matched = true
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
out := entry["out"]
|
|
596
|
+
|
|
597
|
+
if DeepEqual(res, out) {
|
|
598
|
+
return nil
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// NOTE: a match with no explicit out is a complete check on its own.
|
|
602
|
+
if matched && (NULLMARK == out || nil == out) {
|
|
603
|
+
return nil
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
return fail(flags, index, entry, "result mismatch", strptr(Stringify(out)), strptr(Stringify(res)))
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
func handleerror(flags Flags, index int, entry map[string]any, err error, provider *Provider) error {
|
|
610
|
+
entryerr, has := entry["err"]
|
|
611
|
+
|
|
612
|
+
if has && nil != entryerr {
|
|
613
|
+
istrue := false
|
|
614
|
+
if flag, is := entryerr.(bool); is && flag {
|
|
615
|
+
istrue = true
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
if istrue || MatchVal(entryerr, errmessage(err)) {
|
|
619
|
+
if check, has := entry["match"]; has && nil != check {
|
|
620
|
+
base := map[string]any{
|
|
621
|
+
"in": entry["in"],
|
|
622
|
+
"out": entry["res"],
|
|
623
|
+
"ctx": entry["ctx"],
|
|
624
|
+
"err": errbase(err, provider),
|
|
625
|
+
}
|
|
626
|
+
return Match(flags, index, entry, check, base)
|
|
627
|
+
}
|
|
628
|
+
return nil
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
return fail(flags, index, entry, "error mismatch",
|
|
632
|
+
strptr(Stringify(entryerr)), strptr(errmessage(err)))
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
return fail(flags, index, entry, "unexpected error", nil, strptr(errmessage(err)))
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
// Match checks that every leaf of `check` is present, and matches, in
|
|
639
|
+
// `base`.
|
|
640
|
+
func Match(flags Flags, index int, entry map[string]any, check any, base any) error {
|
|
641
|
+
cbase := Clone(base)
|
|
642
|
+
var failure error
|
|
643
|
+
|
|
644
|
+
Walk(Clone(check), func(_key any, val any, _parent any, path []any) any {
|
|
645
|
+
if nil != failure {
|
|
646
|
+
return val
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
where := "<root>"
|
|
650
|
+
if 0 < len(path) {
|
|
651
|
+
where = PathIfy(path)
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
if IsNode(val) {
|
|
655
|
+
return val
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
baseval := GetPath(cbase, path)
|
|
659
|
+
|
|
660
|
+
// The sentinels are tested BEFORE the identity check below. Otherwise
|
|
661
|
+
// a subject returning the literal string "__UNDEF__" satisfies an
|
|
662
|
+
// assertion that the key is absent - two mutually exclusive states
|
|
663
|
+
// passing one check. A sentinel that accepts its own literal is not a
|
|
664
|
+
// sentinel. (NULLMARK still accepts NULLMARK: under the default null
|
|
665
|
+
// flag a real null has already been normalised to it, so the two are
|
|
666
|
+
// genuinely indistinguishable here - that one needs a raw-value
|
|
667
|
+
// escape, not an ordering change.)
|
|
668
|
+
|
|
669
|
+
// Explicitly absent: satisfied only by a genuinely missing key, never
|
|
670
|
+
// by a present null (the distinction the sentinels exist to keep).
|
|
671
|
+
if UNDEFMARK == val {
|
|
672
|
+
if IsAbsent(baseval) {
|
|
673
|
+
return val
|
|
674
|
+
}
|
|
675
|
+
failure = fail(flags, index, entry, "expected absent at "+where,
|
|
676
|
+
strptr("absent"), strptr(Stringify(baseval)))
|
|
677
|
+
return val
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
// Explicitly null: satisfied only by a present null.
|
|
681
|
+
if NULLMARK == val {
|
|
682
|
+
if nil == baseval || NULLMARK == baseval {
|
|
683
|
+
return val
|
|
684
|
+
}
|
|
685
|
+
failure = fail(flags, index, entry, "expected null at "+where,
|
|
686
|
+
strptr("null"), strptr(Stringify(baseval)))
|
|
687
|
+
return val
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Explicitly present: any present value, including null.
|
|
691
|
+
if EXISTSMARK == val {
|
|
692
|
+
if !IsAbsent(baseval) {
|
|
693
|
+
return val
|
|
694
|
+
}
|
|
695
|
+
failure = fail(flags, index, entry, "expected present at "+where,
|
|
696
|
+
strptr("present"), strptr("absent"))
|
|
697
|
+
return val
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
// Identical values match. This sits below the sentinel branches on
|
|
701
|
+
// purpose - see the note above.
|
|
702
|
+
if DeepEqual(val, baseval) {
|
|
703
|
+
return val
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// A concrete expectation never matches a missing key - a match leaf
|
|
707
|
+
// against an absent value must fail, not substring-match "undefined".
|
|
708
|
+
if IsAbsent(baseval) {
|
|
709
|
+
failure = fail(flags, index, entry, "match failed at "+where,
|
|
710
|
+
strptr(Stringify(val)), strptr("absent"))
|
|
711
|
+
return val
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
if !MatchVal(val, baseval) {
|
|
715
|
+
failure = fail(flags, index, entry, "match failed at "+where,
|
|
716
|
+
strptr(Stringify(val)), strptr(Stringify(baseval)))
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
return val
|
|
720
|
+
})
|
|
721
|
+
|
|
722
|
+
return failure
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// MatchVal matches one leaf: /regex/ or case-insensitive substring for
|
|
726
|
+
// strings.
|
|
727
|
+
func MatchVal(check any, base any) bool {
|
|
728
|
+
if DeepEqual(check, base) {
|
|
729
|
+
return true
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
want := check
|
|
733
|
+
|
|
734
|
+
if nil == want {
|
|
735
|
+
return nil == base || IsAbsent(base) || NULLMARK == base
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
if text, is := want.(string); is {
|
|
739
|
+
// An empty want would substring-match anything: reject it.
|
|
740
|
+
if "" == text {
|
|
741
|
+
return false
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
basestr := Stringify(base)
|
|
745
|
+
|
|
746
|
+
if strings.HasPrefix(text, "/") && strings.HasSuffix(text, "/") && 2 < len(text) {
|
|
747
|
+
pattern, err := regexp.Compile(text[1 : len(text)-1])
|
|
748
|
+
if nil != err {
|
|
749
|
+
return false
|
|
750
|
+
}
|
|
751
|
+
return pattern.MatchString(basestr)
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
return strings.Contains(strings.ToLower(basestr), strings.ToLower(text))
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
return DeepEqual(want, base)
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
// NullModifier converts NULLMARK sentinels back into real nulls. Use as a
|
|
761
|
+
// Walk callback when a spec value must reach the subject as an actual null.
|
|
762
|
+
func NullModifier(key any, val any, parent any, _path []any) any {
|
|
763
|
+
if text, is := val.(string); is {
|
|
764
|
+
if NULLMARK == text {
|
|
765
|
+
return nil
|
|
766
|
+
}
|
|
767
|
+
return strings.ReplaceAll(text, NULLMARK, "null")
|
|
768
|
+
}
|
|
769
|
+
return val
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// Call a subject, converting a panic into an error.
|
|
773
|
+
func safecall(subject Subject, args []any) (res any, err error) {
|
|
774
|
+
defer func() {
|
|
775
|
+
if recovered := recover(); nil != recovered {
|
|
776
|
+
if aserr, is := recovered.(error); is {
|
|
777
|
+
err = aserr
|
|
778
|
+
} else {
|
|
779
|
+
err = fmt.Errorf("%v", recovered)
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}()
|
|
783
|
+
|
|
784
|
+
return subject(args...)
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// MakeRunner makes a runner for a spec file (or spec value) and a provider.
|
|
788
|
+
func MakeRunner(specref any, provider *Provider) (Runner, error) {
|
|
789
|
+
alltests, err := LoadSpec(specref)
|
|
790
|
+
if nil != err {
|
|
791
|
+
return nil, err
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
specversion, err := resolveversion(alltests)
|
|
795
|
+
if nil != err {
|
|
796
|
+
return nil, err
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
useprovider := provider
|
|
800
|
+
if nil == useprovider {
|
|
801
|
+
useprovider = &Provider{}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
return func(name string, store any) (*RunPack, error) {
|
|
805
|
+
spec := ResolveSpec(name, alltests)
|
|
806
|
+
|
|
807
|
+
clients, err := resolveclients(useprovider, spec, store)
|
|
808
|
+
if nil != err {
|
|
809
|
+
return nil, err
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
defsubject := resolvesubject(name, useprovider)
|
|
813
|
+
|
|
814
|
+
runsetflags := func(testspec any, flags Flags, subject Subject) error {
|
|
815
|
+
useflags := resolveflags(flags)
|
|
816
|
+
if label, is := useflags["name"].(string); !is || "" == label {
|
|
817
|
+
if "" != name {
|
|
818
|
+
useflags["name"] = name
|
|
819
|
+
} else {
|
|
820
|
+
useflags["name"] = "set"
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
usesubject := subject
|
|
825
|
+
if nil == usesubject {
|
|
826
|
+
usesubject = defsubject
|
|
827
|
+
}
|
|
828
|
+
if nil == usesubject {
|
|
829
|
+
return &OmniError{Message: "omni: no test subject for: " + Stringify(useflags["name"])}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
testspecmap, is := FixJson(testspec, useflags).(map[string]any)
|
|
833
|
+
if !is {
|
|
834
|
+
return &OmniError{Message: "omni: test spec has no set: " + Stringify(useflags["name"])}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
testset, is := testspecmap["set"].([]any)
|
|
838
|
+
if !is {
|
|
839
|
+
return &OmniError{Message: "omni: test spec has no set: " + Stringify(useflags["name"])}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
if 1 <= specversion {
|
|
843
|
+
if err := checkset(useflags, testspec, testset); nil != err {
|
|
844
|
+
return err
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
for index, rawentry := range testset {
|
|
849
|
+
entry, is := rawentry.(map[string]any)
|
|
850
|
+
if !is {
|
|
851
|
+
return &OmniError{
|
|
852
|
+
Message: fmt.Sprintf("omni: %s[%d]: entry is not a map", useflags["name"], index),
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
entry = resolveentry(entry, useflags)
|
|
857
|
+
|
|
858
|
+
pack, err := resolvetestpack(name, entry, usesubject, useprovider, clients)
|
|
859
|
+
if nil != err {
|
|
860
|
+
return err
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
args := resolveargs(entry, pack, useprovider)
|
|
864
|
+
|
|
865
|
+
res, subjecterr := safecall(pack.subject, args)
|
|
866
|
+
|
|
867
|
+
if nil != subjecterr {
|
|
868
|
+
if err := handleerror(useflags, index, entry, subjecterr, useprovider); nil != err {
|
|
869
|
+
return err
|
|
870
|
+
}
|
|
871
|
+
continue
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
res = FixJson(res, useflags)
|
|
875
|
+
entry["res"] = res
|
|
876
|
+
|
|
877
|
+
if err := checkresult(useflags, index, entry, args, res); nil != err {
|
|
878
|
+
return err
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
return nil
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
runset := func(testspec any, subject Subject) error {
|
|
886
|
+
return runsetflags(testspec, Flags{}, subject)
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
return &RunPack{
|
|
890
|
+
Spec: spec,
|
|
891
|
+
RunSet: runset,
|
|
892
|
+
RunSetFlags: runsetflags,
|
|
893
|
+
Subject: defsubject,
|
|
894
|
+
Client: useprovider,
|
|
895
|
+
}, nil
|
|
896
|
+
}, nil
|
|
897
|
+
}
|