@Test public void enqueueingSameRequestIdTwiceThrowsAndDoesNotAffectState() { lockSynchronously(REQUEST_1); AsyncResult<Void> request2 = lockAsync(REQUEST_2); assertThatThrownBy(() -> lockAsync(REQUEST_2)).isInstanceOf(IllegalStateException.class); // request 2 should still get the lock when available unlock(REQUEST_1); assertThat(request2.isCompletedSuccessfully()).isTrue(); }
@Test public void lockIsExclusive() { lockSynchronously(REQUEST_1); AsyncResult<Void> result = lockAsync(REQUEST_2); assertThat(result.isComplete()).isFalse(); }
@Test public void multipleQueuedRequestsCanObtainLock() { lockSynchronously(REQUEST_1); AsyncResult<Void> result2 = lockAsync(REQUEST_2); AsyncResult<Void> result3 = lockAsync(REQUEST_3); unlock(REQUEST_1); assertThat(result2.isCompletedSuccessfully()).isTrue(); assertThat(result3.isComplete()).isFalse(); unlock(REQUEST_2); assertThat(result3.isCompletedSuccessfully()).isTrue(); }
@Test public void unlockByWaiterNoOps() { lockSynchronously(REQUEST_1); AsyncResult<Void> request2 = lockAsync(REQUEST_2); unlock(REQUEST_2); assertThat(lock.getCurrentHolder()).isEqualTo(REQUEST_1); assertThat(request2.isComplete()).isFalse(); // request2 should still get the lock when it's available unlock(REQUEST_1); assertThat(request2.isCompletedSuccessfully()).isTrue(); }
@Test public void resultIsTimedOutWhenTimeOutIsCalled() { lockSynchronously(REQUEST_1); AsyncResult<Void> request2 = lockAsync(REQUEST_2); lock.timeout(REQUEST_2); assertThat(request2.isTimedOut()).isTrue(); }
@Test public void queuedRequestObtainsLockAfterBeingUnlocked() { lockSynchronously(REQUEST_1); AsyncResult<Void> result = lockAsync(REQUEST_2); unlock(REQUEST_1); assertThat(result.isCompletedSuccessfully()).isTrue(); }
@Test public void waitUntilAvailableDoesNotBlockLockRequests() { lockSynchronously(REQUEST_1); waitUntilAvailableAsync(REQUEST_2); AsyncResult<Void> lockRequest = lockAsync(REQUEST_3); assertThat(lockRequest.isComplete()).isFalse(); unlock(REQUEST_1); assertThat(lockRequest.isCompletedSuccessfully()).isTrue(); }
@Test public void timeoutDoesNothingIfLockIsAlreadyAcquired() { lockSynchronously(REQUEST_1); lock.timeout(REQUEST_1); // lock should still be locked, and able to be unlocked AsyncResult<Void> request2 = lockAsync(REQUEST_2); assertThat(request2.isComplete()).isFalse(); unlock(REQUEST_1); assertThat(request2.isCompletedSuccessfully()).isTrue(); }
@Test public void timedOutLockRequestDoesNotGetTheLock() { lockSynchronously(REQUEST_1); AsyncResult<Void> request2 = lockAsync(REQUEST_2); lock.timeout(REQUEST_2); unlock(REQUEST_1); assertThat(lock.getCurrentHolder()).isNull(); lockSynchronously(REQUEST_1); }