github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/lfsapi/creds_test.go (about) 1 package lfsapi 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 type testCredHelper struct { 11 fillErr error 12 approveErr error 13 rejectErr error 14 fill []Creds 15 approve []Creds 16 reject []Creds 17 } 18 19 func newTestCredHelper() *testCredHelper { 20 return &testCredHelper{ 21 fill: make([]Creds, 0), 22 approve: make([]Creds, 0), 23 reject: make([]Creds, 0), 24 } 25 } 26 27 func (h *testCredHelper) Fill(input Creds) (Creds, error) { 28 h.fill = append(h.fill, input) 29 return input, h.fillErr 30 } 31 32 func (h *testCredHelper) Approve(creds Creds) error { 33 h.approve = append(h.approve, creds) 34 return h.approveErr 35 } 36 37 func (h *testCredHelper) Reject(creds Creds) error { 38 h.reject = append(h.reject, creds) 39 return h.rejectErr 40 } 41 42 func TestCredHelperSetNoErrors(t *testing.T) { 43 cache := newCredentialCacher() 44 helper1 := newTestCredHelper() 45 helper2 := newTestCredHelper() 46 helpers := NewCredentialHelpers([]CredentialHelper{cache, helper1, helper2}) 47 creds := Creds{"protocol": "https", "host": "example.com"} 48 49 out, err := helpers.Fill(creds) 50 assert.Nil(t, err) 51 assert.Equal(t, creds, out) 52 assert.Equal(t, 1, len(helper1.fill)) 53 assert.Equal(t, 0, len(helper2.fill)) 54 55 // calling Fill() with empty cache 56 out, err = helpers.Fill(creds) 57 assert.Nil(t, err) 58 assert.Equal(t, creds, out) 59 assert.Equal(t, 2, len(helper1.fill)) 60 assert.Equal(t, 0, len(helper2.fill)) 61 62 credsWithPass := Creds{"protocol": "https", "host": "example.com", "username": "foo", "password": "bar"} 63 assert.Nil(t, helpers.Approve(credsWithPass)) 64 assert.Equal(t, 1, len(helper1.approve)) 65 assert.Equal(t, 0, len(helper2.approve)) 66 67 // calling Approve() again is cached 68 assert.Nil(t, helpers.Approve(credsWithPass)) 69 assert.Equal(t, 1, len(helper1.approve)) 70 assert.Equal(t, 0, len(helper2.approve)) 71 72 // access cache 73 for i := 0; i < 3; i++ { 74 out, err = helpers.Fill(creds) 75 assert.Nil(t, err) 76 assert.Equal(t, credsWithPass, out) 77 assert.Equal(t, 2, len(helper1.fill)) 78 assert.Equal(t, 0, len(helper2.fill)) 79 } 80 81 assert.Nil(t, helpers.Reject(creds)) 82 assert.Equal(t, 1, len(helper1.reject)) 83 assert.Equal(t, 0, len(helper2.reject)) 84 85 // Reject() is never cached 86 assert.Nil(t, helpers.Reject(creds)) 87 assert.Equal(t, 2, len(helper1.reject)) 88 assert.Equal(t, 0, len(helper2.reject)) 89 90 // calling Fill() with empty cache 91 out, err = helpers.Fill(creds) 92 assert.Nil(t, err) 93 assert.Equal(t, creds, out) 94 assert.Equal(t, 3, len(helper1.fill)) 95 assert.Equal(t, 0, len(helper2.fill)) 96 } 97 98 func TestCredHelperSetFillError(t *testing.T) { 99 cache := newCredentialCacher() 100 helper1 := newTestCredHelper() 101 helper2 := newTestCredHelper() 102 helpers := NewCredentialHelpers([]CredentialHelper{cache, helper1, helper2}) 103 creds := Creds{"protocol": "https", "host": "example.com"} 104 105 helper1.fillErr = errors.New("boom") 106 out, err := helpers.Fill(creds) 107 assert.Nil(t, err) 108 assert.Equal(t, creds, out) 109 assert.Equal(t, 1, len(helper1.fill)) 110 assert.Equal(t, 1, len(helper2.fill)) 111 112 assert.Nil(t, helpers.Approve(creds)) 113 assert.Equal(t, 0, len(helper1.approve)) 114 assert.Equal(t, 1, len(helper2.approve)) 115 116 // Fill() with cache 117 for i := 0; i < 3; i++ { 118 out, err = helpers.Fill(creds) 119 assert.Nil(t, err) 120 assert.Equal(t, creds, out) 121 assert.Equal(t, 1, len(helper1.fill)) 122 assert.Equal(t, 1, len(helper2.fill)) 123 } 124 125 assert.Nil(t, helpers.Reject(creds)) 126 assert.Equal(t, 0, len(helper1.reject)) 127 assert.Equal(t, 1, len(helper2.reject)) 128 129 // Fill() with empty cache 130 out, err = helpers.Fill(creds) 131 assert.Nil(t, err) 132 assert.Equal(t, creds, out) 133 assert.Equal(t, 1, len(helper1.fill)) // still skipped 134 assert.Equal(t, 2, len(helper2.fill)) 135 } 136 137 func TestCredHelperSetApproveError(t *testing.T) { 138 cache := newCredentialCacher() 139 helper1 := newTestCredHelper() 140 helper2 := newTestCredHelper() 141 helpers := NewCredentialHelpers([]CredentialHelper{cache, helper1, helper2}) 142 creds := Creds{"protocol": "https", "host": "example.com"} 143 144 approveErr := errors.New("boom") 145 helper1.approveErr = approveErr 146 out, err := helpers.Fill(creds) 147 assert.Nil(t, err) 148 assert.Equal(t, creds, out) 149 assert.Equal(t, 1, len(helper1.fill)) 150 assert.Equal(t, 0, len(helper2.fill)) 151 152 assert.Equal(t, approveErr, helpers.Approve(creds)) 153 assert.Equal(t, 1, len(helper1.approve)) 154 assert.Equal(t, 0, len(helper2.approve)) 155 156 // cache is never set 157 out, err = helpers.Fill(creds) 158 assert.Nil(t, err) 159 assert.Equal(t, creds, out) 160 assert.Equal(t, 2, len(helper1.fill)) 161 assert.Equal(t, 0, len(helper2.fill)) 162 163 assert.Nil(t, helpers.Reject(creds)) 164 assert.Equal(t, 1, len(helper1.reject)) 165 assert.Equal(t, 0, len(helper2.reject)) 166 } 167 168 func TestCredHelperSetFillAndApproveError(t *testing.T) { 169 cache := newCredentialCacher() 170 helper1 := newTestCredHelper() 171 helper2 := newTestCredHelper() 172 helpers := NewCredentialHelpers([]CredentialHelper{cache, helper1, helper2}) 173 creds := Creds{"protocol": "https", "host": "example.com"} 174 175 credErr := errors.New("boom") 176 helper1.fillErr = credErr 177 helper2.approveErr = credErr 178 179 out, err := helpers.Fill(creds) 180 assert.Nil(t, err) 181 assert.Equal(t, creds, out) 182 assert.Equal(t, 1, len(helper1.fill)) 183 assert.Equal(t, 1, len(helper2.fill)) 184 185 assert.Equal(t, credErr, helpers.Approve(creds)) 186 assert.Equal(t, 0, len(helper1.approve)) // skipped 187 assert.Equal(t, 0, len(helper1.reject)) // skipped 188 assert.Equal(t, 1, len(helper2.approve)) 189 190 // never approved, so cache is empty 191 out, err = helpers.Fill(creds) 192 assert.Nil(t, err) 193 assert.Equal(t, creds, out) 194 assert.Equal(t, 1, len(helper1.fill)) // still skipped 195 assert.Equal(t, 2, len(helper2.fill)) 196 } 197 198 func TestCredHelperSetRejectError(t *testing.T) { 199 cache := newCredentialCacher() 200 helper1 := newTestCredHelper() 201 helper2 := newTestCredHelper() 202 helpers := NewCredentialHelpers([]CredentialHelper{cache, helper1, helper2}) 203 creds := Creds{"protocol": "https", "host": "example.com"} 204 205 rejectErr := errors.New("boom") 206 helper1.rejectErr = rejectErr 207 out, err := helpers.Fill(creds) 208 assert.Nil(t, err) 209 assert.Equal(t, creds, out) 210 assert.Equal(t, 1, len(helper1.fill)) 211 assert.Equal(t, 0, len(helper2.fill)) 212 213 assert.Nil(t, helpers.Approve(creds)) 214 assert.Equal(t, 1, len(helper1.approve)) 215 assert.Equal(t, 0, len(helper2.approve)) 216 217 // Fill() with cache 218 out, err = helpers.Fill(creds) 219 assert.Nil(t, err) 220 assert.Equal(t, creds, out) 221 assert.Equal(t, 1, len(helper1.fill)) 222 assert.Equal(t, 0, len(helper2.fill)) 223 224 assert.Equal(t, rejectErr, helpers.Reject(creds)) 225 assert.Equal(t, 1, len(helper1.reject)) 226 assert.Equal(t, 0, len(helper2.reject)) 227 228 // failed Reject() still clears cache 229 out, err = helpers.Fill(creds) 230 assert.Nil(t, err) 231 assert.Equal(t, creds, out) 232 assert.Equal(t, 2, len(helper1.fill)) 233 assert.Equal(t, 0, len(helper2.fill)) 234 } 235 236 func TestCredHelperSetAllFillErrors(t *testing.T) { 237 cache := newCredentialCacher() 238 helper1 := newTestCredHelper() 239 helper2 := newTestCredHelper() 240 helpers := NewCredentialHelpers([]CredentialHelper{cache, helper1, helper2}) 241 creds := Creds{"protocol": "https", "host": "example.com"} 242 243 helper1.fillErr = errors.New("boom 1") 244 helper2.fillErr = errors.New("boom 2") 245 out, err := helpers.Fill(creds) 246 if assert.NotNil(t, err) { 247 assert.Equal(t, "credential fill errors:\nboom 1\nboom 2", err.Error()) 248 } 249 assert.Nil(t, out) 250 assert.Equal(t, 1, len(helper1.fill)) 251 assert.Equal(t, 1, len(helper2.fill)) 252 253 err = helpers.Approve(creds) 254 if assert.NotNil(t, err) { 255 assert.Equal(t, "no valid credential helpers to approve", err.Error()) 256 } 257 assert.Equal(t, 0, len(helper1.approve)) 258 assert.Equal(t, 0, len(helper2.approve)) 259 260 err = helpers.Reject(creds) 261 if assert.NotNil(t, err) { 262 assert.Equal(t, "no valid credential helpers to reject", err.Error()) 263 } 264 assert.Equal(t, 0, len(helper1.reject)) 265 assert.Equal(t, 0, len(helper2.reject)) 266 }