@@ -11,6 +11,9 @@ import (
1111 "github.com/go-resty/resty/v2"
1212 "github.com/stretchr/testify/assert"
1313 "github.com/stretchr/testify/require"
14+
15+ cfgnet "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/config/network"
16+ "github.com/smartcontractkit/chainlink-deployments-framework/pkg/logger"
1417)
1518
1619// JSONRPCRequest represents a JSON-RPC request
@@ -126,3 +129,102 @@ func Test_AnvilClient_SendTransaction(t *testing.T) {
126129 })
127130 }
128131}
132+
133+ func Test_isPublicRPC (t * testing.T ) {
134+ t .Parallel ()
135+ tests := []struct {
136+ url string
137+ want bool
138+ }{
139+ {"http://rpcs.cldev.sh/" , false },
140+ {"https://rpcs.cldev.sh/" , false },
141+ {"https://rpcs.cldev.sh/anything" , false },
142+ {"https://gap-rpcs.stage.cldev.sh/anything" , false },
143+ {"https://gap-rpcs.prod.cldev.sh/anything" , false },
144+ {"https://gap-other.prod.cldev.sh/anything" , false },
145+ {"https://gap-other.stage.cldev.sh/anything" , false },
146+ {"https://gap-other.stage.cldev.sh/anything" , false },
147+ {"https://gap-grpc-job-distributor.public.main.prod.cldev.sh/" , false },
148+ {"https://gap-ws-job-distributor.public.main.prod.cldev.sh/" , false },
149+ {"https://gap-rpc-proxy.public.main.prod.cldev.sh/" , false },
150+ {"https://gap-grpc-job-distributor.public.main.stage.cldev.sh/" , false },
151+ {"https://gap-ws-job-distributor.public.main.stage.cldev.sh/" , false },
152+ {"https://gap-grpc-chainlink-catalog.public.main.stage.cldev.sh/" , false },
153+ {"" , true },
154+ {"http://" , true },
155+ {"https://" , true },
156+ {"https://rpcs.cldev.sh" , true },
157+ {"https://rpcs.prod.cldev.sh/anything" , true },
158+ {"https://rpcs.stage.cldev.sh/anything" , true },
159+ {"https://gap.stage.cldev.sh/anything" , true },
160+ }
161+ for _ , tt := range tests {
162+ t .Run (tt .url , func (t * testing.T ) {
163+ t .Parallel ()
164+ require .Equal (t , tt .want , isPublicRPC (tt .url ))
165+ })
166+ }
167+ }
168+
169+ func Test_selectPublicRPC (t * testing.T ) {
170+ t .Parallel ()
171+
172+ lggr := logger .Test (t )
173+ tests := []struct {
174+ name string
175+ metadata * cfgnet.EVMMetadata
176+ chainSelector uint64
177+ rpcs []cfgnet.RPC
178+ want * cfgnet.EVMMetadata
179+ wantErr string
180+ }{
181+ {
182+ name : "success: metadata has url" ,
183+ metadata : & cfgnet.EVMMetadata {AnvilConfig : & cfgnet.AnvilConfig {
184+ ArchiveHTTPURL : "http://metadata.url" ,
185+ }},
186+ rpcs : []cfgnet.RPC {
187+ {HTTPURL : "http://other.url" },
188+ },
189+ want : & cfgnet.EVMMetadata {AnvilConfig : & cfgnet.AnvilConfig {
190+ ArchiveHTTPURL : "http://metadata.url" ,
191+ }},
192+ },
193+ {
194+ name : "success: private rpc in metadata is replaced public url from parameters" ,
195+ metadata : & cfgnet.EVMMetadata {AnvilConfig : & cfgnet.AnvilConfig {
196+ ArchiveHTTPURL : "http://gap-rpc.prod.cldev.sh/ethereum/sepolia" ,
197+ }},
198+ rpcs : []cfgnet.RPC {
199+ {HTTPURL : "http://rpcs.cldev.sh/ethereum/sepolia" },
200+ {HTTPURL : "http://public.rpc.url" },
201+ },
202+ want : & cfgnet.EVMMetadata {AnvilConfig : & cfgnet.AnvilConfig {
203+ ArchiveHTTPURL : "http://public.rpc.url" ,
204+ }},
205+ },
206+ {
207+ name : "failure: no public rpcs found" ,
208+ metadata : & cfgnet.EVMMetadata {AnvilConfig : & cfgnet.AnvilConfig {
209+ ArchiveHTTPURL : "http://gap-rpc.prod.cldev.sh/ethereum/sepolia" ,
210+ }},
211+ rpcs : []cfgnet.RPC {
212+ {HTTPURL : "http://rpcs.cldev.sh/ethereum/sepolia" },
213+ },
214+ wantErr : "no public RPCs found for chain 0" ,
215+ },
216+ }
217+ for _ , tt := range tests {
218+ t .Run (tt .name , func (t * testing.T ) {
219+ t .Parallel ()
220+
221+ err := selectPublicRPC (lggr , tt .metadata , tt .chainSelector , tt .rpcs )
222+ if tt .wantErr == "" {
223+ require .NoError (t , err )
224+ require .Equal (t , tt .want , tt .metadata )
225+ } else {
226+ require .ErrorContains (t , err , tt .wantErr )
227+ }
228+ })
229+ }
230+ }
0 commit comments