e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksarequire 'spec_helper'
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksadescribe Semaphore do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa # use a different key for each example to be safe
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa before { |example| @key = example.description.parameterize }
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa it 'is not locked before another thread uses the key' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa expect(Semaphore.locked?(@key)).to be(false)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa it 'is locked while another thread uses the key' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa skip 'This hangs the test suite because of celluloid.'
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa semaphore_locked = false
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa process_lock = ForkBreak::Process.new do |breakpoints|
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa Semaphore.exclusively(@key, expiration: 1) do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa breakpoints << :after_locking
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa process_check = ForkBreak::Process.new do |_breakpoints|
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa semaphore_locked = Semaphore.locked?(@key, expiration: 1)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa process_lock.run_until(:after_locking).wait
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa process_check.finish.wait
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa process_lock.finish.wait
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa expect(semaphore_locked).to be(true)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa it 'is not locked after another thread uses the key' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa Semaphore.exclusively(@key) { nil }
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa expect(Semaphore.locked?(@key)).to be(false)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa context 'instance' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa let(:sema) { Semaphore.new(@key) }
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa context 'using lock' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa after { sema.unlock }
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa it 'is locked after using lock' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa sema.lock
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa expect(sema.locked?).to be(true)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa it 'is not locked after using lock and unlock' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa sema.lock
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa sema.unlock
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa expect(sema.locked?).to be(false)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa it 'returns the block result on "exclusively"' do
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa expect(Semaphore.exclusively(@key) { :result }).to eq(:result)
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksa end
e8ec59dda8f903e81cb5cceaef93d20a0812fc77Eugen Kuksaend