Skip to content

Commit 54070aa

Browse files
test ocr_telemetry_feed_message_report_req_median metric (#107)
* add median test * lint * fix * change retry to eventually * lint
1 parent f3d69ff commit 54070aa

File tree

16 files changed

+366
-225
lines changed

16 files changed

+366
-225
lines changed

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,8 @@ test_contract: ## run contract tests
7878

7979
.PHONY: test_vrf
8080
test_vrf: ## run vrf tests
81-
ginkgo -r --focus=@vrf
81+
ginkgo -r --focus=@vrf
82+
83+
.PHONY: test_observability
84+
test_observability: # run observability tests
85+
ginkgo -r --focus=@observability

client/mockserver.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package client
2+
3+
import (
4+
"net/http"
5+
)
6+
7+
// MockserverClient mockserver client
8+
type MockserverClient struct {
9+
*BasicHTTPClient
10+
Config *MockserverConfig
11+
}
12+
13+
// MockserverConfig holds config information for MockserverClient
14+
type MockserverConfig struct {
15+
LocalURL string
16+
ClusterURL string
17+
}
18+
19+
// NewMockserverClient returns a mockserver client
20+
func NewMockserverClient(cfg *MockserverConfig) *MockserverClient {
21+
return &MockserverClient{
22+
Config: cfg,
23+
BasicHTTPClient: NewBasicHTTPClient(&http.Client{}, cfg.LocalURL),
24+
}
25+
}
26+
27+
// PutExpectations sets the expectations (i.e. mocked responses)
28+
func (em *MockserverClient) PutExpectations(body interface{}) error {
29+
_, err := em.do(http.MethodPut, "/expectation", &body, nil, http.StatusCreated)
30+
return err
31+
}
32+
33+
// ClearExpectation clears expectations
34+
func (em *MockserverClient) ClearExpectation(body interface{}) error {
35+
_, err := em.do(http.MethodPut, "/clear", &body, nil, http.StatusOK)
36+
return err
37+
}
38+
39+
// PathSelector represents the json object used to find expectations by path
40+
type PathSelector struct {
41+
Path string `json:"path"`
42+
}
43+
44+
// HttpRequest represents the httpRequest json object used in the mockserver initializer
45+
type HttpRequest struct {
46+
Path string `json:"path"`
47+
}
48+
49+
// HttpResponse represents the httpResponse json object used in the mockserver initializer
50+
type HttpResponse struct {
51+
Body interface{} `json:"body"`
52+
}
53+
54+
// HttpInitializer represents an element of the initializer array used in the mockserver initializer
55+
type HttpInitializer struct {
56+
Request HttpRequest `json:"httpRequest"`
57+
Response HttpResponse `json:"httpResponse"`
58+
}
59+
60+
// For OTPE - weiwatchers
61+
62+
// NodeInfoJSON represents an element of the nodes array used to deliver configs to otpe
63+
type NodeInfoJSON struct {
64+
ID string `json:"id"`
65+
NodeAddress []string `json:"nodeAddress"`
66+
}
67+
68+
// ContractInfoJSON represents an element of the contracts array used to deliver configs to otpe
69+
type ContractInfoJSON struct {
70+
ContractAddress string `json:"contractAddress"`
71+
ContractVersion int `json:"contractVersion"`
72+
Path string `json:"path"`
73+
Status string `json:"status"`
74+
}
75+
76+
// For Adapter endpoints
77+
78+
// AdapterResult represents an int result for an adapter
79+
type AdapterResult struct {
80+
Result int `json:"result"`
81+
}
82+
83+
// AdapterResponse represents a response from an adapter
84+
type AdapterResponse struct {
85+
Id string `json:"id"`
86+
Data AdapterResult `json:"data"`
87+
Error interface{} `json:"error"`
88+
}

client/prometheus.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,13 @@ func (p *Prometheus) GetAlerts() (v1.AlertsResult, error) {
105105
return v1.AlertsResult{}, err
106106
}
107107
return alerts, nil
108-
}
108+
}
109+
110+
// GetQuery returns the result of applying a PromQL query
111+
func (p *Prometheus) GetQuery(query string) (model.Value, error) {
112+
value, _, err := p.API.Query(context.Background(), query, time.Now())
113+
if err != nil {
114+
return nil, err
115+
}
116+
return value, nil
117+
}

environment/charts/mockserver/mockserver_types.go

Lines changed: 0 additions & 33 deletions
This file was deleted.

environment/environment.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ func GetPrometheusClientFromEnv(env Environment) (*client.Prometheus, error) {
6666
return client.NewPrometheusClient(sd.LocalURL.String())
6767
}
6868

69+
// GetMockserverClientFromEnv returns a Mockserver client
70+
func GetMockserverClientFromEnv(env Environment) (*client.MockserverClient, error) {
71+
sd, err := env.GetServiceDetails(MockserverAPIPort)
72+
if err != nil {
73+
return nil, err
74+
}
75+
return client.NewMockserverClient(&client.MockserverConfig{
76+
LocalURL: sd.LocalURL.String(),
77+
ClusterURL: sd.RemoteURL.String(),
78+
}), nil
79+
}
80+
6981
// GetChainlinkClients will return all instantiated Chainlink clients for a given environment
7082
func GetChainlinkClients(env Environment) ([]client.Chainlink, error) {
7183
var clients []client.Chainlink

environment/environment_templates.go

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const (
2727
MinersRPCPort = 9545
2828
ExplorerAPIPort = 8080
2929
PrometheusAPIPort = 9090
30+
MockserverAPIPort = 1080
3031
)
3132

3233
// NewAdapterManifest is the k8s manifest that when used will deploy an external adapter to an environment
@@ -280,6 +281,16 @@ func NewGanacheManifest() *K8sManifest {
280281

281282
// NewChainlinkCluster is a basic environment that deploys hardhat with a chainlink cluster and an external adapter
282283
func NewChainlinkCluster(nodeCount int) K8sEnvSpecInit {
284+
mockserverConfigDependencyGroup := &K8sManifestGroup{
285+
id: "MockserverConfigDependencyGroup",
286+
manifests: []K8sEnvResource{NewMockserverConfigHelmChart()},
287+
}
288+
289+
mockserverDependencyGroup := &K8sManifestGroup{
290+
id: "MockserverDependencyGroup",
291+
manifests: []K8sEnvResource{NewMockserverHelmChart()},
292+
}
293+
283294
chainlinkGroup := &K8sManifestGroup{
284295
id: "chainlinkCluster",
285296
manifests: []K8sEnvResource{},
@@ -292,13 +303,23 @@ func NewChainlinkCluster(nodeCount int) K8sEnvSpecInit {
292303

293304
dependencyGroup := getBasicDependencyGroup()
294305
addPostgresDbsToDependencyGroup(dependencyGroup, nodeCount)
295-
dependencyGroups := []*K8sManifestGroup{dependencyGroup}
306+
dependencyGroups := []*K8sManifestGroup{mockserverConfigDependencyGroup, mockserverDependencyGroup, dependencyGroup}
296307
return addNetworkManifestToDependencyGroup("basic-chainlink", chainlinkGroup, dependencyGroups)
297308
}
298309

299-
// NewChainlinkClusterForAlertsTesting is a basic environment that deploys a chainlink cluster with dependencies
300-
// for testing alerts
301-
func NewChainlinkClusterForAlertsTesting(nodeCount int) K8sEnvSpecInit {
310+
// NewChainlinkClusterForObservabilityTesting is a basic environment that deploys a chainlink cluster with dependencies
311+
// for testing observability
312+
func NewChainlinkClusterForObservabilityTesting(nodeCount int) K8sEnvSpecInit {
313+
mockserverConfigDependencyGroup := &K8sManifestGroup{
314+
id: "MockserverConfigDependencyGroup",
315+
manifests: []K8sEnvResource{NewMockserverConfigHelmChart()},
316+
}
317+
318+
mockserverDependencyGroup := &K8sManifestGroup{
319+
id: "MockserverDependencyGroup",
320+
manifests: []K8sEnvResource{NewMockserverHelmChart()},
321+
}
322+
302323
chainlinkGroup := &K8sManifestGroup{
303324
id: "chainlinkCluster",
304325
manifests: []K8sEnvResource{},
@@ -315,16 +336,26 @@ func NewChainlinkClusterForAlertsTesting(nodeCount int) K8sEnvSpecInit {
315336
}
316337

317338
dependencyGroup := getBasicDependencyGroup()
318-
addServicesForTestingAlertsToDependencyGroup(dependencyGroup, nodeCount)
339+
dependencyGroup.manifests = append(dependencyGroup.manifests, NewExplorerManifest(nodeCount))
319340
addPostgresDbsToDependencyGroup(dependencyGroup, nodeCount)
320-
dependencyGroups := []*K8sManifestGroup{kafkaDependecyGroup, dependencyGroup}
341+
dependencyGroups := []*K8sManifestGroup{mockserverConfigDependencyGroup, mockserverDependencyGroup, kafkaDependecyGroup, dependencyGroup}
321342

322343
return addNetworkManifestToDependencyGroup("basic-chainlink", chainlinkGroup, dependencyGroups)
323344
}
324345

325346
// NewMixedVersionChainlinkCluster mixes the currently latest chainlink version (as defined by the config file) with
326347
// a number of past stable versions (defined by pastVersionsCount), ensuring that at least one of each is deployed
327348
func NewMixedVersionChainlinkCluster(nodeCount, pastVersionsCount int) K8sEnvSpecInit {
349+
mockserverConfigDependencyGroup := &K8sManifestGroup{
350+
id: "MockserverConfigDependencyGroup",
351+
manifests: []K8sEnvResource{NewMockserverConfigHelmChart()},
352+
}
353+
354+
mockserverDependencyGroup := &K8sManifestGroup{
355+
id: "MockserverDependencyGroup",
356+
manifests: []K8sEnvResource{NewMockserverHelmChart()},
357+
}
358+
328359
if nodeCount < 3 {
329360
log.Warn().
330361
Int("Provided Node Count", nodeCount).
@@ -358,7 +389,7 @@ func NewMixedVersionChainlinkCluster(nodeCount, pastVersionsCount int) K8sEnvSpe
358389

359390
dependencyGroup := getBasicDependencyGroup()
360391
addPostgresDbsToDependencyGroup(dependencyGroup, nodeCount)
361-
dependencyGroups := []*K8sManifestGroup{dependencyGroup}
392+
dependencyGroups := []*K8sManifestGroup{mockserverConfigDependencyGroup, mockserverDependencyGroup, dependencyGroup}
362393
return addNetworkManifestToDependencyGroup("mixed-version-chainlink", chainlinkGroup, dependencyGroups)
363394
}
364395

@@ -499,28 +530,10 @@ func addPostgresDbsToDependencyGroup(dependencyGroup *K8sManifestGroup, postgres
499530
}
500531
}
501532

502-
// addServicesForTestingAlertsToDependencyGroup adds services necessary for testing alerts to the dependency group
503-
func addServicesForTestingAlertsToDependencyGroup(dependencyGroup *K8sManifestGroup, nodeCount int) {
504-
dependencyGroup.manifests = append(dependencyGroup.manifests, NewExplorerManifest(nodeCount))
505-
}
506-
507-
// OtpeGroup contains manifests for mockserver, mockserver-config, and otpe
533+
// OtpeGroup contains manifests for otpe
508534
func OtpeGroup() K8sEnvSpecInit {
509535
return func(config *config.NetworkConfig) (string, K8sEnvSpecs) {
510536
var specs K8sEnvSpecs
511-
mockserverConfigDependencyGroup := &K8sManifestGroup{
512-
id: "MockserverConfigDependencyGroup",
513-
manifests: []K8sEnvResource{NewMockserverConfigHelmChart()},
514-
}
515-
516-
mockserverDependencyGroup := &K8sManifestGroup{
517-
id: "MockserverDependencyGroup",
518-
manifests: []K8sEnvResource{NewMockserverHelmChart()},
519-
}
520-
521-
specs = append(specs, mockserverConfigDependencyGroup)
522-
specs = append(specs, mockserverDependencyGroup)
523-
524537
otpeDependencyGroup := &K8sManifestGroup{
525538
id: "OTPEDependencyGroup",
526539
manifests: []K8sEnvResource{NewOTPEManifest()},

suite/contracts/contracts_cron_test.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@ package contracts
22

33
import (
44
"fmt"
5-
6-
"github.com/avast/retry-go"
75
. "github.com/onsi/ginkgo"
86
. "github.com/onsi/gomega"
9-
"github.com/pkg/errors"
107
"github.com/smartcontractkit/integrations-framework/actions"
118
"github.com/smartcontractkit/integrations-framework/client"
129
"github.com/smartcontractkit/integrations-framework/environment"
@@ -56,20 +53,17 @@ var _ = Describe("Cronjob suite @cron", func() {
5653

5754
Describe("with Cron job", func() {
5855
It("runs 5 times with no errors", func() {
59-
err = retry.Do(func() error {
56+
Eventually(func(g Gomega){
6057
jobRuns, err := nodes[0].ReadRunsByJob(job.Data.ID)
61-
if err != nil {
62-
return err
63-
}
64-
if len(jobRuns.Data) != 5 {
65-
return errors.New("not all jobs are completed")
66-
}
58+
g.Expect(err).ShouldNot(HaveOccurred())
59+
60+
g.Expect(len(jobRuns.Data)).Should(BeNumerically("==", 5))
61+
6762
for _, jr := range jobRuns.Data {
68-
Expect(jr.Attributes.Errors).Should(Equal([]interface{}{nil}))
63+
g.Expect(jr.Attributes.Errors).Should(Equal([]interface{}{nil}))
6964
}
70-
return nil
71-
})
72-
Expect(err).ShouldNot(HaveOccurred())
65+
}, "2m", "1s").Should(Succeed())
66+
7367
})
7468
})
7569

suite/contracts/contracts_keeper_test.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ package contracts
22

33
import (
44
"context"
5-
"errors"
65
"math/big"
76

8-
"github.com/avast/retry-go"
97
"github.com/ethereum/go-ethereum/common"
108
. "github.com/onsi/ginkgo"
119
. "github.com/onsi/gomega"
@@ -149,18 +147,12 @@ var _ = Describe("Keeper suite @keeper", func() {
149147
})
150148
Describe("with Keeper job", func() {
151149
It("performs upkeep of a target contract", func() {
152-
err = retry.Do(func() error {
150+
Eventually(func(g Gomega){
153151
cnt, err := consumer.Counter(context.Background())
154-
if err != nil {
155-
return err
156-
}
157-
if cnt.Int64() == 0 {
158-
return errors.New("awaiting for upkeep")
159-
}
152+
g.Expect(err).ShouldNot(HaveOccurred())
153+
g.Expect(cnt.Int64()).Should(BeNumerically(">", 0))
160154
log.Info().Int64("Upkeep counter", cnt.Int64()).Msg("Upkeeps performed")
161-
return nil
162-
})
163-
Expect(err).ShouldNot(HaveOccurred())
155+
}, "2m", "1s").Should(Succeed())
164156
})
165157
})
166158
AfterEach(func() {

0 commit comments

Comments
 (0)