@@ -2,7 +2,6 @@ package proxy
2
2
3
3
import (
4
4
"context"
5
- "encoding/json"
6
5
"fmt"
7
6
"io"
8
7
"net/http"
@@ -17,53 +16,33 @@ import (
17
16
)
18
17
19
18
func TestProxy (t * testing.T ) {
20
- const chainID = "unittest"
19
+ for name , kind := range map [string ]ProxyKind {
20
+ "rpc" : RPC ,
21
+ "rest" : Rest ,
22
+ } {
23
+ t .Run (name , func (t * testing.T ) {
24
+ testProxy (t , kind )
25
+ })
26
+ }
27
+ }
28
+
29
+ func testProxy (tb testing.TB , kind ProxyKind ) {
21
30
srv1 := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
22
31
_ , _ = io .WriteString (w , "srv1 replied" )
23
32
}))
24
- t .Cleanup (srv1 .Close )
33
+ tb .Cleanup (srv1 .Close )
25
34
srv2 := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
26
35
time .Sleep (time .Millisecond * 500 )
27
36
_ , _ = io .WriteString (w , "srv2 replied" )
28
37
}))
29
- t .Cleanup (srv2 .Close )
38
+ tb .Cleanup (srv2 .Close )
30
39
srv3 := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
31
40
w .WriteHeader (http .StatusTeapot )
32
41
}))
33
- t .Cleanup (srv2 .Close )
34
-
35
- seed := seed.Seed {
36
- ChainID : chainID ,
37
- APIs : seed.Apis {
38
- RPC : []seed.Provider {
39
- {
40
- Address : srv1 .URL ,
41
- Provider : "srv1" ,
42
- },
43
- {
44
- Address : srv2 .URL ,
45
- Provider : "srv2" ,
46
- },
47
- {
48
- Address : srv3 .URL ,
49
- Provider : "srv3" ,
50
- },
51
- },
52
- },
53
- }
54
-
55
- t .Logf ("%+v" , seed )
56
-
57
- seedSrv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
58
- bts , _ := json .Marshal (seed )
59
- _ , _ = w .Write (bts )
60
- }))
61
- t .Cleanup (seedSrv .Close )
42
+ tb .Cleanup (srv2 .Close )
62
43
63
- proxy := New (config.Config {
64
- SeedURL : seedSrv .URL ,
65
- SeedRefreshInterval : 500 * time .Millisecond ,
66
- ChainID : chainID ,
44
+ ch := make (chan seed.Seed , 1 )
45
+ proxy := New (kind , ch , config.Config {
67
46
HealthyThreshold : 10 * time .Millisecond ,
68
47
ProxyRequestTimeout : time .Second ,
69
48
UnhealthyServerRecoverChancePct : 1 ,
@@ -72,19 +51,43 @@ func TestProxy(t *testing.T) {
72
51
})
73
52
74
53
ctx , cancel := context .WithCancel (context .Background ())
75
- t .Cleanup (cancel )
54
+ tb .Cleanup (cancel )
76
55
proxy .Start (ctx )
77
56
78
- require .Len (t , proxy .servers , 3 )
57
+ serverList := []seed.Provider {
58
+ {
59
+ Address : srv1 .URL ,
60
+ Provider : "srv1" ,
61
+ },
62
+ {
63
+ Address : srv2 .URL ,
64
+ Provider : "srv2" ,
65
+ },
66
+ {
67
+ Address : srv3 .URL ,
68
+ Provider : "srv3" ,
69
+ },
70
+ }
71
+
72
+ ch <- seed.Seed {
73
+ APIs : seed.Apis {
74
+ Rest : serverList ,
75
+ RPC : serverList ,
76
+ },
77
+ }
78
+
79
+ require .Eventually (tb , func () bool { return proxy .initialized .Load () }, time .Second , time .Millisecond )
80
+
81
+ require .Len (tb , proxy .servers , 3 )
79
82
80
83
proxySrv := httptest .NewServer (proxy )
81
- t .Cleanup (proxySrv .Close )
84
+ tb .Cleanup (proxySrv .Close )
82
85
83
86
var wg errgroup.Group
84
87
wg .SetLimit (20 )
85
88
for i := 0 ; i < 100 ; i ++ {
86
89
wg .Go (func () error {
87
- t .Log ("go" )
90
+ tb .Log ("go" )
88
91
req , err := http .NewRequest (http .MethodGet , proxySrv .URL , nil )
89
92
if err != nil {
90
93
return err
@@ -102,13 +105,13 @@ func TestProxy(t *testing.T) {
102
105
return nil
103
106
})
104
107
}
105
- require .NoError (t , wg .Wait ())
108
+ require .NoError (tb , wg .Wait ())
106
109
107
110
// stop the proxy
108
111
cancel ()
109
112
110
113
stats := proxy .Stats ()
111
- require .Len (t , stats , 3 )
114
+ require .Len (tb , stats , 3 )
112
115
113
116
var srv1Stats ServerStat
114
117
var srv2Stats ServerStat
@@ -124,13 +127,13 @@ func TestProxy(t *testing.T) {
124
127
srv3Stats = st
125
128
}
126
129
}
127
- require .Zero (t , srv1Stats .ErrorRate )
128
- require .Zero (t , srv2Stats .ErrorRate )
129
- require .Equal (t , float64 (100 ), srv3Stats .ErrorRate )
130
- require .Greater (t , srv1Stats .Requests , srv2Stats .Requests )
131
- require .Greater (t , srv2Stats .Avg , srv1Stats .Avg )
132
- require .False (t , srv1Stats .Degraded )
133
- require .True (t , srv2Stats .Degraded )
134
- require .True (t , srv1Stats .Initialized )
135
- require .True (t , srv2Stats .Initialized )
130
+ require .Zero (tb , srv1Stats .ErrorRate )
131
+ require .Zero (tb , srv2Stats .ErrorRate )
132
+ require .Equal (tb , float64 (100 ), srv3Stats .ErrorRate )
133
+ require .Greater (tb , srv1Stats .Requests , srv2Stats .Requests )
134
+ require .Greater (tb , srv2Stats .Avg , srv1Stats .Avg )
135
+ require .False (tb , srv1Stats .Degraded )
136
+ require .True (tb , srv2Stats .Degraded )
137
+ require .True (tb , srv1Stats .Initialized )
138
+ require .True (tb , srv2Stats .Initialized )
136
139
}
0 commit comments