about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-10-22 02:47:43 +0000
committerEric Wong <normalperson@yhbt.net>2011-10-22 02:47:43 +0000
commitd367d4c5645c946505d39c57b4f619a5c3123a10 (patch)
treeb18846010d0e75c2e24b81bd90b38a18796bd042
parentc35ea4f30221e18fa5d504a444a40f611e21c291 (diff)
downloadmogilefs-client-d367d4c5645c946505d39c57b4f619a5c3123a10.tar.gz
This needs to be less implementation detail-oriented
-rw-r--r--test/test_backend.rb111
1 files 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