PASS Lock request with ifAvailable - lock available PASS Lock request with ifAvailable - lock not available PASS Lock request with ifAvailable - lock not available, callback throws PASS Lock request with ifAvailable - unrelated lock held PASS Shared lock request with ifAvailable - shared lock held PASS Exclusive lock request with ifAvailable - shared lock held PASS Shared lock request with ifAvailable - exclusive lock held PASS Returned Promise rejects if callback throws synchronously PASS Returned Promise rejects if async callback yields rejected promise PASS Locks are available once previous release is processed