| 963 | } |
| 964 | |
| 965 | func TestStringCostLimitEnforced(t *testing.T) { |
| 966 | env, err := cel.NewEnv(Strings()) |
| 967 | if err != nil { |
| 968 | t.Fatalf("cel.NewEnv() failed: %v", err) |
| 969 | } |
| 970 | // Chained replaces that produce exponential output. |
| 971 | // Without cost tracking, this would be charged ~6. With tracking, the cost |
| 972 | // scales with output size and should exceed any reasonable limit. |
| 973 | expr := `"A".replace("", "AAAAAAAAAA").replace("", "AAAAAAAAAA").replace("", "AAAAAAAAAA").replace("", "AAAAAAAAAA").replace("", "AAAAAAAAAA").replace("", "AAAAAAAAAA")` |
| 974 | ast, iss := env.Compile(expr) |
| 975 | if iss.Err() != nil { |
| 976 | t.Fatalf("env.Compile() failed: %v", iss.Err()) |
| 977 | } |
| 978 | prg, err := env.Program(ast, cel.CostLimit(1000), cel.CostTracking(nil)) |
| 979 | if err != nil { |
| 980 | t.Fatalf("env.Program() failed: %v", err) |
| 981 | } |
| 982 | _, _, err = prg.Eval(cel.NoVars()) |
| 983 | if err == nil { |
| 984 | t.Error("expected cost limit exceeded error for exponential string growth, got nil") |
| 985 | } |
| 986 | } |