Skip to content

Instantly share code, notes, and snippets.

@tatat
Last active December 20, 2015 11:09
Show Gist options
  • Save tatat/6121314 to your computer and use it in GitHub Desktop.
Save tatat/6121314 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'rack'
require 'net/http'
require 'uri'
def request_test(request_timeout = 3)
unused_port = -> do
s = TCPServer.open(0)
port = s.addr[1]
s.close
port
end.()
read, write = IO.pipe
response = ->(env) { [200, {'Content-Type' => 'text/plain'}, ['ok']] }
instance = Class.new {
define_method(:uri) { URI.parse("http://localhost:#{unused_port}") }
define_method(:request) {|&block| @request = block }
define_method(:request!) { @request.() }
define_method(:response) {|&block| response = block }
}.new
Proc.new.(instance)
pid = fork do
Rack::Handler::WEBrick.run \
->(env) {
Marshal.dump(env.select{|k, v| ('A'..'Z').include?(k[0]) }, write)
write.close
response.(env)
},
Port: unused_port,
Logger: WEBrick::Log.new("/dev/null"),
AccessLog: []
end
sleep 1
instance.request!
timeout(request_timeout) {
Marshal.load(read)
}
ensure
write.close unless write.closed?
read.close unless read.closed?
Process.kill 'TERM', pid if pid
end
p request_test {|test|
test.response {|env|
[200, {'Content-Type' => 'application/json'}, ['Nyan!']]
}
test.request {
puts Net::HTTP.get(test.uri)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment