github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+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 }