@@ -16,6 +16,8 @@ import (
1616
1717 "github.com/smartcontractkit/chainlink-common/pkg/config"
1818 "github.com/smartcontractkit/chainlink-common/pkg/contexts"
19+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
20+ "github.com/smartcontractkit/chainlink-common/pkg/settings/limits"
1921)
2022
2123var update = flag .Bool ("update" , false , "update the golden files of this test" )
@@ -74,6 +76,12 @@ func TestSchema_Unmarshal(t *testing.T) {
7476 },
7577 "PerWorkflow": {
7678 "WASMMemoryLimit": "250mb",
79+ "ChainAllowed": {
80+ "Default": "false",
81+ "Values": {
82+ "1": "true"
83+ }
84+ },
7785 "CRONTrigger": {
7886 "RateLimit": "every10s:5"
7987 },
@@ -103,6 +111,10 @@ func TestSchema_Unmarshal(t *testing.T) {
103111 assert .Equal (t , 48 * time .Hour , cfg .PerOrg .ZeroBalancePruningTimeout .DefaultValue )
104112 assert .Equal (t , 99 , cfg .PerOwner .WorkflowExecutionConcurrencyLimit .DefaultValue )
105113 assert .Equal (t , 250 * config .MByte , cfg .PerWorkflow .WASMMemoryLimit .DefaultValue )
114+ assert .Equal (t , false , cfg .PerWorkflow .ChainAllowed .Default .DefaultValue )
115+ assert .Equal (t , "true" , cfg .PerWorkflow .ChainAllowed .Values ["1" ])
116+ assert .NotNil (t , cfg .PerWorkflow .ChainAllowed .Default .Parse )
117+ assert .NotNil (t , cfg .PerWorkflow .ChainAllowed .KeyFromCtx )
106118 assert .Equal (t , config.Rate {Limit : rate .Every (10 * time .Second ), Burst : 5 }, cfg .PerWorkflow .CRONTrigger .RateLimit .DefaultValue )
107119 assert .Equal (t , config.Rate {Limit : rate .Every (30 * time .Second ), Burst : 3 }, cfg .PerWorkflow .HTTPTrigger .RateLimit .DefaultValue )
108120 assert .Equal (t , config.Rate {Limit : rate .Every (13 * time .Second ), Burst : 6 }, cfg .PerWorkflow .LogTrigger .EventRateLimit .DefaultValue )
@@ -142,11 +154,6 @@ func TestDefaultGetter(t *testing.T) {
142154}` )
143155 reinit () // set default vars
144156
145- _ = `
146- [workflow.test-wf-id]
147- PerWorkflow.HTTPAction.CallLimit = 20
148- `
149-
150157 // Default unchanged
151158 got , err = limit .GetOrDefault (ctx , DefaultGetter )
152159 require .NoError (t , err )
@@ -158,3 +165,81 @@ PerWorkflow.HTTPAction.CallLimit = 20
158165 require .Equal (t , 20 , got )
159166
160167}
168+
169+ func TestDefaultGetter_SettingMap (t * testing.T ) {
170+ limit := Default .PerWorkflow .ChainAllowed
171+
172+ ctx := contexts .WithCRE (t .Context (), contexts.CRE {Owner : "owner-id" , Workflow : "foo" })
173+ ctx = contexts .WithChainSelector (ctx , 1234 )
174+ overrideCtx := contexts .WithCRE (t .Context (), contexts.CRE {Owner : "owner-id" , Workflow : "test-wf-id" })
175+ overrideCtx = contexts .WithChainSelector (overrideCtx , 1234 )
176+
177+ // None allowed by default
178+ got , err := limit .GetOrDefault (ctx , DefaultGetter )
179+ require .NoError (t , err )
180+ require .False (t , got )
181+ got , err = limit .GetOrDefault (overrideCtx , DefaultGetter )
182+ require .NoError (t , err )
183+ require .False (t , got )
184+
185+ t .Cleanup (reinit ) // restore default vars
186+
187+ // Org override to allow
188+ t .Setenv (envNameSettings , `{
189+ "workflow": {
190+ "test-wf-id": {
191+ "PerWorkflow": {
192+ "ChainAllowed": {
193+ "Values": {
194+ "1234": "true"
195+ }
196+ }
197+ }
198+ }
199+ }
200+ }` )
201+ reinit () // set default vars
202+ got , err = limit .GetOrDefault (ctx , DefaultGetter )
203+ require .NoError (t , err )
204+ require .False (t , got )
205+ got , err = limit .GetOrDefault (overrideCtx , DefaultGetter )
206+ require .NoError (t , err )
207+ require .True (t , got )
208+
209+ // Org override to allow by default, but disallow some
210+ t .Setenv (envNameSettings , `{
211+ "workflow": {
212+ "test-wf-id": {
213+ "PerWorkflow": {
214+ "ChainAllowed": {
215+ "Default": true,
216+ "Values": {
217+ "1234": "false"
218+ }
219+ }
220+ }
221+ }
222+ }
223+ }` )
224+ reinit () // set default vars
225+ got , err = limit .GetOrDefault (ctx , DefaultGetter )
226+ require .NoError (t , err )
227+ require .False (t , got )
228+ got , err = limit .GetOrDefault (overrideCtx , DefaultGetter )
229+ require .NoError (t , err )
230+ require .False (t , got )
231+ got , err = limit .GetOrDefault (contexts .WithChainSelector (overrideCtx , 42 ), DefaultGetter )
232+ require .NoError (t , err )
233+ require .True (t , got )
234+ }
235+
236+ func TestChainAllows (t * testing.T ) {
237+ gl , err := limits .MakeGateLimiter (limits.Factory {Logger : logger .Test (t )}, Default .PerWorkflow .ChainAllowed )
238+ require .NoError (t , err )
239+
240+ ctx := contexts .WithCRE (t .Context (), contexts.CRE {Owner : "owner-id" , Workflow : "foo" })
241+
242+ assert .NoError (t , gl .AllowErr (contexts .WithChainSelector (ctx , 3379446385462418246 )))
243+ assert .NoError (t , gl .AllowErr (contexts .WithChainSelector (ctx , 12922642891491394802 )))
244+ assert .ErrorIs (t , gl .AllowErr (contexts .WithChainSelector (ctx , 1234 )), limits.ErrorNotAllowed {})
245+ }
0 commit comments