github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/lfsapi/retries_test.go (about) 1 package lfsapi 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "net/http/httptest" 7 "sync/atomic" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestWithRetries(t *testing.T) { 15 req, _ := http.NewRequest("GET", "/", nil) 16 req = WithRetries(req, 1) 17 18 n, ok := Retries(req) 19 assert.True(t, ok) 20 assert.Equal(t, 1, n) 21 } 22 23 func TestRetriesOnUnannotatedRequest(t *testing.T) { 24 req, _ := http.NewRequest("GET", "/", nil) 25 26 n, ok := Retries(req) 27 assert.False(t, ok) 28 assert.Equal(t, 0, n) 29 } 30 31 func TestRequestWithRetries(t *testing.T) { 32 type T struct { 33 S string `json:"s"` 34 } 35 36 var hasRaw bool = true 37 var requests uint32 38 var berr error 39 40 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 41 var payload T 42 if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { 43 berr = err 44 } 45 46 assert.Equal(t, "Hello, world!", payload.S) 47 48 if atomic.AddUint32(&requests, 1) < 3 { 49 raw, ok := w.(http.Hijacker) 50 if !ok { 51 hasRaw = false 52 return 53 } 54 55 conn, _, err := raw.Hijack() 56 require.NoError(t, err) 57 require.NoError(t, conn.Close()) 58 return 59 } 60 })) 61 defer srv.Close() 62 63 c, err := NewClient(nil) 64 require.NoError(t, err) 65 66 req, err := http.NewRequest("POST", srv.URL, nil) 67 require.NoError(t, err) 68 require.NoError(t, MarshalToRequest(req, &T{"Hello, world!"})) 69 70 if !hasRaw { 71 // Skip tests where the implementation of 72 // net/http/httptest.Server does not provide raw access to the 73 // connection. 74 // 75 // Defer the skip outside of the server, since t.Skip halts the 76 // running goroutine. 77 t.Skip("lfsapi: net/http/httptest.Server does not provide raw access") 78 } 79 80 res, err := c.Do(WithRetries(req, 8)) 81 assert.NoError(t, berr) 82 assert.NoError(t, err) 83 require.NotNil(t, res, "lfsapi: expected response") 84 85 assert.Equal(t, http.StatusOK, res.StatusCode) 86 }