@Test public void propagatesExceptionIfSynchronousLockAcquisitionFails() { AsyncResult<Void> lockResult = new AsyncResult<>(); RuntimeException error = new RuntimeException("foo"); lockResult.fail(error); doReturn(lockResult).when(lockA).lock(any()); AsyncResult<HeldLocks> acquisitions = acquire(lockA); assertThat(acquisitions.getError()).isEqualTo(error); }
@Test public void unlocksOnAsyncFailure() { AsyncResult<Void> lockResult = new AsyncResult<>(); lockResult.fail(new RuntimeException("foo")); doReturn(lockResult).when(lockC).lock(any()); AsyncResult<HeldLocks> acquisitions = acquire(lockA, lockB, lockC); assertThat(acquisitions.isFailed()).isTrue(); assertNotLocked(lockA); assertNotLocked(lockB); }
private LockToken mockFailedRequest() { LockToken request = LockToken.of(UUID.randomUUID()); AsyncResult failedLocks = new AsyncResult(); failedLocks.fail(new RuntimeException()); heldLocksCollection.getExistingOrAcquire(request.getRequestId(), () -> failedLocks); return request; }
@Test public void propagatesExceptionIfAsyncLockAcquisitionFails() { AsyncResult<Void> lockResult = new AsyncResult<>(); RuntimeException error = new RuntimeException("foo"); lockResult.fail(error); doReturn(lockResult).when(lockB).lock(any()); lockA.lock(OTHER_REQUEST_ID); AsyncResult<HeldLocks> acquisitions = acquire(lockA, lockB); lockA.unlock(OTHER_REQUEST_ID); assertThat(acquisitions.getError()).isEqualTo(error); }
@Test public void removesRequestWhenFailedOrTimesOut() { AsyncResult<Void> result1 = new AsyncResult<>(); AsyncResult<Void> result2 = new AsyncResult<>(); awaitedLocks.getExistingOrAwait(REQUEST_1, () -> result1); awaitedLocks.getExistingOrAwait(REQUEST_1, () -> result2); result1.fail(new RuntimeException("test")); result2.timeout(); assertRequestsWereRemoved(REQUEST_1, REQUEST_2); }