From d367d4c5645c946505d39c57b4f619a5c3123a10 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 22 Oct 2011 02:47:43 +0000 Subject: [PATCH] test_backend: remove TempServer usage This needs to be less implementation detail-oriented --- test/test_backend.rb | 111 +++++++++++++++++++-------------------------------- 1 file changed, 40 insertions(+), 71 deletions(-) diff --git a/test/test_backend.rb b/test/test_backend.rb index c565510..8fa0180 100644 --- a/test/test_backend.rb +++ b/test/test_backend.rb @@ -36,22 +36,18 @@ class TestBackend < Test::Unit::TestCase end def test_do_request - received = Tempfile.new('received') - tmp = TempServer.new(Proc.new do |serv, port| - client, client_addr = serv.accept - client.sync = true - received.syswrite(client.recv(4096)) - client.send "OK 1 you=win\r\n", 0 - end) - - @backend.hosts = [ "127.0.0.1:#{tmp.port}" ] - + srv = TCPServer.new("127.0.0.1", 0) + port = srv.addr[1] + accepted = Thread.new do + client = srv.accept + client.write("OK 1 you=win\r\n") + client + end + @backend.hosts = [ "127.0.0.1:#{port}" ] assert_equal({'you' => 'win'}, @backend.do_request('go!', { 'fight' => 'team fight!' })) - received.sysseek(0) - assert_equal "go! fight=team+fight%21\r\n", received.sysread(4096) - ensure - TempServer.destroy_all! + accepted = accepted.value + assert_equal "go! fight=team+fight%21\r\n", accepted.readpartial(4096) end def test_do_request_send_error @@ -141,19 +137,18 @@ class TestBackend < Test::Unit::TestCase end def test_readable_eh_not_readable - tmp = TempServer.new(Proc.new { |serv,port| serv.accept; sleep }) - @backend = MogileFS::Backend.new(:hosts => [ "127.0.0.1:#{tmp.port}" ], + srv = TCPServer.new("127.0.0.1", 0) + port = srv.addr[1] + @backend = MogileFS::Backend.new(:hosts => [ "127.0.0.1:#{port}" ], :timeout => 0.5) begin @backend.do_request 'foo', {} rescue MogileFS::UnreadableSocketError => e - assert_equal "127.0.0.1:#{tmp.port} never became readable", e.message + assert_equal "127.0.0.1:#{port} never became readable", e.message rescue Exception => err flunk "MogileFS::UnreadableSocketError not raised #{err} #{err.backtrace}" else flunk "MogileFS::UnreadableSocketError not raised" - ensure - TempServer.destroy_all! end end @@ -163,67 +158,41 @@ class TestBackend < Test::Unit::TestCase assert_equal(['localhost:1'], @backend.dead.keys) end - def test_socket_robust - bad_accept = Tempfile.new('bad_accept') - accept = Tempfile.new('accept') - bad = Proc.new do |serv,port| - client, client_addr = serv.accept - bad_accept.syswrite('!') - end - good = Proc.new do |serv,port| - client, client_addr = serv.accept - accept.syswrite('.') - client.syswrite('.') - client.close - sleep - end - nr = 10 - - nr.times do - begin - t1 = TempServer.new(bad, ENV['TEST_DEAD_PORT']) - t2 = TempServer.new(good) - hosts = ["127.0.0.1:#{t1.port}", "127.0.0.1:#{t2.port}"] - @backend = MogileFS::Backend.new(:hosts => hosts.dup) - assert_equal({}, @backend.dead) - old_chld_handler = trap('CHLD', 'DEFAULT') - t1.destroy! - Process.waitpid(t1.pid) - trap('CHLD', old_chld_handler) - sock = @backend.socket - assert_equal Socket, sock.class - port = Socket.unpack_sockaddr_in(sock.getpeername).first - # p [ 'ports', "port=#{port}", "t1=#{t1.port}", "t2=#{t2.port}" ] - assert_equal t2.port, port - IO.select([sock]) - assert_equal '.', sock.sysread(1) - ensure - TempServer.destroy_all! + def test_socket_robust_on_dead_server + 10.times do + t1 = TCPServer.new("127.0.0.1", 0) + t2 = TCPServer.new("127.0.0.1", 0) + hosts = ["127.0.0.1:#{t1.addr[1]}", "127.0.0.1:#{t2.addr[1]}"] + @backend = MogileFS::Backend.new(:hosts => hosts.dup) + assert_equal({}, @backend.dead) + t1.close + thr = Thread.new do + client = t2.accept + client.write("OK 1 foo=bar\n") + client + end + rv = nil + assert_nothing_raised do + rv = @backend.do_request('test', { "all" => "ALL" }) end - end # nr.times - assert_equal 0, bad_accept.stat.size - assert_equal nr, accept.stat.size + accepted = thr.value + assert_equal "test all=ALL\r\n", accepted.readpartial(666) + assert_equal({"foo"=>"bar"}, rv) + end end def test_shutdown - accept_nr = 0 - tmp = TempServer.new(Proc.new do |serv,port| - client, client_addr = serv.accept - accept_nr += 1 - r = IO.select([client], [client]) - client.syswrite(accept_nr.to_s) - sleep - end) - @backend = MogileFS::Backend.new :hosts => [ "127.0.0.1:#{tmp.port}" ] + srv = TCPServer.new('127.0.0.1', 0) + port = srv.addr[1] + @backend = MogileFS::Backend.new :hosts => [ "127.0.0.1:#{port}" ] assert @backend.socket assert ! @backend.socket.closed? - IO.select([@backend.socket]) - resp = @backend.socket.sysread(4096) + client = srv.accept + client.write '1' + resp = @backend.socket.read(1) @backend.shutdown assert_equal nil, @backend.instance_variable_get(:@socket) assert_equal 1, resp.to_i - ensure - TempServer.destroy_all! end def test_url_decode -- 2.11.4.GIT