+}
+
+func TestLockResourceSuccessfully(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil)
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{})
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ m.AssertExpectations(t)
+}
+
+func TestLockResourceFailure(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, errors.New("Some error"))
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{})
+ assert.NotNil(t, err)
+ assert.Nil(t, lock)
+ m.AssertExpectations(t)
+}
+
+func TestLockResourceTrySeveralTimesSuccessfully(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(false, nil).Once()
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 2,
+ })
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ m.AssertExpectations(t)
+}
+
+func TestLockResourceTrySeveralTimesFailure(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(false, nil).Once()
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, errors.New("Some error")).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 2,
+ })
+ assert.NotNil(t, err)
+ assert.Nil(t, lock)
+ m.AssertExpectations(t)
+}
+
+func TestLockResourceTrySeveralTimesUnableToGetResource(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(false, nil).Once()
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(false, nil).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 1,
+ })
+ assert.NotNil(t, err)
+ assert.EqualError(t, err, "Lock not obtained")
+ assert.Nil(t, lock)
+ m.AssertExpectations(t)
+}
+
+func TestReleaseResourceSuccessfully(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil).Once()
+ m.On("DelIE", resourceExpected, mock.Anything).Return(true, nil).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 1,
+ })
+ err2 := lock.ReleaseResource()
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ assert.Nil(t, err2)
+ m.AssertExpectations(t)
+}
+
+func TestReleaseResourceFailure(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil).Once()
+ m.On("DelIE", resourceExpected, mock.Anything).Return(true, errors.New("Some error")).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 1,
+ })
+ err2 := lock.ReleaseResource()
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ assert.NotNil(t, err2)
+ m.AssertExpectations(t)
+}
+
+func TestReleaseResourceLockNotHeld(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil).Once()
+ m.On("DelIE", resourceExpected, mock.Anything).Return(false, nil).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 1,
+ })
+ err2 := lock.ReleaseResource()
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ assert.NotNil(t, err2)
+ assert.EqualError(t, err2, "Lock not held")
+ m.AssertExpectations(t)
+}
+
+func TestRefreshResourceSuccessfully(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil).Once()
+ m.On("PExpireIE", resourceExpected, mock.Anything, time.Duration(1)).Return(nil).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 1,
+ })
+ err2 := lock.RefreshResource(time.Duration(1))
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ assert.Nil(t, err2)
+ m.AssertExpectations(t)
+}
+
+func TestRefreshResourceFailure(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("SetNX", resourceExpected, mock.Anything, time.Duration(1)).Return(true, nil).Once()
+ m.On("PExpireIE", resourceExpected, mock.Anything, time.Duration(1)).Return(errors.New("Some error")).Once()
+
+ lock, err := i.LockResource("resource", time.Duration(1), &sdlgo.Options{
+ RetryCount: 1,
+ })
+ err2 := lock.RefreshResource(time.Duration(1))
+ assert.Nil(t, err)
+ assert.NotNil(t, lock)
+ assert.NotNil(t, err2)
+ m.AssertExpectations(t)
+}
+
+func TestCheckResourceSuccessfully(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("PTTL", resourceExpected).Return(time.Duration(1), nil)
+ result, err := i.CheckResource("resource")
+ assert.Nil(t, err)
+ assert.Equal(t, result, time.Duration(1))
+ m.AssertExpectations(t)
+}
+
+func TestCheckResourceFailure(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("PTTL", resourceExpected).Return(time.Duration(1), errors.New("Some error"))
+ result, err := i.CheckResource("resource")
+ assert.NotNil(t, err)
+ assert.EqualError(t, err, "Some error")
+ assert.Equal(t, result, time.Duration(0))
+ m.AssertExpectations(t)
+}
+
+func TestCheckResourceInvalidResource(t *testing.T) {
+ m, i := setup()
+
+ resourceExpected := "{namespace},resource"
+ m.On("PTTL", resourceExpected).Return(time.Duration(-1), nil)
+ result, err := i.CheckResource("resource")
+ assert.NotNil(t, err)
+ assert.EqualError(t, err, "invalid resource given, no expiration time attached")
+ assert.Equal(t, result, time.Duration(0))
+ m.AssertExpectations(t)
+}