github.com/git-lfs/git-lfs@v2.5.2+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  }