1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
# encoding: utf-8
# This file is part of ruby-flores.
# Copyright (C) 2015 Jordan Sissel
#
require "flores/rspec"
require "flores/random"
require "socket"
RSpec.configure do |config|
Flores::RSpec.configure(config)
Kernel.srand(config.seed)
# Demonstrate the wonderful Analyze formatter
config.add_formatter("Flores::RSpec::Formatters::Analyze")
end
describe TCPServer do
analyze_results
subject(:socket) { Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) }
let(:sockaddr) { Socket.sockaddr_in(port, "127.0.0.1") }
after do
socket.close unless socket.closed?
end
context "on a random port" do
let(:port) { Flores::Random.integer(-100_000..100_000) }
stress_it "should bind successfully", [:port] do
socket.bind(sockaddr)
expect(socket.local_address.ip_port).to(be == port)
end
end
context "on privileged ports" do
let(:port) { Flores::Random.integer(1..1023) }
stress_it "should raise Errno::EACCESS" do
expect { socket.bind(sockaddr) }.to(raise_error(Errno::EACCES))
end
end
context "on unprivileged ports" do
let(:port) { Flores::Random.integer(1025..65535) }
stress_it "should bind on a port" do
# EADDRINUSE is expected since we are picking ports at random
# Let's ignore this specific exception
allow(socket).to(receive(:bind).and_wrap_original do |original, *args|
begin
original.call(*args)
rescue Errno::EADDRINUSE # rubocop:disable Lint/HandleExceptions
# Ignore
end
end)
expect { socket.bind(sockaddr) }.to_not(raise_error)
end
end
context "on port 0" do
let(:port) { 0 }
stress_it "should bind successfully" do
expect { socket.bind(sockaddr) }.to_not(raise_error)
end
end
end
|