func TestCancelAfterRequest(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) resp, err := doRequest(ctx) // Cancel before reading the body. // Request.Body should still be readable after the context is canceled. cancel() b, err := ioutil.ReadAll(resp.Body) if err != nil || string(b) != requestBody { t.Fatalf("could not read body: %q %v", b, err) } }
func TestCancel(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) go func() { time.Sleep(requestDuration / 2) cancel() }() resp, err := doRequest(ctx) if resp != nil || err == nil { t.Fatalf("expected error, didn't get one. resp: %v", resp) } if err != ctx.Err() { t.Fatalf("expected error from context but got: %v", err) } }
func TestCancelUpload(t *testing.T) { f, err := os.Open("googleapi.go") if err != nil { t.Fatalf("unable to open googleapi.go: %v", err) } defer f.Close() st, err := f.Stat() if err != nil { t.Fatalf("unable to stat googleapi.go: %v", err) } tr := &interruptedTransport{ statusCode: 308, buf: make([]byte, 0, st.Size()), } oldChunkSize := chunkSize defer func() { chunkSize = oldChunkSize }() chunkSize = 100 // override to process small chunks for test. sleep = func(time.Duration) {} // override time.Sleep rx := &ResumableUpload{ Client: &http.Client{Transport: tr}, Media: f, MediaType: "text/plain", ContentLength: st.Size(), Callback: tr.ProgressUpdate, } ctx, cancelFunc := context.WithCancel(context.Background()) cancelFunc() // stop the upload that hasn't started yet res, err := rx.Upload(ctx) if err == nil || res == nil || res.StatusCode != http.StatusRequestTimeout { if res == nil { t.Errorf("transferChunks not successful, got res=nil, err=%v, want StatusRequestTimeout", err) } else { t.Errorf("transferChunks not successful, got statusCode=%v, err=%v, want StatusRequestTimeout", res.StatusCode, err) } } }