@voxgig/sdkgen 1.3.17 → 1.3.18
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/cmp/Entity.js +5 -1
- package/dist/cmp/Entity.js.map +1 -1
- package/dist/cmp/Feature.js +2 -1
- package/dist/cmp/Feature.js.map +1 -1
- package/dist/helpers/canonType.js +8 -3
- package/dist/helpers/canonType.js.map +1 -1
- package/dist/helpers/collectDeps.d.ts +1 -1
- package/dist/helpers/collectDeps.js +36 -13
- package/dist/helpers/collectDeps.js.map +1 -1
- package/dist/helpers/naming.d.ts +3 -1
- package/dist/helpers/naming.js +53 -0
- package/dist/helpers/naming.js.map +1 -1
- package/dist/helpers/opShape.d.ts +3 -1
- package/dist/helpers/opShape.js +87 -8
- package/dist/helpers/opShape.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -3
- package/dist/sdkgen.js +6 -2
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -10
- package/project/.sdk/model/target/cpp.aontu +4 -4
- package/project/.sdk/model/target/go-cli.aontu +17 -17
- package/project/.sdk/model/target/go-mcp.aontu +11 -11
- package/project/.sdk/model/target/go.aontu +1 -1
- package/project/.sdk/model/target/java.aontu +4 -4
- package/project/.sdk/model/target/kotlin.aontu +4 -4
- package/project/.sdk/model/target/lean.aontu +51 -0
- package/project/.sdk/model/target/scala.aontu +4 -4
- package/project/.sdk/src/cmp/c/EntityTypes_c.ts +3 -4
- package/project/.sdk/src/cmp/c/Entity_c.ts +3 -3
- package/project/.sdk/src/cmp/c/ReadmeExamplesTest_c.ts +24 -7
- package/project/.sdk/src/cmp/c/TestDirect_c.ts +3 -3
- package/project/.sdk/src/cmp/c/TestEntity_c.ts +1 -1
- package/project/.sdk/src/cmp/clojure/Entity_clojure.ts +1 -1
- package/project/.sdk/src/cmp/clojure/ReadmeExamplesTest_clojure.ts +19 -8
- package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +2 -2
- package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +3 -3
- package/project/.sdk/src/cmp/cpp/MainEntity_cpp.ts +2 -2
- package/project/.sdk/src/cmp/cpp/ReadmeExamplesTest_cpp.ts +136 -0
- package/project/.sdk/src/cmp/cpp/TestDirect_cpp.ts +3 -3
- package/project/.sdk/src/cmp/cpp/Test_cpp.ts +4 -0
- package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +2 -3
- package/project/.sdk/src/cmp/csharp/Entity_csharp.ts +3 -3
- package/project/.sdk/src/cmp/csharp/MainEntity_csharp.ts +2 -2
- package/project/.sdk/src/cmp/csharp/Package_csharp.ts +1 -1
- package/project/.sdk/src/cmp/csharp/ReadmeExamplesTest_csharp.ts +13 -1
- package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +2 -3
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +3 -3
- package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +2 -2
- package/project/.sdk/src/cmp/dart/Main_dart.ts +3 -3
- package/project/.sdk/src/cmp/dart/Package_dart.ts +1 -1
- package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +4 -4
- package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +2 -3
- package/project/.sdk/src/cmp/elixir/Entity_elixir.ts +1 -1
- package/project/.sdk/src/cmp/elixir/ReadmeExamplesTest_elixir.ts +21 -3
- package/project/.sdk/src/cmp/go/Config_go.ts +4 -1
- package/project/.sdk/src/cmp/go/EntityTypes_go.ts +110 -18
- package/project/.sdk/src/cmp/go/Entity_go.ts +3 -3
- package/project/.sdk/src/cmp/go/Main_go.ts +7 -6
- package/project/.sdk/src/cmp/go/Package_go.ts +1 -1
- package/project/.sdk/src/cmp/go/TestDirect_go.ts +3 -3
- package/project/.sdk/src/cmp/go/TestEntity_go.ts +1 -1
- package/project/.sdk/src/cmp/go/utility_go.ts +25 -0
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +9 -1
- package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +9 -1
- package/project/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +28 -18
- package/project/.sdk/src/cmp/java/EntityTypes_java.ts +2 -3
- package/project/.sdk/src/cmp/java/Entity_java.ts +3 -3
- package/project/.sdk/src/cmp/java/MainEntity_java.ts +2 -2
- package/project/.sdk/src/cmp/java/Package_java.ts +1 -1
- package/project/.sdk/src/cmp/java/ReadmeExamplesTest_java.ts +23 -1
- package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
- package/project/.sdk/src/cmp/js/EntityTypes_js.ts +2 -3
- package/project/.sdk/src/cmp/js/Entity_js.ts +3 -3
- package/project/.sdk/src/cmp/js/MainEntity_js.ts +2 -2
- package/project/.sdk/src/cmp/js/Main_js.ts +2 -2
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +4 -4
- package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +2 -3
- package/project/.sdk/src/cmp/kotlin/Entity_kotlin.ts +3 -3
- package/project/.sdk/src/cmp/kotlin/MainEntity_kotlin.ts +2 -2
- package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +1 -1
- package/project/.sdk/src/cmp/kotlin/ReadmeExamplesTest_kotlin.ts +27 -2
- package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
- package/project/.sdk/src/cmp/lean/Config_lean.ts +88 -0
- package/project/.sdk/src/cmp/lean/Entity_lean.ts +9 -0
- package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +18 -0
- package/project/.sdk/src/cmp/lean/Main_lean.ts +120 -0
- package/project/.sdk/src/cmp/lean/Package_lean.ts +68 -0
- package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +29 -0
- package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +19 -0
- package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +25 -0
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +38 -0
- package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +25 -0
- package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +24 -0
- package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +22 -0
- package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +50 -0
- package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +16 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +16 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +23 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +18 -0
- package/project/.sdk/src/cmp/lean/Test_lean.ts +207 -0
- package/project/.sdk/src/cmp/lean/utility_lean.ts +78 -0
- package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +2 -3
- package/project/.sdk/src/cmp/lua/Entity_lua.ts +3 -3
- package/project/.sdk/src/cmp/lua/Package_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +1 -1
- package/project/.sdk/src/cmp/ocaml/ReadmeExamplesTest_ocaml.ts +29 -14
- package/project/.sdk/src/cmp/perl/Entity_perl.ts +3 -3
- package/project/.sdk/src/cmp/perl/MainEntity_perl.ts +2 -2
- package/project/.sdk/src/cmp/perl/Package_perl.ts +1 -1
- package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
- package/project/.sdk/src/cmp/php/EntityTypes_php.ts +2 -3
- package/project/.sdk/src/cmp/php/Entity_php.ts +3 -3
- package/project/.sdk/src/cmp/php/MainEntity_php.ts +2 -2
- package/project/.sdk/src/cmp/php/Package_php.ts +1 -1
- package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +1 -1
- package/project/.sdk/src/cmp/py/EntityTypes_py.ts +2 -3
- package/project/.sdk/src/cmp/py/Entity_py.ts +3 -3
- package/project/.sdk/src/cmp/py/MainEntity_py.ts +2 -2
- package/project/.sdk/src/cmp/py/Main_py.ts +2 -2
- package/project/.sdk/src/cmp/py/Package_py.ts +1 -1
- package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +1 -1
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +15 -5
- package/project/.sdk/src/cmp/rb/Entity_rb.ts +3 -3
- package/project/.sdk/src/cmp/rb/MainEntity_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/Package_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
- package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +1 -1
- package/project/.sdk/src/cmp/rust/EntityBase_rust.ts +2 -2
- package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +3 -4
- package/project/.sdk/src/cmp/rust/Entity_rust.ts +3 -3
- package/project/.sdk/src/cmp/rust/MainEntity_rust.ts +2 -2
- package/project/.sdk/src/cmp/rust/Package_rust.ts +1 -1
- package/project/.sdk/src/cmp/rust/ReadmeExamplesTest_rust.ts +22 -10
- package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
- package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +2 -3
- package/project/.sdk/src/cmp/scala/Entity_scala.ts +3 -3
- package/project/.sdk/src/cmp/scala/MainEntity_scala.ts +2 -2
- package/project/.sdk/src/cmp/scala/ReadmeExamplesTest_scala.ts +22 -3
- package/project/.sdk/src/cmp/scala/TestDirect_scala.ts +3 -3
- package/project/.sdk/src/cmp/scala/Test_scala.ts +1 -1
- package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +3 -4
- package/project/.sdk/src/cmp/swift/Entity_swift.ts +3 -3
- package/project/.sdk/src/cmp/swift/MainEntity_swift.ts +2 -2
- package/project/.sdk/src/cmp/swift/Package_swift.ts +1 -1
- package/project/.sdk/src/cmp/swift/ReadmeExamplesTest_swift.ts +18 -1
- package/project/.sdk/src/cmp/swift/TestDirect_swift.ts +1 -1
- package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +2 -3
- package/project/.sdk/src/cmp/ts/Entity_ts.ts +3 -3
- package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +2 -2
- package/project/.sdk/src/cmp/ts/Main_ts.ts +2 -2
- package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +4 -4
- package/project/.sdk/src/cmp/zig/Entity_zig.ts +3 -3
- package/project/.sdk/src/cmp/zig/MainEntity_zig.ts +2 -2
- package/project/.sdk/src/cmp/zig/Package_zig.ts +10 -2
- package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +8 -16
- package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +10 -28
- package/project/.sdk/tm/dart/test/primary_test.dart +7 -0
- package/project/.sdk/tm/go/feature/test_feature.go +33 -1
- package/project/.sdk/tm/go/test/primary_utility_test.go +41 -42
- package/project/.sdk/tm/go/test/runner_test.go +30 -1
- package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +7 -24
- package/project/.sdk/tm/js/src/feature/test/TestFeature.js +18 -1
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +8 -0
- package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +7 -20
- package/project/.sdk/tm/lean/LICENSE +21 -0
- package/project/.sdk/tm/lean/VERSION +1 -0
- package/project/.sdk/tm/lean/src/SdkFeature.lean +171 -0
- package/project/.sdk/tm/lean/src/SdkFeatures.lean +602 -0
- package/project/.sdk/tm/lean/src/SdkJson.lean +134 -0
- package/project/.sdk/tm/lean/src/SdkRuntime.lean +356 -0
- package/project/.sdk/tm/lean/src/SdkUtility.lean +617 -0
- package/project/.sdk/tm/lean/src/VoxgigStruct.lean +2880 -0
- package/project/.sdk/tm/lean/src/Vregex.lean +412 -0
- package/project/.sdk/tm/lean/src/feature/README.md +5 -0
- package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/lean/test/StructCorpus.lean +697 -0
- package/project/.sdk/tm/lean/test/TFeature.lean +268 -0
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +349 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +10 -8
- package/project/.sdk/tm/perl/t/primary_utility.t +8 -17
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +9 -7
- package/project/.sdk/tm/py/feature/test_feature.py +28 -1
- package/project/.sdk/tm/py/test/test_primary_utility.py +13 -18
- package/project/.sdk/tm/rb/feature/test_feature.rb +24 -1
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +7 -8
- package/project/.sdk/tm/rust/tests/common/mod.rs +37 -1
- package/project/.sdk/tm/rust/tests/primary_utility_test.rs +12 -26
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +7 -8
- package/project/.sdk/tm/ts/src/feature/test/TestFeature.ts +18 -1
- package/project/.sdk/tm/ts/test/utility/PrimaryUtility.test.ts +65 -21
- package/src/cmp/Entity.ts +5 -1
- package/src/cmp/Feature.ts +2 -1
- package/src/helpers/canonType.ts +8 -3
- package/src/helpers/collectDeps.ts +39 -12
- package/src/helpers/naming.ts +59 -0
- package/src/helpers/opShape.ts +99 -12
- package/src/sdkgen.ts +7 -3
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/- ProjectName SDK feature test.
|
|
2
|
+
|
|
3
|
+
Verifies the feature catalog's OBSERVABLE behaviour. Each feature records
|
|
4
|
+
into the client's `track` bucket under its own name, so a test activates a
|
|
5
|
+
feature, runs an operation against the offline (test-mode) transport, and
|
|
6
|
+
asserts the bucket. Features that wrap the transport are additionally
|
|
7
|
+
checked for the effect they have on the request or the result. -/
|
|
8
|
+
|
|
9
|
+
import VoxgigStruct
|
|
10
|
+
import SdkJson
|
|
11
|
+
import SdkUtility
|
|
12
|
+
import SdkFeature
|
|
13
|
+
import SdkFeatures
|
|
14
|
+
import SdkClient
|
|
15
|
+
|
|
16
|
+
open VoxgigStruct
|
|
17
|
+
|
|
18
|
+
initialize npass : IO.Ref Nat ← IO.mkRef 0
|
|
19
|
+
initialize nfail : IO.Ref Nat ← IO.mkRef 0
|
|
20
|
+
|
|
21
|
+
def pass (msg : String) : SIO Unit := do
|
|
22
|
+
npass.modify (· + 1)
|
|
23
|
+
IO.println s!"ok - {msg}"
|
|
24
|
+
|
|
25
|
+
def fail (msg : String) : SIO Unit := do
|
|
26
|
+
nfail.modify (· + 1)
|
|
27
|
+
IO.println s!"FAIL - {msg}"
|
|
28
|
+
|
|
29
|
+
def check (cond : Bool) (msg : String) : SIO Unit := do
|
|
30
|
+
if cond then pass msg else fail msg
|
|
31
|
+
|
|
32
|
+
def gp := SdkUtility.gp
|
|
33
|
+
def gpS := SdkUtility.gpS
|
|
34
|
+
|
|
35
|
+
def numAt (v : Value) (k : String) : SIO Float := do
|
|
36
|
+
match (← gp v k) with
|
|
37
|
+
| .num n => pure n
|
|
38
|
+
| _ => pure 0.0
|
|
39
|
+
|
|
40
|
+
/-- A test-mode client with the named features activated. -/
|
|
41
|
+
def clientWith (seed : Value) (feats : Array (String × Value)) : SIO Value := do
|
|
42
|
+
let fmap ← emptyMap
|
|
43
|
+
for (n, o) in feats do
|
|
44
|
+
SdkUtility.sp fmap n o
|
|
45
|
+
let opts ← emptyMap
|
|
46
|
+
SdkUtility.sp opts "feature" fmap
|
|
47
|
+
Sdk.testSdk seed opts
|
|
48
|
+
|
|
49
|
+
def onOpts (extra : Array (String × Value)) : SIO Value := do
|
|
50
|
+
let o ← newMap #[("active", .bool true)]
|
|
51
|
+
for (k, v) in extra do
|
|
52
|
+
SdkUtility.sp o k v
|
|
53
|
+
pure o
|
|
54
|
+
|
|
55
|
+
/-- The bucket a feature records into. -/
|
|
56
|
+
def bucketOf (client : Value) (name : String) : SIO Value := do
|
|
57
|
+
gp (← gp client "track") name
|
|
58
|
+
|
|
59
|
+
/-- The first entity that has a `list` op AND generated seed data: the feature
|
|
60
|
+
suite is entity-agnostic, so it discovers its subject from the config. -/
|
|
61
|
+
def findSubject : SIO (Option (String × Value)) := do
|
|
62
|
+
let config ← SdkJson.jsonRead SdkConfig.configJson
|
|
63
|
+
let ents ← gp config "entity"
|
|
64
|
+
for name in (← keysof ents) do
|
|
65
|
+
let e ← gp ents name
|
|
66
|
+
let hasList ← (match (← gp (← gp e "op") "list") with
|
|
67
|
+
| .map _ => pure true
|
|
68
|
+
| _ => pure false)
|
|
69
|
+
if hasList then
|
|
70
|
+
let Name := name.capitalize
|
|
71
|
+
let seedPath := "../.sdk/test/entity/" ++ name ++ "/" ++ Name ++ "TestData.json"
|
|
72
|
+
if ← System.FilePath.pathExists seedPath then
|
|
73
|
+
let seed ← SdkJson.jsonRead (← IO.FS.readFile seedPath)
|
|
74
|
+
return some (name, seed)
|
|
75
|
+
pure none
|
|
76
|
+
|
|
77
|
+
def main : IO UInt32 := do
|
|
78
|
+
let sctx ← mkCtx
|
|
79
|
+
let go : SIO Unit := do
|
|
80
|
+
match (← findSubject) with
|
|
81
|
+
| none => IO.println "skip - no entity with list op and seed data"
|
|
82
|
+
| some (ent, seed) => do
|
|
83
|
+
let mt ← emptyMap
|
|
84
|
+
|
|
85
|
+
-- log: counts requests
|
|
86
|
+
(do
|
|
87
|
+
let c ← clientWith seed #[("log", ← onOpts #[])]
|
|
88
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
89
|
+
let b ← bucketOf c "log"
|
|
90
|
+
check ((← numAt b "calls") == 1.0) "log: counts one request")
|
|
91
|
+
|
|
92
|
+
-- metrics: totals and a per-op bucket
|
|
93
|
+
(do
|
|
94
|
+
let c ← clientWith seed #[("metrics", ← onOpts #[])]
|
|
95
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
96
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
97
|
+
let b ← bucketOf c "metrics"
|
|
98
|
+
let total ← gp b "total"
|
|
99
|
+
check ((← numAt total "count") == 2.0) "metrics: counts two operations"
|
|
100
|
+
check ((← numAt total "ok") == 2.0) "metrics: both recorded ok"
|
|
101
|
+
let ops ← gp b "ops"
|
|
102
|
+
check ((← keysof ops).size >= 1) "metrics: per-op bucket created")
|
|
103
|
+
|
|
104
|
+
-- telemetry: one span per operation, closed out
|
|
105
|
+
(do
|
|
106
|
+
let c ← clientWith seed #[("telemetry", ← onOpts #[])]
|
|
107
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
108
|
+
let b ← bucketOf c "telemetry"
|
|
109
|
+
let spans ← gp b "spans"
|
|
110
|
+
let n ← (match spans with | .list i => do pure (← listItems i).size | _ => pure 0)
|
|
111
|
+
check (n == 1) "telemetry: records one span"
|
|
112
|
+
check ((← numAt b "active") == 0.0) "telemetry: span closed (active back to 0)")
|
|
113
|
+
|
|
114
|
+
-- audit: one record per operation
|
|
115
|
+
(do
|
|
116
|
+
let c ← clientWith seed #[("audit", ← onOpts #[])]
|
|
117
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
118
|
+
let b ← bucketOf c "audit"
|
|
119
|
+
let recs ← gp b "records"
|
|
120
|
+
let n ← (match recs with | .list i => do pure (← listItems i).size | _ => pure 0)
|
|
121
|
+
check (n == 1) "audit: records one operation")
|
|
122
|
+
|
|
123
|
+
-- debug: an entry, with sensitive headers redacted
|
|
124
|
+
(do
|
|
125
|
+
let c ← clientWith seed #[("debug", ← onOpts #[])]
|
|
126
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
127
|
+
let b ← bucketOf c "debug"
|
|
128
|
+
let entries ← gp b "entries"
|
|
129
|
+
match entries with
|
|
130
|
+
| .list i => do
|
|
131
|
+
let its ← listItems i
|
|
132
|
+
check (its.size == 1) "debug: records one entry"
|
|
133
|
+
if its.size > 0 then do
|
|
134
|
+
let e := its[0]!
|
|
135
|
+
check ((← gpS e "op") != "") "debug: entry names the operation"
|
|
136
|
+
| _ => fail "debug: no entries list")
|
|
137
|
+
|
|
138
|
+
-- idempotency: injects a key header on mutating ops only
|
|
139
|
+
(do
|
|
140
|
+
let c ← clientWith seed #[("idempotency", ← onOpts #[])]
|
|
141
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
142
|
+
let b0 ← bucketOf c "idempotency"
|
|
143
|
+
check ((← numAt b0 "issued") == 0.0) "idempotency: no key for a read op"
|
|
144
|
+
let d ← newMap #[("name", .str "idem")]
|
|
145
|
+
let _ ← SdkRuntime.opCreate c ent d mt
|
|
146
|
+
let b ← bucketOf c "idempotency"
|
|
147
|
+
check ((← numAt b "issued") == 1.0) "idempotency: issues a key for create"
|
|
148
|
+
check ((← gpS b "last") != "") "idempotency: records the issued key")
|
|
149
|
+
|
|
150
|
+
-- clienttrack: request/session headers and a request count
|
|
151
|
+
(do
|
|
152
|
+
let c ← clientWith seed #[("clienttrack", ← onOpts #[])]
|
|
153
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
154
|
+
let b ← bucketOf c "clienttrack"
|
|
155
|
+
check ((← numAt b "requests") == 1.0) "clienttrack: counts the request"
|
|
156
|
+
check ((← gpS b "session") != "") "clienttrack: assigns a session id"
|
|
157
|
+
check ((← gpS b "lastRequestId") != "") "clienttrack: assigns a request id")
|
|
158
|
+
|
|
159
|
+
-- rbac: denies when the required permission is absent, allows when granted
|
|
160
|
+
(do
|
|
161
|
+
let rules ← newMap #[("list", .str "read")]
|
|
162
|
+
let c ← clientWith seed #[("rbac", ← onOpts #[("rules", rules)])]
|
|
163
|
+
let denied ← (try
|
|
164
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
165
|
+
pure false
|
|
166
|
+
catch _ => pure true)
|
|
167
|
+
check denied "rbac: denies an operation without the permission"
|
|
168
|
+
let b ← bucketOf c "rbac"
|
|
169
|
+
check ((← numAt b "denied") == 1.0) "rbac: records the denial")
|
|
170
|
+
(do
|
|
171
|
+
let rules ← newMap #[("list", .str "read")]
|
|
172
|
+
let perms ← newList #[.str "read"]
|
|
173
|
+
let c ← clientWith seed #[("rbac", ← onOpts #[("rules", rules), ("perms", perms)])]
|
|
174
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
175
|
+
let b ← bucketOf c "rbac"
|
|
176
|
+
check ((← numAt b "allowed") == 1.0) "rbac: allows when the permission is granted")
|
|
177
|
+
|
|
178
|
+
-- cache: second identical read is served from the cache
|
|
179
|
+
(do
|
|
180
|
+
let c ← clientWith seed #[("cache", ← onOpts #[])]
|
|
181
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
182
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
183
|
+
let b ← bucketOf c "cache"
|
|
184
|
+
check ((← numAt b "miss") == 1.0) "cache: first read is a miss"
|
|
185
|
+
check ((← numAt b "hit") == 1.0) "cache: second read is a hit")
|
|
186
|
+
|
|
187
|
+
-- ratelimit: a tight burst throttles
|
|
188
|
+
(do
|
|
189
|
+
let c ← clientWith seed #[("ratelimit", ← onOpts #[("rate", .num 1.0), ("burst", .num 1.0)])]
|
|
190
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
191
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
192
|
+
let b ← bucketOf c "ratelimit"
|
|
193
|
+
check ((← numAt b "throttled") >= 1.0) "ratelimit: throttles the second call")
|
|
194
|
+
|
|
195
|
+
-- netsim: offline simulation fails the request
|
|
196
|
+
(do
|
|
197
|
+
let c ← clientWith seed #[("netsim", ← onOpts #[("offline", .bool true)])]
|
|
198
|
+
let failed ← (try
|
|
199
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
200
|
+
pure false
|
|
201
|
+
catch _ => pure true)
|
|
202
|
+
check failed "netsim: offline simulation fails the request"
|
|
203
|
+
let b ← bucketOf c "netsim"
|
|
204
|
+
check ((← numAt b "calls") == 1.0) "netsim: records the simulated call")
|
|
205
|
+
|
|
206
|
+
-- netsim: failStatus is surfaced as the response status
|
|
207
|
+
(do
|
|
208
|
+
let c ← clientWith seed #[("netsim", ← onOpts #[("failStatus", .num 503.0)])]
|
|
209
|
+
let _ ← (try
|
|
210
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
211
|
+
pure ()
|
|
212
|
+
catch _ => pure ())
|
|
213
|
+
let b ← bucketOf c "netsim"
|
|
214
|
+
check ((← numAt b "calls") == 1.0) "netsim: failStatus simulation runs")
|
|
215
|
+
|
|
216
|
+
-- proxy: annotates the transport and records the route
|
|
217
|
+
(do
|
|
218
|
+
let c ← clientWith seed #[("proxy", ← onOpts #[("url", .str "http://proxy.local:8080")])]
|
|
219
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
220
|
+
let b ← bucketOf c "proxy"
|
|
221
|
+
check ((← numAt b "routed") == 1.0) "proxy: routes the request"
|
|
222
|
+
check ((← gpS b "url") == "http://proxy.local:8080") "proxy: records the proxy url")
|
|
223
|
+
|
|
224
|
+
-- timeout: a generous budget does not trip
|
|
225
|
+
(do
|
|
226
|
+
let c ← clientWith seed #[("timeout", ← onOpts #[("ms", .num 30000.0)])]
|
|
227
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
228
|
+
pass "timeout: request within budget succeeds")
|
|
229
|
+
|
|
230
|
+
-- retry: a healthy transport is not retried
|
|
231
|
+
(do
|
|
232
|
+
let c ← clientWith seed #[("retry", ← onOpts #[])]
|
|
233
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
234
|
+
let b ← bucketOf c "retry"
|
|
235
|
+
check ((← numAt b "attempts") == 0.0) "retry: no retry on a healthy response")
|
|
236
|
+
|
|
237
|
+
-- paging: annotates the query and counts items
|
|
238
|
+
(do
|
|
239
|
+
let c ← clientWith seed #[("paging", ← onOpts #[("size", .num 2.0)])]
|
|
240
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
241
|
+
let b ← bucketOf c "paging"
|
|
242
|
+
check ((← numAt b "pages") == 1.0) "paging: counts the page"
|
|
243
|
+
check ((← numAt b "items") >= 1.0) "paging: counts the returned items")
|
|
244
|
+
|
|
245
|
+
-- streaming: reports the emitted items
|
|
246
|
+
(do
|
|
247
|
+
let c ← clientWith seed #[("streaming", ← onOpts #[])]
|
|
248
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
249
|
+
let b ← bucketOf c "streaming"
|
|
250
|
+
check ((← numAt b "emitted") >= 1.0) "streaming: emits the list items"
|
|
251
|
+
check ((← numAt b "chunks") == 1.0) "streaming: reports one chunk")
|
|
252
|
+
|
|
253
|
+
-- an inactive feature records nothing
|
|
254
|
+
(do
|
|
255
|
+
let off ← newMap #[("active", .bool false)]
|
|
256
|
+
let c ← clientWith seed #[("log", off)]
|
|
257
|
+
let _ ← SdkRuntime.opList c ent mt mt
|
|
258
|
+
let b ← bucketOf c "log"
|
|
259
|
+
match b with
|
|
260
|
+
| .map _ => fail "inactive feature must not record"
|
|
261
|
+
| _ => pass "inactive feature records nothing")
|
|
262
|
+
|
|
263
|
+
go.run sctx
|
|
264
|
+
let p ← npass.get
|
|
265
|
+
let f ← nfail.get
|
|
266
|
+
IO.println ""
|
|
267
|
+
IO.println s!"feature: PASS {p} FAIL {f}"
|
|
268
|
+
if f > 0 then return 1 else return 0
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/- ProjectName SDK primary utility test.
|
|
2
|
+
|
|
3
|
+
Drives the SHARED language-neutral corpus (.sdk/test/test.json, section
|
|
4
|
+
`primary`) — the same fixtures every other target executes — so this suite
|
|
5
|
+
cannot drift from the reference implementation. Each section is looked up
|
|
6
|
+
with `getSpec` and executed with `runset`, as the ts/js reference harness
|
|
7
|
+
does. -/
|
|
8
|
+
|
|
9
|
+
import VoxgigStruct
|
|
10
|
+
import Vregex
|
|
11
|
+
import SdkJson
|
|
12
|
+
import SdkUtility
|
|
13
|
+
import SdkConfig
|
|
14
|
+
|
|
15
|
+
open VoxgigStruct
|
|
16
|
+
|
|
17
|
+
initialize npass : IO.Ref Nat ← IO.mkRef 0
|
|
18
|
+
initialize nfail : IO.Ref Nat ← IO.mkRef 0
|
|
19
|
+
initialize failures : IO.Ref (Array String) ← IO.mkRef #[]
|
|
20
|
+
|
|
21
|
+
def pass : SIO Unit := do npass.modify (· + 1)
|
|
22
|
+
|
|
23
|
+
def fail (msg : String) : SIO Unit := do
|
|
24
|
+
nfail.modify (· + 1)
|
|
25
|
+
failures.modify (·.push msg)
|
|
26
|
+
|
|
27
|
+
-- ---------------------------------------------------------------------------
|
|
28
|
+
-- corpus navigation
|
|
29
|
+
-- ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
/-- Navigate into the nested corpus map by keys. -/
|
|
32
|
+
def getSpec (root : Value) (path : Array String) : SIO Value := do
|
|
33
|
+
let mut cur := root
|
|
34
|
+
for k in path do
|
|
35
|
+
cur ← SdkUtility.gp cur k
|
|
36
|
+
pure cur
|
|
37
|
+
|
|
38
|
+
def itemsOf (v : Value) : SIO (Array Value) := do
|
|
39
|
+
match v with
|
|
40
|
+
| .list i => listItems i
|
|
41
|
+
| _ => pure #[]
|
|
42
|
+
|
|
43
|
+
def argAt (args : Value) (i : Nat) : SIO Value := do
|
|
44
|
+
pure ((← itemsOf args)[i]?.getD .noval)
|
|
45
|
+
|
|
46
|
+
-- ---------------------------------------------------------------------------
|
|
47
|
+
-- comparison
|
|
48
|
+
-- ---------------------------------------------------------------------------
|
|
49
|
+
|
|
50
|
+
/-- Deep structural equality; an empty list and an empty map are equivalent. -/
|
|
51
|
+
partial def deepEq (a b : Value) : SIO Bool := do
|
|
52
|
+
match a, b with
|
|
53
|
+
| .map ia, .map ib => do
|
|
54
|
+
let ka ← keysof (.map ia)
|
|
55
|
+
let kb ← keysof (.map ib)
|
|
56
|
+
if ka.size != kb.size then pure false
|
|
57
|
+
else do
|
|
58
|
+
let mut ok := true
|
|
59
|
+
for k in ka do
|
|
60
|
+
let va ← SdkUtility.gp (.map ia) k
|
|
61
|
+
let vb ← SdkUtility.gp (.map ib) k
|
|
62
|
+
if !(← deepEq va vb) then ok := false
|
|
63
|
+
pure ok
|
|
64
|
+
| .list ia, .list ib => do
|
|
65
|
+
let la ← listItems ia
|
|
66
|
+
let lb ← listItems ib
|
|
67
|
+
if la.size != lb.size then pure false
|
|
68
|
+
else do
|
|
69
|
+
let mut ok := true
|
|
70
|
+
for i in [0:la.size] do
|
|
71
|
+
if !(← deepEq (la[i]!) (lb[i]!)) then ok := false
|
|
72
|
+
pure ok
|
|
73
|
+
| .map ia, .list ib => do
|
|
74
|
+
pure ((← keysof (.map ia)).isEmpty && (← listItems ib).isEmpty)
|
|
75
|
+
| .list ia, .map ib => do
|
|
76
|
+
pure ((← listItems ia).isEmpty && (← keysof (.map ib)).isEmpty)
|
|
77
|
+
| x, y => pure (x == y)
|
|
78
|
+
|
|
79
|
+
/-- A corpus string check: `/re/` is a regex, otherwise substring containment. -/
|
|
80
|
+
def strCheck (checkStr subject : String) : Bool :=
|
|
81
|
+
if checkStr.length > 1 && checkStr.startsWith "/" && checkStr.endsWith "/" then
|
|
82
|
+
let inner := String.ofList (checkStr.toList.drop 1).dropLast
|
|
83
|
+
Vregex.testStr inner subject
|
|
84
|
+
else if checkStr == subject then true
|
|
85
|
+
else (subject.splitOn checkStr).length > 1
|
|
86
|
+
|
|
87
|
+
/-- Partial deep match: every key present in `check` must hold in `base`. -/
|
|
88
|
+
partial def matchDeep (check base : Value) (path : String) (errs : IO.Ref (Array String)) :
|
|
89
|
+
SIO Unit := do
|
|
90
|
+
match check with
|
|
91
|
+
| .map ic =>
|
|
92
|
+
for k in (← keysof (.map ic)) do
|
|
93
|
+
let cv ← SdkUtility.gp (.map ic) k
|
|
94
|
+
let bv ← SdkUtility.gp base k
|
|
95
|
+
matchDeep cv bv (if path == "" then k else path ++ "." ++ k) errs
|
|
96
|
+
| .list ic => do
|
|
97
|
+
let items ← listItems ic
|
|
98
|
+
let bitems ← itemsOf base
|
|
99
|
+
for i in [0:items.size] do
|
|
100
|
+
let bv := bitems[i]?.getD .noval
|
|
101
|
+
matchDeep (items[i]!) bv (path ++ "[" ++ toString i ++ "]") errs
|
|
102
|
+
| .str s =>
|
|
103
|
+
if s == "__EXISTS__" then
|
|
104
|
+
(if SdkUtility.isNov base then errs.modify (·.push (path ++ ": expected to exist")) else pure ())
|
|
105
|
+
else if s == "__UNDEF__" then
|
|
106
|
+
(if SdkUtility.isNov base then pure () else errs.modify (·.push (path ++ ": expected undefined")))
|
|
107
|
+
else do
|
|
108
|
+
let bs := SdkUtility.vs base
|
|
109
|
+
if strCheck s bs then pure ()
|
|
110
|
+
else errs.modify (·.push (path ++ ": want " ++ s ++ ", got " ++ bs))
|
|
111
|
+
| _ => do
|
|
112
|
+
if (← deepEq check base) then pure ()
|
|
113
|
+
else do
|
|
114
|
+
let cs ← stringify check
|
|
115
|
+
let bs ← stringify base
|
|
116
|
+
errs.modify (·.push (path ++ ": want " ++ cs ++ ", got " ++ bs))
|
|
117
|
+
|
|
118
|
+
-- ---------------------------------------------------------------------------
|
|
119
|
+
-- the runner
|
|
120
|
+
-- ---------------------------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
abbrev Subject := Value → SIO (Value × Option Value)
|
|
123
|
+
|
|
124
|
+
def runset (secname : String) (spec : Value) (subject : Subject) : SIO Unit := do
|
|
125
|
+
let entries ← itemsOf (← SdkUtility.gp spec "set")
|
|
126
|
+
for idx in [0:entries.size] do
|
|
127
|
+
let entry := entries[idx]!
|
|
128
|
+
let label := secname ++ "[" ++ toString idx ++ "]"
|
|
129
|
+
let errs ← IO.mkRef (#[] : Array String)
|
|
130
|
+
let (res, merr) ← subject entry
|
|
131
|
+
let expErr ← SdkUtility.gp entry "err"
|
|
132
|
+
let mspec ← SdkUtility.gp entry "match"
|
|
133
|
+
match merr with
|
|
134
|
+
| some e => do
|
|
135
|
+
let em ← SdkUtility.gpS e "message"
|
|
136
|
+
if SdkUtility.isNov expErr then fail (label ++ ": unexpected error: " ++ em)
|
|
137
|
+
else do
|
|
138
|
+
let ok := match expErr with
|
|
139
|
+
| .str s => strCheck s em
|
|
140
|
+
| .bool b => b
|
|
141
|
+
| _ => false
|
|
142
|
+
if !ok then fail (label ++ ": error mismatch: got " ++ em)
|
|
143
|
+
else do
|
|
144
|
+
if !(SdkUtility.isNov mspec) then do
|
|
145
|
+
let rm ← emptyMap
|
|
146
|
+
let emap ← newMap #[("message", .str em)]
|
|
147
|
+
SdkUtility.sp rm "err" emap
|
|
148
|
+
SdkUtility.sp rm "out" res
|
|
149
|
+
matchDeep mspec rm "" errs
|
|
150
|
+
let es ← errs.get
|
|
151
|
+
if es.isEmpty then pass else fail (label ++ ": " ++ String.intercalate "; " es.toList)
|
|
152
|
+
| none => do
|
|
153
|
+
if !(SdkUtility.isNov expErr) then fail (label ++ ": expected an error, got a result")
|
|
154
|
+
else do
|
|
155
|
+
if !(SdkUtility.isNov mspec) then do
|
|
156
|
+
let rm ← emptyMap
|
|
157
|
+
SdkUtility.sp rm "out" res
|
|
158
|
+
SdkUtility.sp rm "in" (← SdkUtility.gp entry "in")
|
|
159
|
+
SdkUtility.sp rm "ctx" (← SdkUtility.gp entry "ctx")
|
|
160
|
+
SdkUtility.sp rm "args" (← SdkUtility.gp entry "args")
|
|
161
|
+
matchDeep mspec rm "" errs
|
|
162
|
+
let expOut ← SdkUtility.gp entry "out"
|
|
163
|
+
if !(SdkUtility.isNov expOut) then
|
|
164
|
+
if !(← deepEq expOut res) then do
|
|
165
|
+
let rs ← stringify res
|
|
166
|
+
let os ← stringify expOut
|
|
167
|
+
errs.modify (·.push ("out: want " ++ os ++ ", got " ++ rs))
|
|
168
|
+
let es ← errs.get
|
|
169
|
+
if es.isEmpty then pass else fail (label ++ ": " ++ String.intercalate "; " es.toList)
|
|
170
|
+
|
|
171
|
+
-- ---------------------------------------------------------------------------
|
|
172
|
+
-- context construction
|
|
173
|
+
-- ---------------------------------------------------------------------------
|
|
174
|
+
|
|
175
|
+
/-- The entry's own `ctx` map (created and attached when absent), wired to the
|
|
176
|
+
client options/config so the utilities see them. -/
|
|
177
|
+
def entryCtx (entry options config : Value) : SIO Value := do
|
|
178
|
+
let ctx ← match (← SdkUtility.gp entry "ctx") with
|
|
179
|
+
| .map i => pure (Value.map i)
|
|
180
|
+
| _ => do
|
|
181
|
+
let m ← emptyMap
|
|
182
|
+
SdkUtility.sp entry "ctx" m
|
|
183
|
+
pure m
|
|
184
|
+
SdkUtility.sp ctx "options" options
|
|
185
|
+
SdkUtility.sp ctx "config" config
|
|
186
|
+
pure ctx
|
|
187
|
+
|
|
188
|
+
/-- A ctx from a bare map (args-style sections); published back onto the entry
|
|
189
|
+
as `ctx` so a `match: ctx:` assertion sees the mutated context. -/
|
|
190
|
+
def mapCtx (entry v options config : Value) : SIO Value := do
|
|
191
|
+
let ctx ← match v with
|
|
192
|
+
| .map i => pure (Value.map i)
|
|
193
|
+
| _ => emptyMap
|
|
194
|
+
SdkUtility.sp ctx "options" options
|
|
195
|
+
SdkUtility.sp ctx "config" config
|
|
196
|
+
SdkUtility.sp entry "ctx" ctx
|
|
197
|
+
pure ctx
|
|
198
|
+
|
|
199
|
+
-- ---------------------------------------------------------------------------
|
|
200
|
+
-- main
|
|
201
|
+
-- ---------------------------------------------------------------------------
|
|
202
|
+
|
|
203
|
+
def specPaths : Array String :=
|
|
204
|
+
#["../.sdk/test/test.json", ".sdk/test/test.json", "test/test.json"]
|
|
205
|
+
|
|
206
|
+
def readSpecFile : IO String := do
|
|
207
|
+
match (← IO.getEnv "SDK_TEST_SPEC") with
|
|
208
|
+
| some p => IO.FS.readFile p
|
|
209
|
+
| none => do
|
|
210
|
+
for p in specPaths do
|
|
211
|
+
if ← System.FilePath.pathExists p then
|
|
212
|
+
return (← IO.FS.readFile p)
|
|
213
|
+
throw (IO.userError "cannot find .sdk/test/test.json (set SDK_TEST_SPEC)")
|
|
214
|
+
|
|
215
|
+
def main : IO UInt32 := do
|
|
216
|
+
let raw ← readSpecFile
|
|
217
|
+
let sctx ← mkCtx
|
|
218
|
+
let go : SIO Unit := do
|
|
219
|
+
let root ← SdkJson.jsonRead raw
|
|
220
|
+
let primary ← SdkUtility.gp root "primary"
|
|
221
|
+
let config ← SdkJson.jsonRead SdkConfig.configJson
|
|
222
|
+
let opts ← SdkUtility.makeOptions config (← emptyMap)
|
|
223
|
+
|
|
224
|
+
runset "done" (← getSpec primary #["done", "basic"]) fun entry => do
|
|
225
|
+
SdkUtility.done (← entryCtx entry opts config)
|
|
226
|
+
|
|
227
|
+
runset "makeContext" (← getSpec primary #["makeContext", "basic"]) fun entry => do
|
|
228
|
+
let ctx ← mapCtx entry (← SdkUtility.gp entry "in") opts config
|
|
229
|
+
pure ((← SdkUtility.makeContext ctx), none)
|
|
230
|
+
|
|
231
|
+
runset "makeError" (← getSpec primary #["makeError", "basic"]) fun entry => do
|
|
232
|
+
let args ← SdkUtility.gp entry "args"
|
|
233
|
+
let ctx ← mapCtx entry (← argAt args 0) opts config
|
|
234
|
+
pure (.noval, some (← SdkUtility.makeError ctx (← argAt args 1)))
|
|
235
|
+
|
|
236
|
+
runset "makeOptions" (← getSpec primary #["makeOptions", "basic"]) fun entry => do
|
|
237
|
+
let inv ← SdkUtility.gp entry "in"
|
|
238
|
+
pure ((← SdkUtility.makeOptions (← SdkUtility.gp inv "config") (← SdkUtility.gp inv "options")), none)
|
|
239
|
+
|
|
240
|
+
runset "makeRequest" (← getSpec primary #["makeRequest", "basic"]) fun entry => do
|
|
241
|
+
SdkUtility.makeRequest (← entryCtx entry opts config)
|
|
242
|
+
|
|
243
|
+
runset "makeResponse" (← getSpec primary #["makeResponse", "basic"]) fun entry => do
|
|
244
|
+
SdkUtility.makeResponse (← entryCtx entry opts config)
|
|
245
|
+
|
|
246
|
+
let specOpts ← SdkUtility.makeOptions config (← getSpec primary #["makeSpec", "DEF", "setup", "a"])
|
|
247
|
+
runset "makeSpec" (← getSpec primary #["makeSpec", "basic"]) fun entry => do
|
|
248
|
+
SdkUtility.makeSpec (← entryCtx entry specOpts config)
|
|
249
|
+
|
|
250
|
+
runset "makeUrl" (← getSpec primary #["makeUrl", "basic"]) fun entry => do
|
|
251
|
+
SdkUtility.makeUrl (← entryCtx entry opts config)
|
|
252
|
+
|
|
253
|
+
runset "operator" (← getSpec primary #["operator", "basic"]) fun entry => do
|
|
254
|
+
pure ((← SdkUtility.operator (← SdkUtility.gp entry "in")), none)
|
|
255
|
+
|
|
256
|
+
runset "param" (← getSpec primary #["param", "basic"]) fun entry => do
|
|
257
|
+
let args ← SdkUtility.gp entry "args"
|
|
258
|
+
let ctx ← mapCtx entry (← argAt args 0) opts config
|
|
259
|
+
pure ((← SdkUtility.param ctx (← argAt args 1)), none)
|
|
260
|
+
|
|
261
|
+
let authOpts ← SdkUtility.makeOptions config (← getSpec primary #["prepareAuth", "DEF", "setup", "a"])
|
|
262
|
+
runset "prepareAuth" (← getSpec primary #["prepareAuth", "basic"]) fun entry => do
|
|
263
|
+
SdkUtility.prepareAuth (← entryCtx entry authOpts config)
|
|
264
|
+
|
|
265
|
+
runset "prepareBody" (← getSpec primary #["prepareBody", "basic"]) fun entry => do
|
|
266
|
+
pure ((← SdkUtility.prepareBody (← entryCtx entry opts config)), none)
|
|
267
|
+
|
|
268
|
+
runset "prepareHeaders" (← getSpec primary #["prepareHeaders", "basic"]) fun entry => do
|
|
269
|
+
pure ((← SdkUtility.prepareHeaders (← entryCtx entry opts config)), none)
|
|
270
|
+
|
|
271
|
+
runset "prepareMethod" (← getSpec primary #["prepareMethod", "basic"]) fun entry => do
|
|
272
|
+
let m ← SdkUtility.prepareMethod (← entryCtx entry opts config)
|
|
273
|
+
pure (.str m, none)
|
|
274
|
+
|
|
275
|
+
runset "prepareParams" (← getSpec primary #["prepareParams", "basic"]) fun entry => do
|
|
276
|
+
pure ((← SdkUtility.prepareParams (← entryCtx entry opts config)), none)
|
|
277
|
+
|
|
278
|
+
runset "preparePath" (← getSpec primary #["preparePath", "basic"]) fun entry => do
|
|
279
|
+
let p ← SdkUtility.preparePath (← entryCtx entry opts config)
|
|
280
|
+
pure (.str p, none)
|
|
281
|
+
|
|
282
|
+
runset "prepareQuery" (← getSpec primary #["prepareQuery", "basic"]) fun entry => do
|
|
283
|
+
pure ((← SdkUtility.prepareQuery (← entryCtx entry opts config)), none)
|
|
284
|
+
|
|
285
|
+
runset "resultBasic" (← getSpec primary #["resultBasic", "basic"]) fun entry => do
|
|
286
|
+
let ctx ← entryCtx entry opts config
|
|
287
|
+
SdkUtility.resultBasic ctx
|
|
288
|
+
pure ((← SdkUtility.gp ctx "result"), none)
|
|
289
|
+
|
|
290
|
+
runset "resultBody" (← getSpec primary #["resultBody", "basic"]) fun entry => do
|
|
291
|
+
let ctx ← entryCtx entry opts config
|
|
292
|
+
SdkUtility.resultBody ctx
|
|
293
|
+
pure ((← SdkUtility.gp ctx "result"), none)
|
|
294
|
+
|
|
295
|
+
runset "resultHeaders" (← getSpec primary #["resultHeaders", "basic"]) fun entry => do
|
|
296
|
+
let ctx ← entryCtx entry opts config
|
|
297
|
+
SdkUtility.resultHeaders ctx
|
|
298
|
+
pure ((← SdkUtility.gp ctx "result"), none)
|
|
299
|
+
|
|
300
|
+
runset "transformRequest" (← getSpec primary #["transformRequest", "basic"]) fun entry => do
|
|
301
|
+
pure ((← SdkUtility.transformRequest (← entryCtx entry opts config)), none)
|
|
302
|
+
|
|
303
|
+
runset "transformResponse" (← getSpec primary #["transformResponse", "basic"]) fun entry => do
|
|
304
|
+
pure ((← SdkUtility.transformResponse (← entryCtx entry opts config)), none)
|
|
305
|
+
|
|
306
|
+
-- The remaining corpus sections. They carry no cases in this project's
|
|
307
|
+
-- corpus, but are driven here so any future fixture runs against Lean too.
|
|
308
|
+
|
|
309
|
+
runset "clean" (← getSpec primary #["clean", "basic"]) fun entry => do
|
|
310
|
+
let ctx ← entryCtx entry opts config
|
|
311
|
+
pure ((← SdkUtility.clean ctx (← SdkUtility.gp entry "in")), none)
|
|
312
|
+
|
|
313
|
+
runset "makeResult" (← getSpec primary #["makeResult", "basic"]) fun entry => do
|
|
314
|
+
pure ((← SdkUtility.makeResult (← entryCtx entry opts config)), none)
|
|
315
|
+
|
|
316
|
+
runset "makePoint" (← getSpec primary #["makePoint", "basic"]) fun entry => do
|
|
317
|
+
pure ((← SdkUtility.makePoint (← entryCtx entry opts config)), none)
|
|
318
|
+
|
|
319
|
+
runset "makeFetchDef" (← getSpec primary #["makeFetchDef", "basic"]) fun entry => do
|
|
320
|
+
pure ((← SdkUtility.makeFetchDef (← entryCtx entry opts config)), none)
|
|
321
|
+
|
|
322
|
+
runset "fetcher" (← getSpec primary #["fetcher", "basic"]) fun entry => do
|
|
323
|
+
let ctx ← entryCtx entry opts config
|
|
324
|
+
let url ← SdkUtility.gpS entry "url"
|
|
325
|
+
pure ((← SdkUtility.fetcher ctx url (← SdkUtility.gp entry "fetchdef")), none)
|
|
326
|
+
|
|
327
|
+
runset "featureAdd" (← getSpec primary #["featureAdd", "basic"]) fun entry => do
|
|
328
|
+
let client ← emptyMap
|
|
329
|
+
SdkUtility.featureAdd client (← SdkUtility.gp entry "in")
|
|
330
|
+
pure ((← SdkUtility.gp client "features"), none)
|
|
331
|
+
|
|
332
|
+
runset "featureInit" (← getSpec primary #["featureInit", "basic"]) fun entry => do
|
|
333
|
+
let client ← emptyMap
|
|
334
|
+
SdkUtility.featureInit client (← entryCtx entry opts config)
|
|
335
|
+
pure ((← SdkUtility.gp client "features"), none)
|
|
336
|
+
|
|
337
|
+
runset "featureHook" (← getSpec primary #["featureHook", "basic"]) fun entry => do
|
|
338
|
+
let client ← emptyMap
|
|
339
|
+
SdkUtility.featureHook client (← SdkUtility.gpS entry "stage") (← entryCtx entry opts config)
|
|
340
|
+
pure ((← SdkUtility.gp client "features"), none)
|
|
341
|
+
|
|
342
|
+
go.run sctx
|
|
343
|
+
for f in (← failures.get) do
|
|
344
|
+
IO.println ("FAIL - " ++ f)
|
|
345
|
+
let p ← npass.get
|
|
346
|
+
let f ← nfail.get
|
|
347
|
+
IO.println ""
|
|
348
|
+
IO.println s!"primary-utility: PASS {p} FAIL {f}"
|
|
349
|
+
if f > 0 then return 1 else return 0
|
|
@@ -1052,14 +1052,16 @@ describe("PrimaryUtility", function()
|
|
|
1052
1052
|
|
|
1053
1053
|
|
|
1054
1054
|
it("preparePath-basic", function()
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1055
|
+
-- Was hand-written cases that had drifted out of the shared corpus
|
|
1056
|
+
-- (the preparePath fixture shipped as an empty `set: []`).
|
|
1057
|
+
runset(get_spec(primary, "preparePath", "basic"), function(entry)
|
|
1058
|
+
local ctxmap = entry["ctx"]
|
|
1059
|
+
if type(ctxmap) ~= "table" then
|
|
1060
|
+
ctxmap = {}
|
|
1061
|
+
end
|
|
1062
|
+
local ctx = make_ctx_from_map(ctxmap, client, utility)
|
|
1063
|
+
return utility.prepare_path(ctx), nil
|
|
1064
|
+
end)
|
|
1063
1065
|
end)
|
|
1064
1066
|
|
|
1065
1067
|
|
|
@@ -888,23 +888,14 @@ runset('prepareParams.basic', get_spec($PRIMARY, 'prepareParams', 'basic'), sub
|
|
|
888
888
|
|
|
889
889
|
# === preparePath ===
|
|
890
890
|
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
{
|
|
901
|
-
my $ctx = make_test_full_ctx($client, $utility);
|
|
902
|
-
$ctx->{point} = {
|
|
903
|
-
'parts' => ['items'],
|
|
904
|
-
'args' => { 'params' => [] },
|
|
905
|
-
};
|
|
906
|
-
is($utility->{prepare_path}->($ctx), 'items', 'prepare_path single');
|
|
907
|
-
}
|
|
891
|
+
# Was two hand-written cases that had drifted out of the shared corpus
|
|
892
|
+
# (the preparePath fixture shipped as an empty `set: []`).
|
|
893
|
+
runset('preparePath.basic', get_spec($PRIMARY, 'preparePath', 'basic'), sub {
|
|
894
|
+
my ($entry) = @_;
|
|
895
|
+
my $ctxmap = $entry->{ctx} || {};
|
|
896
|
+
my $ctx = make_ctx_from_map($ctxmap, $client, $utility);
|
|
897
|
+
return $utility->{prepare_path}->($ctx);
|
|
898
|
+
});
|
|
908
899
|
|
|
909
900
|
|
|
910
901
|
# === prepareQuery ===
|