@@ -2,6 +2,7 @@ package upload_droplet_test
2
2
3
3
import (
4
4
"bytes"
5
+ "context"
5
6
"errors"
6
7
"fmt"
7
8
"net/http"
@@ -11,7 +12,6 @@ import (
11
12
"time"
12
13
13
14
"code.cloudfoundry.org/cc-uploader/ccclient/fake_ccclient"
14
- "code.cloudfoundry.org/cc-uploader/handlers/test_helpers"
15
15
"code.cloudfoundry.org/cc-uploader/handlers/upload_droplet"
16
16
"code.cloudfoundry.org/lager/v3"
17
17
"code.cloudfoundry.org/runtimeschema/cc_messages"
@@ -178,55 +178,67 @@ var _ = Describe("UploadDroplet", func() {
178
178
})
179
179
180
180
Context ("when the requester (client) goes away" , func () {
181
- var fakeResponseWriter * test_helpers.FakeResponseWriter
182
181
183
- BeforeEach ( func () {
184
- var err error
185
- incomingRequest , err = http .NewRequest (
182
+ It ( "responds with an error code when the client goes away during upload" , func () {
183
+ ctx , cancel := context . WithCancel ( context . Background ())
184
+ req , err : = http .NewRequestWithContext ( ctx ,
186
185
"POST" ,
187
186
fmt .Sprintf ("http://example.com?%s=upload-uri.com" , cc_messages .CcDropletUploadUriKey ),
188
187
bytes .NewBufferString ("" ),
189
188
)
190
189
Expect (err ).NotTo (HaveOccurred ())
191
- })
192
190
193
- Context ("and we are uploading" , func () {
194
- BeforeEach (func () {
195
- closedChan := make (chan bool )
196
- fakeResponseWriter = test_helpers .NewFakeResponseWriter (closedChan )
197
- responseWriter = fakeResponseWriter
191
+ rec := httptest .NewRecorder ()
198
192
199
- uploader .UploadStub = func (uploadURL * url.URL , filename string , r * http.Request , cancelChan <- chan struct {}) (* http.Response , error ) {
200
- closedChan <- true
201
- Eventually (cancelChan ).Should (BeClosed ())
202
- return nil , errors .New ("cancelled" )
203
- }
204
- })
193
+ uploader .UploadStub = func (_ * url.URL , _ string , _ * http.Request , cancelChan <- chan struct {}) (* http.Response , error ) {
194
+ <- cancelChan
195
+ return nil , errors .New ("cancelled" )
196
+ }
205
197
206
- It ("responds with an error code" , func () {
207
- Expect (fakeResponseWriter .Code ).To (Equal (http .StatusInternalServerError ))
208
- })
198
+ done := make (chan struct {})
199
+ go func () {
200
+ h := upload_droplet .New (& uploader , & poller , lager .NewLogger ("fake-logger" ), & sync.WaitGroup {})
201
+ h .ServeHTTP (rec , req )
202
+ close (done )
203
+ }()
204
+
205
+ time .Sleep (100 * time .Millisecond )
206
+ cancel ()
207
+
208
+ Eventually (done , 2 * time .Second ).Should (BeClosed ())
209
+ Expect (rec .Code ).To (Equal (http .StatusInternalServerError ))
209
210
})
210
211
211
- Context ("and we are polling" , func () {
212
- BeforeEach (func () {
213
- uploadResponse := & http.Response {StatusCode : http .StatusOK }
214
- uploader .UploadReturns (uploadResponse , nil )
212
+ It ("responds with an error code when the client goes away during polling" , func () {
213
+ ctx , cancel := context .WithCancel (context .Background ())
214
+ req , err := http .NewRequestWithContext (ctx ,
215
+ "POST" ,
216
+ fmt .Sprintf ("http://example.com?%s=upload-uri.com" , cc_messages .CcDropletUploadUriKey ),
217
+ bytes .NewBufferString ("" ),
218
+ )
219
+ Expect (err ).NotTo (HaveOccurred ())
215
220
216
- closedChan := make (chan bool )
217
- fakeResponseWriter = test_helpers .NewFakeResponseWriter (closedChan )
218
- responseWriter = fakeResponseWriter
221
+ rec := httptest .NewRecorder ()
219
222
220
- poller .PollStub = func (fallbackURL * url.URL , res * http.Response , cancelChan <- chan struct {}) error {
221
- closedChan <- true
222
- Eventually (cancelChan ).Should (BeClosed ())
223
- return errors .New ("cancelled" )
224
- }
225
- })
223
+ uploader .UploadReturns (& http.Response {StatusCode : http .StatusOK }, nil )
226
224
227
- It ("responds with an error code" , func () {
228
- Expect (fakeResponseWriter .Code ).To (Equal (http .StatusInternalServerError ))
229
- })
225
+ poller .PollStub = func (_ * url.URL , _ * http.Response , cancelChan <- chan struct {}) error {
226
+ <- cancelChan
227
+ return errors .New ("cancelled" )
228
+ }
229
+
230
+ done := make (chan struct {})
231
+ go func () {
232
+ h := upload_droplet .New (& uploader , & poller , lager .NewLogger ("fake-logger" ), & sync.WaitGroup {})
233
+ h .ServeHTTP (rec , req )
234
+ close (done )
235
+ }()
236
+
237
+ time .Sleep (100 * time .Millisecond )
238
+ cancel ()
239
+
240
+ Eventually (done , 2 * time .Second ).Should (BeClosed ())
241
+ Expect (rec .Code ).To (Equal (http .StatusInternalServerError ))
230
242
})
231
243
})
232
244
0 commit comments