@@ -8,25 +8,15 @@ import (
88)
99
1010func TestRecursionLimitExceeded (t * testing.T ) {
11- engine := MustNewEngine (Config {
12- RecursionLimit : 3 ,
13- })
14-
15- script , err := engine .Compile (`def recurse(n)
11+ script := compileScriptWithConfig (t , Config {RecursionLimit : 3 }, `def recurse(n)
1612 if n <= 0
1713 "done"
1814 else
1915 recurse(n - 1)
2016 end
2117end` )
22- if err != nil {
23- t .Fatalf ("compile: %v" , err )
24- }
2518
26- _ , err = script .Call (context .Background (), "recurse" , []Value {NewInt (5 )}, CallOptions {})
27- if err == nil {
28- t .Fatalf ("expected recursion depth error" )
29- }
19+ err := callScriptErr (t , context .Background (), script , "recurse" , []Value {NewInt (5 )}, CallOptions {})
3020
3121 var re * RuntimeError
3222 if ! errors .As (err , & re ) {
@@ -38,57 +28,37 @@ end`)
3828}
3929
4030func TestRecursionLimitAllowsWithinBound (t * testing.T ) {
41- engine := MustNewEngine (Config {
42- RecursionLimit : 5 ,
43- })
44-
45- script , err := engine .Compile (`def recurse(n)
31+ script := compileScriptWithConfig (t , Config {RecursionLimit : 5 }, `def recurse(n)
4632 if n <= 0
4733 0
4834 else
4935 recurse(n - 1) + 1
5036 end
5137end` )
52- if err != nil {
53- t .Fatalf ("compile: %v" , err )
54- }
5538
56- result , err := script .Call (context .Background (), "recurse" , []Value {NewInt (4 )}, CallOptions {})
57- if err != nil {
58- t .Fatalf ("unexpected error: %v" , err )
59- }
39+ result := callScript (t , context .Background (), script , "recurse" , []Value {NewInt (4 )}, CallOptions {})
6040 if result .Kind () != KindInt || result .Int () != 4 {
6141 t .Fatalf ("unexpected result: %v" , result )
6242 }
6343}
6444
6545func TestRecursionLimitDefaultApplies (t * testing.T ) {
66- engine := MustNewEngine (Config {})
67-
68- script , err := engine .Compile (`def recurse(n)
46+ script := compileScriptDefault (t , `def recurse(n)
6947 if n <= 0
7048 "done"
7149 else
7250 recurse(n - 1)
7351 end
7452end` )
75- if err != nil {
76- t .Fatalf ("compile: %v" , err )
77- }
7853
79- _ , err = script .Call (context .Background (), "recurse" , []Value {NewInt (100 )}, CallOptions {})
80- if err == nil {
81- t .Fatalf ("expected recursion depth error at default limit" )
82- }
54+ err := callScriptErr (t , context .Background (), script , "recurse" , []Value {NewInt (100 )}, CallOptions {})
8355 if ! strings .Contains (err .Error (), "recursion depth exceeded" ) {
8456 t .Fatalf ("unexpected error: %v" , err )
8557 }
8658}
8759
8860func TestMutualRecursionRespectsLimit (t * testing.T ) {
89- engine := MustNewEngine (Config {RecursionLimit : 4 })
90-
91- script , err := engine .Compile (`def a(n)
61+ script := compileScriptWithConfig (t , Config {RecursionLimit : 4 }, `def a(n)
9262 if n <= 0
9363 "done"
9464 else
@@ -103,92 +73,56 @@ def b(n)
10373 a(n - 1)
10474 end
10575end` )
106- if err != nil {
107- t .Fatalf ("compile: %v" , err )
108- }
10976
110- _ , err = script .Call (context .Background (), "a" , []Value {NewInt (10 )}, CallOptions {})
111- if err == nil {
112- t .Fatalf ("expected recursion depth error" )
113- }
77+ err := callScriptErr (t , context .Background (), script , "a" , []Value {NewInt (10 )}, CallOptions {})
11478 if ! strings .Contains (err .Error (), "recursion depth exceeded" ) {
11579 t .Fatalf ("unexpected error: %v" , err )
11680 }
11781}
11882
11983func TestRecursionLimitWinsOverStepQuota (t * testing.T ) {
120- engine := MustNewEngine (Config {
121- RecursionLimit : 3 ,
122- StepQuota : 1_000_000 ,
123- })
124-
125- script , err := engine .Compile (`def spin(n)
84+ script := compileScriptWithConfig (t , Config {RecursionLimit : 3 , StepQuota : 1_000_000 }, `def spin(n)
12685 if n <= 0
12786 0
12887 else
12988 1 + spin(n - 1)
13089 end
13190end` )
132- if err != nil {
133- t .Fatalf ("compile: %v" , err )
134- }
13591
136- _ , err = script .Call (context .Background (), "spin" , []Value {NewInt (50 )}, CallOptions {})
137- if err == nil {
138- t .Fatalf ("expected recursion depth error" )
139- }
92+ err := callScriptErr (t , context .Background (), script , "spin" , []Value {NewInt (50 )}, CallOptions {})
14093 if ! strings .Contains (err .Error (), "recursion depth exceeded (limit 3)" ) {
14194 t .Fatalf ("unexpected error: %v" , err )
14295 }
14396}
14497
14598func TestRecursionLimitNoLeakAfterError (t * testing.T ) {
146- engine := MustNewEngine (Config {RecursionLimit : 4 })
147-
148- script , err := engine .Compile (`def ping(n)
99+ script := compileScriptWithConfig (t , Config {RecursionLimit : 4 }, `def ping(n)
149100 if n <= 0
150101 "ok"
151102 else
152103 ping(n - 1)
153104 end
154105end` )
155- if err != nil {
156- t .Fatalf ("compile: %v" , err )
157- }
158106
159107 // First call exceeds the limit.
160108 _ , _ = script .Call (context .Background (), "ping" , []Value {NewInt (10 )}, CallOptions {})
161109
162110 // Second call within the limit should still succeed.
163- result , err := script .Call (context .Background (), "ping" , []Value {NewInt (3 )}, CallOptions {})
164- if err != nil {
165- t .Fatalf ("unexpected error on second call: %v" , err )
166- }
111+ result := callScript (t , context .Background (), script , "ping" , []Value {NewInt (3 )}, CallOptions {})
167112 if result .Kind () != KindString || result .String () != "ok" {
168113 t .Fatalf ("unexpected result: %v" , result )
169114 }
170115}
171116
172117func TestRecursionLimitWithWhileLoopFrames (t * testing.T ) {
173- engine := MustNewEngine (Config {
174- RecursionLimit : 4 ,
175- StepQuota : 1_000_000 ,
176- })
177-
178- script , err := engine .Compile (`def recurse(n)
118+ script := compileScriptWithConfig (t , Config {RecursionLimit : 4 , StepQuota : 1_000_000 }, `def recurse(n)
179119 while n > 0
180120 n = n - 1
181121 end
182122 recurse(1)
183123end` )
184- if err != nil {
185- t .Fatalf ("compile: %v" , err )
186- }
187124
188- _ , err = script .Call (context .Background (), "recurse" , []Value {NewInt (3 )}, CallOptions {})
189- if err == nil {
190- t .Fatalf ("expected recursion depth error" )
191- }
125+ err := callScriptErr (t , context .Background (), script , "recurse" , []Value {NewInt (3 )}, CallOptions {})
192126 if ! strings .Contains (err .Error (), "recursion depth exceeded (limit 4)" ) {
193127 t .Fatalf ("unexpected error: %v" , err )
194128 }
0 commit comments