@@ -2,8 +2,11 @@ package cache_test
22
33import (
44 "bytes"
5- "context"
5+ "encoding/json"
6+ "io/ioutil"
67 "math/rand"
8+ "net/http"
9+ "net/http/httptest"
710 "time"
811
912 . "github.com/onsi/ginkgo"
@@ -19,92 +22,130 @@ var _ = Describe("Cache", func() {
1922 rand .Seed (0 )
2023
2124 Context ("when sending multiple identical requests" , func () {
22- Context ("when the request is of CachedAccess level" , func () {
23- It ("should only forward a single request" , func () {
24- db := kv .NewMemDB (kv .JSONCodec )
25- store := kv .NewTable (db , "test" )
26- ttl := kv .NewTTLCache (context .Background (), db , "ttl" , time .Second )
27- logger := logrus .StandardLogger ()
28- cache := New (store , ttl , logger )
29-
30- counter := 0
31- f := func () ([]byte , error ) {
32- counter ++
33- return []byte (time .Now ().String ()), nil
34- }
35-
36- phi .ParForAll (10 , func (i int ) {
37- time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
38- _ , err := cache .Get (1 , "hash" , f )
39- Expect (err ).ToNot (HaveOccurred ())
40- })
41-
42- Expect (counter ).To (Equal (1 ))
43- })
25+ It ("should only forward a single request" , func () {
26+ store := kv .NewTable (kv .NewMemDB (kv .JSONCodec ), "test" )
27+ logger := logrus .StandardLogger ()
28+ cache := New (store , logger )
29+
30+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
31+ w .WriteHeader (http .StatusOK )
32+ w .Write ([]byte {})
33+ }))
34+ defer server .Close ()
4435
45- It ("should return the same result for each request" , func () {
46- db := kv .NewMemDB (kv .JSONCodec )
47- store := kv .NewTable (db , "test" )
48- ttl := kv .NewTTLCache (context .Background (), db , "ttl" , time .Second )
49- logger := logrus .StandardLogger ()
50- cache := New (store , ttl , logger )
51-
52- counter := 0
53- f := func () ([]byte , error ) {
54- counter ++
55- return []byte (time .Now ().String ()), nil
56- }
57-
58- numRequests := 10
59- responses := make ([][]byte , numRequests )
60- phi .ParForAll (numRequests , func (i int ) {
61- time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
62- resp , err := cache .Get (1 , "hash" , f )
63- Expect (err ).ToNot (HaveOccurred ())
64- responses [i ] = resp
65- })
66- for _ , resp := range responses {
67- Expect (bytes .Equal (resp , responses [0 ])).Should (BeTrue ())
68- }
36+ numRequests := 0
37+ phi .ParBegin (func () {
38+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
39+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
40+ Expect (err ).ToNot (HaveOccurred ())
41+ }, func () {
42+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
43+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
44+ Expect (err ).ToNot (HaveOccurred ())
45+ }, func () {
46+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
47+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
48+ Expect (err ).ToNot (HaveOccurred ())
49+ }, func () {
50+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
51+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
52+ Expect (err ).ToNot (HaveOccurred ())
53+ }, func () {
54+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
55+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
56+ Expect (err ).ToNot (HaveOccurred ())
57+ }, func () {
58+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
59+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
60+ Expect (err ).ToNot (HaveOccurred ())
61+ }, func () {
62+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
63+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
64+ Expect (err ).ToNot (HaveOccurred ())
65+ }, func () {
66+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
67+ _ , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
68+ Expect (err ).ToNot (HaveOccurred ())
6969 })
70+
71+ Expect (numRequests ).To (Equal (1 ))
7072 })
7173
72- Context ("when the request is FullAccess level" , func () {
73- It ("should return the same result for each request and only be forwards once" , func () {
74- db := kv .NewMemDB (kv .JSONCodec )
75- store := kv .NewTable (db , "test" )
76- ttl := kv .NewTTLCache (context .Background (), db , "ttl" , time .Second )
77- logger := logrus .StandardLogger ()
78- cache := New (store , ttl , logger )
79-
80- expire := time .After (4 * time .Second )
81- counter := 0
82- f := func () ([]byte , error ) {
83- counter ++
84- return []byte (time .Now ().String ()), nil
85- }
86-
87- // Expect result to be cached and only one request will be forwarded
88- numRequests := 10
89- responses := make ([][]byte , numRequests )
90- phi .ParForAll (numRequests , func (i int ) {
91- time .Sleep (time .Duration (rand .Intn (1000 )) * time .Millisecond )
92- resp , err := cache .Get (2 , "hash" , f )
93- Expect (err ).ToNot (HaveOccurred ())
94- responses [i ] = resp
95- })
96- Expect (counter ).Should (Equal (1 ))
97- for _ , resp := range responses {
98- Expect (bytes .Equal (resp , responses [0 ])).Should (BeTrue ())
99- }
100-
101- // Expect the result to be expired and the request be forwarded again.
102- <- expire
103- resp , err := cache .Get (2 , "hash" , f )
104- Expect (err ).ToNot (HaveOccurred ())
105- Expect (counter ).Should (Equal (2 ))
106- Expect (bytes .Equal (resp , responses [0 ])).ShouldNot (BeTrue ())
74+ It ("should return the same result for each request" , func () {
75+ store := kv .NewTable (kv .NewMemDB (kv .JSONCodec ), "test" )
76+ logger := logrus .StandardLogger ()
77+ cache := New (store , logger )
78+
79+ response := []byte ("response" )
80+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
81+ w .WriteHeader (http .StatusOK )
82+ w .Write (response )
83+ }))
84+ defer server .Close ()
85+
86+ numRequests := 0
87+ phi .ParBegin (func () {
88+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
89+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
90+ Expect (err ).ToNot (HaveOccurred ())
91+ Expect (resp ).To (Equal (response ))
92+ }, func () {
93+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
94+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
95+ Expect (err ).ToNot (HaveOccurred ())
96+ Expect (resp ).To (Equal (response ))
97+ }, func () {
98+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
99+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
100+ Expect (err ).ToNot (HaveOccurred ())
101+ Expect (resp ).To (Equal (response ))
102+ }, func () {
103+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
104+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
105+ Expect (err ).ToNot (HaveOccurred ())
106+ Expect (resp ).To (Equal (response ))
107+ }, func () {
108+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
109+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
110+ Expect (err ).ToNot (HaveOccurred ())
111+ Expect (resp ).To (Equal (response ))
112+ }, func () {
113+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
114+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
115+ Expect (err ).ToNot (HaveOccurred ())
116+ Expect (resp ).To (Equal (response ))
117+ }, func () {
118+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
119+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
120+ Expect (err ).ToNot (HaveOccurred ())
121+ Expect (resp ).To (Equal (response ))
122+ }, func () {
123+ time .Sleep (time .Duration (rand .Intn (5000 )) * time .Millisecond )
124+ resp , err := cache .Get (1 , "hash" , getResponse (server .URL , & numRequests ))
125+ Expect (err ).ToNot (HaveOccurred ())
126+ Expect (resp ).To (Equal (response ))
107127 })
108128 })
109129 })
110130})
131+
132+ func getResponse (url string , numRequests * int ) func () ([]byte , error ) {
133+ return func () ([]byte , error ) {
134+ * numRequests ++
135+
136+ req := map [string ]string {"" : "" }
137+ reqBytes , err := json .Marshal (req )
138+ Expect (err ).ToNot (HaveOccurred ())
139+
140+ resp , err := http .Post (url , "application/json" , bytes .NewBuffer (reqBytes ))
141+ Expect (err ).ToNot (HaveOccurred ())
142+
143+ data , err := ioutil .ReadAll (resp .Body )
144+ Expect (err ).ToNot (HaveOccurred ())
145+
146+ // Add 3 second timeout to simulate latency.
147+ time .Sleep (3 * time .Second )
148+
149+ return data , nil
150+ }
151+ }
0 commit comments