File: //usr/local/rvm/gems/ruby-3.0.2/gems/nio4r-2.5.8/spec/support/selectable_examples.rb
# frozen_string_literal: true
RSpec.shared_context NIO::Selector do
let(:selector) {@selector = NIO::Selector.new}
after(:each) do
if defined?(@selector)
@selector.close
end
end
end
RSpec.shared_context "an NIO selectable" do
include_context NIO::Selector
it "selects readable objects" do
monitor = selector.register(readable_subject, :r)
ready = selector.select(1)
expect(ready).to be_an Enumerable
expect(ready).to include monitor
end
it "does not select unreadable objects" do
selector.register(unreadable_subject, :r)
expect(selector.select(0)).to be_nil
end
it "selects writable objects" do
monitor = selector.register(writable_subject, :w)
ready = selector.select(1)
expect(ready).to be_an Enumerable
expect(ready).to include monitor
end
it "does not select unwritable objects" do
selector.register(unwritable_subject, :w)
ready = selector.select(0)
expect(ready).to be_nil
end
end
RSpec.shared_context "an NIO selectable stream" do |is_tls13|
include_context NIO::Selector
let(:stream) { pair.first }
let(:peer) { pair.last }
it "selects readable when the other end closes" do
monitor = selector.register(stream, :r)
unless is_tls13
expect(selector.select(1)).to be_nil
end
peer.close
# Wait and give the TCP session time to close
expect(selector.select(0.1)).to include monitor
end
end
RSpec.shared_context "an NIO bidirectional stream" do
include_context NIO::Selector
let(:stream) {pair.first}
let(:peer) {pair.last}
it "selects readable and writable" do
selector.register(readable_subject, :rw)
selector.select(1) do |monitor|
expect(monitor.readiness).to eq(:rw)
end
readable_subject.close
end
it "keeps readiness after the selectable has been closed" do
selector.register(readable_subject, :rw)
selector.select(1) do |monitor|
expect(monitor.readiness).to eq(:rw)
readable_subject.close
expect(monitor.readiness).to eq(:rw)
end
end
end