rf-web/vendor/bundle/gems/eventmachine-1.2.7/tests/test_proxy_connection.rb
2019-10-21 10:18:17 +02:00

181 lines
3.9 KiB
Ruby

require 'em_test_helper'
class TestProxyConnection < Test::Unit::TestCase
if EM.respond_to?(:start_proxy)
module ProxyConnection
def initialize(client, request)
@client, @request = client, request
end
def post_init
EM::enable_proxy(self, @client)
end
def connection_completed
EM.next_tick {
send_data @request
}
end
def proxy_target_unbound
$unbound_early = true
EM.stop
end
def unbind
$proxied_bytes = self.get_proxied_bytes
@client.close_connection_after_writing
end
end
module PartialProxyConnection
def initialize(client, request, length)
@client, @request, @length = client, request, length
end
def post_init
EM::enable_proxy(self, @client, 0, @length)
end
def receive_data(data)
$unproxied_data = data
@client.send_data(data)
end
def connection_completed
EM.next_tick {
send_data @request
}
end
def proxy_target_unbound
$unbound_early = true
EM.stop
end
def proxy_completed
$proxy_completed = true
end
def unbind
@client.close_connection_after_writing
end
end
module Client
def connection_completed
send_data "EM rocks!"
end
def receive_data(data)
$client_data = data
end
def unbind
EM.stop
end
end
module Client2
include Client
def unbind; end
end
module Server
def receive_data(data)
send_data "I know!" if data == "EM rocks!"
close_connection_after_writing
end
end
module ProxyServer
def initialize port
@port = port
end
def receive_data(data)
@proxy = EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
end
end
module PartialProxyServer
def initialize port
@port = port
end
def receive_data(data)
EM.connect("127.0.0.1", @port, PartialProxyConnection, self, data, 1)
end
end
module EarlyClosingProxy
def initialize port
@port = port
end
def receive_data(data)
EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
close_connection
end
end
def setup
@port = next_port
@proxy_port = next_port
end
def test_proxy_connection
EM.run {
EM.start_server("127.0.0.1", @port, Server)
EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
EM.connect("127.0.0.1", @proxy_port, Client)
}
assert_equal("I know!", $client_data)
end
def test_proxied_bytes
EM.run {
EM.start_server("127.0.0.1", @port, Server)
EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
EM.connect("127.0.0.1", @proxy_port, Client)
}
assert_equal("I know!", $client_data)
assert_equal("I know!".bytesize, $proxied_bytes)
end
def test_partial_proxy_connection
EM.run {
EM.start_server("127.0.0.1", @port, Server)
EM.start_server("127.0.0.1", @proxy_port, PartialProxyServer, @port)
EM.connect("127.0.0.1", @proxy_port, Client)
}
assert_equal("I know!", $client_data)
assert_equal(" know!", $unproxied_data)
assert($proxy_completed)
end
def test_early_close
$client_data = nil
EM.run {
EM.start_server("127.0.0.1", @port, Server)
EM.start_server("127.0.0.1", @proxy_port, EarlyClosingProxy, @port)
EM.connect("127.0.0.1", @proxy_port, Client2)
}
assert($unbound_early)
end
else
warn "EM.start_proxy not implemented, skipping tests in #{__FILE__}"
# Because some rubies will complain if a TestCase class has no tests
def test_em_start_proxy_not_implemented
assert !EM.respond_to?(:start_proxy)
end
end
end