Sha256: 733bfa312ff9bbb1e19edea98c79df948272176c2cb629c55cdb62f2fb8f862d

Contents?: true

Size: 1.99 KB

Versions: 1

Compression:

Stored size: 1.99 KB

Contents

RSpec.describe Mutant::Actor::Receiver do
  let(:mailbox) { double('Mailbox') }
  let(:mutex)   { double('Mutex')   }
  let(:message) { double('Message') }

  let(:object) { described_class.new(mutex, mailbox) }

  describe '#call' do
    subject { object.call }

    context 'when mailbox contains a message' do
      before do
        expect(mutex).to receive(:lock).ordered
        expect(mailbox).to receive(:empty?).and_return(false).ordered
        expect(mailbox).to receive(:shift).and_return(message).ordered
        expect(mutex).to receive(:unlock).ordered
      end

      it { should be(message) }
    end

    context 'when mailbox initially contains no message' do
      before do
        # 1rst failing try
        expect(mutex).to receive(:lock).ordered
        expect(mailbox).to receive(:empty?).and_return(true).ordered
        expect(mutex).to receive(:unlock).ordered
        expect(Thread).to receive(:stop).ordered
        # 2nd successful try
        expect(mutex).to receive(:lock).ordered
        expect(mailbox).to receive(:empty?).and_return(false).ordered
        expect(mailbox).to receive(:shift).and_return(message).ordered
        expect(mutex).to receive(:unlock).ordered
      end

      it 'waits for message' do
        should be(message)
      end
    end

    context 'when mailbox contains no message but thread gets waken without message arrived' do
      before do
        # 1rst failing try
        expect(mutex).to receive(:lock).ordered
        expect(mailbox).to receive(:empty?).and_return(true).ordered
        expect(mutex).to receive(:unlock).ordered
        expect(Thread).to receive(:stop).ordered
        # 2nd failing try
        expect(mutex).to receive(:lock).ordered
        expect(mailbox).to receive(:empty?).and_return(true).ordered
        expect(mutex).to receive(:unlock).ordered
        expect(Thread).to receive(:stop).ordered
      end

      it 'waits for message' do
        expect { subject }.to raise_error(Mutant::Actor::ProtocolError)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mutant-0.7.1 spec/unit/mutant/actor/receiver_spec.rb