github.com/git-lfs/git-lfs@v2.5.2+incompatible/lfsapi/verbose_test.go (about)

     1  package lfsapi
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"io"
     7  	"io/ioutil"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"strings"
    11  	"sync/atomic"
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  type verboseTest struct {
    19  	Test string
    20  }
    21  
    22  func TestVerboseEnabled(t *testing.T) {
    23  	var called uint32
    24  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    25  		atomic.AddUint32(&called, 1)
    26  		t.Logf("srv req %s %s", r.Method, r.URL.Path)
    27  		assert.Equal(t, "POST", r.Method)
    28  
    29  		assert.Equal(t, "Basic ABC", r.Header.Get("Authorization"))
    30  		body := &verboseTest{}
    31  		err := json.NewDecoder(r.Body).Decode(body)
    32  		assert.Nil(t, err)
    33  		assert.Equal(t, "Verbose", body.Test)
    34  		w.Header().Set("Content-Type", "application/json")
    35  		w.Write([]byte(`{"Status":"Ok"}`))
    36  	}))
    37  	defer srv.Close()
    38  
    39  	out := &bytes.Buffer{}
    40  	c, _ := NewClient(nil)
    41  	c.Verbose = true
    42  	c.VerboseOut = out
    43  
    44  	req, err := http.NewRequest("POST", srv.URL, nil)
    45  	req.Header.Set("Authorization", "Basic ABC")
    46  	req.Header.Set("Content-Type", "application/json")
    47  	require.Nil(t, err)
    48  	require.Nil(t, MarshalToRequest(req, verboseTest{"Verbose"}))
    49  
    50  	res, err := c.Do(req)
    51  	require.Nil(t, err)
    52  	io.Copy(ioutil.Discard, res.Body)
    53  	res.Body.Close()
    54  
    55  	assert.Equal(t, 200, res.StatusCode)
    56  	assert.EqualValues(t, 1, called)
    57  
    58  	s := out.String()
    59  	t.Log(s)
    60  
    61  	expected := []string{
    62  		"> Host: 127.0.0.1:",
    63  		"\n> Authorization: Basic * * * * *\n",
    64  		"\n> Content-Type: application/json\n",
    65  		"\n> \n" + `{"Test":"Verbose"}` + "\n\n",
    66  
    67  		"\n< HTTP/1.1 200 OK\n",
    68  		"\n< Content-Type: application/json\n",
    69  		"\n< \n" + `{"Status":"Ok"}`,
    70  	}
    71  
    72  	for _, substr := range expected {
    73  		if !assert.True(t, strings.Contains(s, substr)) {
    74  			t.Logf("missing: %q", substr)
    75  		}
    76  	}
    77  }
    78  
    79  func TestVerboseWithBinaryBody(t *testing.T) {
    80  	var called uint32
    81  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    82  		atomic.AddUint32(&called, 1)
    83  		t.Logf("srv req %s %s", r.Method, r.URL.Path)
    84  		assert.Equal(t, "POST", r.Method)
    85  
    86  		assert.Equal(t, "Basic ABC", r.Header.Get("Authorization"))
    87  		by, err := ioutil.ReadAll(r.Body)
    88  		assert.Nil(t, err)
    89  		assert.Equal(t, "binary-request", string(by))
    90  		w.Header().Set("Content-Type", "application/octet-stream")
    91  		w.Write([]byte(`binary-response`))
    92  	}))
    93  	defer srv.Close()
    94  
    95  	out := &bytes.Buffer{}
    96  	c, _ := NewClient(nil)
    97  	c.Verbose = true
    98  	c.VerboseOut = out
    99  
   100  	buf := bytes.NewBufferString("binary-request")
   101  	req, err := http.NewRequest("POST", srv.URL, buf)
   102  	req.Header.Set("Authorization", "Basic ABC")
   103  	req.Header.Set("Content-Type", "application/octet-stream")
   104  	require.Nil(t, err)
   105  
   106  	res, err := c.Do(req)
   107  	require.Nil(t, err)
   108  	io.Copy(ioutil.Discard, res.Body)
   109  	res.Body.Close()
   110  
   111  	assert.Equal(t, 200, res.StatusCode)
   112  	assert.EqualValues(t, 1, called)
   113  
   114  	s := out.String()
   115  	t.Log(s)
   116  
   117  	expected := []string{
   118  		"> Host: 127.0.0.1:",
   119  		"\n> Authorization: Basic * * * * *\n",
   120  		"\n> Content-Type: application/octet-stream\n",
   121  
   122  		"\n< HTTP/1.1 200 OK\n",
   123  		"\n< Content-Type: application/octet-stream\n",
   124  	}
   125  
   126  	for _, substr := range expected {
   127  		if !assert.True(t, strings.Contains(s, substr)) {
   128  			t.Logf("missing: %q", substr)
   129  		}
   130  	}
   131  
   132  	assert.False(t, strings.Contains(s, "binary"), "contains binary request or response body")
   133  }
   134  
   135  func TestVerboseEnabledWithDebugging(t *testing.T) {
   136  	var called uint32
   137  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   138  		atomic.AddUint32(&called, 1)
   139  		t.Logf("srv req %s %s", r.Method, r.URL.Path)
   140  		assert.Equal(t, "POST", r.Method)
   141  
   142  		assert.Equal(t, "Basic ABC", r.Header.Get("Authorization"))
   143  		body := &verboseTest{}
   144  		err := json.NewDecoder(r.Body).Decode(body)
   145  		assert.Nil(t, err)
   146  		assert.Equal(t, "Verbose", body.Test)
   147  		w.Header().Set("Content-Type", "application/json")
   148  		w.Write([]byte(`{"Status":"Ok"}`))
   149  	}))
   150  	defer srv.Close()
   151  
   152  	out := &bytes.Buffer{}
   153  	c, _ := NewClient(nil)
   154  	c.Verbose = true
   155  	c.VerboseOut = out
   156  	c.DebuggingVerbose = true
   157  
   158  	req, err := http.NewRequest("POST", srv.URL, nil)
   159  	req.Header.Set("Authorization", "Basic ABC")
   160  	req.Header.Set("Content-Type", "application/json")
   161  	require.Nil(t, err)
   162  	require.Nil(t, MarshalToRequest(req, verboseTest{"Verbose"}))
   163  
   164  	res, err := c.Do(req)
   165  	require.Nil(t, err)
   166  	io.Copy(ioutil.Discard, res.Body)
   167  	res.Body.Close()
   168  
   169  	assert.Equal(t, 200, res.StatusCode)
   170  	assert.EqualValues(t, 1, called)
   171  
   172  	s := out.String()
   173  	t.Log(s)
   174  
   175  	expected := []string{
   176  		"> Host: 127.0.0.1:",
   177  		"\n> Authorization: Basic ABC\n",
   178  		"\n> Content-Type: application/json\n",
   179  		"\n> \n" + `{"Test":"Verbose"}` + "\n\n",
   180  
   181  		"\n< HTTP/1.1 200 OK\n",
   182  		"\n< Content-Type: application/json\n",
   183  		"\n< \n" + `{"Status":"Ok"}`,
   184  	}
   185  
   186  	for _, substr := range expected {
   187  		if !assert.True(t, strings.Contains(s, substr)) {
   188  			t.Logf("missing: %q", substr)
   189  		}
   190  	}
   191  }
   192  
   193  func TestVerboseDisabled(t *testing.T) {
   194  	var called uint32
   195  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   196  		atomic.AddUint32(&called, 1)
   197  		t.Logf("srv req %s %s", r.Method, r.URL.Path)
   198  		assert.Equal(t, "POST", r.Method)
   199  
   200  		assert.Equal(t, "Basic ABC", r.Header.Get("Authorization"))
   201  		body := &verboseTest{}
   202  		err := json.NewDecoder(r.Body).Decode(body)
   203  		assert.Nil(t, err)
   204  		assert.Equal(t, "Verbose", body.Test)
   205  		w.Header().Set("Content-Type", "application/json")
   206  		w.Write([]byte(`{"Status":"Ok"}`))
   207  	}))
   208  	defer srv.Close()
   209  
   210  	out := &bytes.Buffer{}
   211  	c, _ := NewClient(nil)
   212  	c.Verbose = false
   213  	c.VerboseOut = out
   214  	c.DebuggingVerbose = true
   215  
   216  	req, err := http.NewRequest("POST", srv.URL, nil)
   217  	req.Header.Set("Authorization", "Basic ABC")
   218  	req.Header.Set("Content-Type", "application/json")
   219  	require.Nil(t, err)
   220  	require.Nil(t, MarshalToRequest(req, verboseTest{"Verbose"}))
   221  
   222  	res, err := c.Do(req)
   223  	require.Nil(t, err)
   224  	io.Copy(ioutil.Discard, res.Body)
   225  	res.Body.Close()
   226  
   227  	assert.Equal(t, 200, res.StatusCode)
   228  	assert.EqualValues(t, 1, called)
   229  	assert.EqualValues(t, 0, out.Len(), out.String())
   230  }