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