about summary refs log tree commit homepage
path: root/test/setup.rb
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-12-22 17:37:02 -0800
committerEric Wong <normalperson@yhbt.net>2008-12-22 18:24:42 -0800
commitb7ba273a043633c01d9ae8cda8ae9db4cc5dcf07 (patch)
treed70359793d59061597655f21cc39ac9d54abe076 /test/setup.rb
parentdf2af32f01bc995e9f311b51d3351ee042e23483 (diff)
downloadmogilefs-client-b7ba273a043633c01d9ae8cda8ae9db4cc5dcf07.tar.gz
These tests forced us to use TCPSocket, which wasn't friendly to
sockets created with Socket.new (for asynchronous connect(2)
calls).

No changes to the core MogileFS components have been
made.  I want to verify the new TempServer implementation
performs correctly with the current code.
Diffstat (limited to 'test/setup.rb')
-rw-r--r--test/setup.rb111
1 files changed, 25 insertions, 86 deletions
diff --git a/test/setup.rb b/test/setup.rb
index b0dc53f..d8d213d 100644
--- a/test/setup.rb
+++ b/test/setup.rb
@@ -1,3 +1,4 @@
+STDIN.sync = STDOUT.sync = STDERR.sync = true
 require 'test/unit'
 
 require 'fileutils'
@@ -48,95 +49,36 @@ class FakeBackend
 
 end
 
-class FakeSocket
-
-  attr_reader :read_s
-  attr_reader :write_s
-  attr_reader :sync
-
-  def initialize(read = '', write = StringIO.new)
-    @read_s = read.class.method_defined?(:sysread) ? read : StringIO.new(read)
-    @write_s = write
-    @closed = false
-    @sync = false
-  end
-
-  def sync=(do_sync)
-    @sync = do_sync
-    @write_s.sync = do_sync
-    @read_s.sync = do_sync
-  end
-
-  def closed?
-    @closed
-  end
-
-  def close
-    @closed = true
-    return nil
-  end
-
-  def gets
-    @read_s.gets
-  end
-
-  def peeraddr
-    ['AF_INET', 6001, 'localhost', '127.0.0.1']
-  end
-
-  def read(bytes = nil)
-    @read_s.read bytes
-  end
-
-  def sysread(bytes, buf = '')
-    @read_s.sysread bytes, buf
-  end
-
-  def recv_nonblock(bytes, flags = 0)
-    ret = @read_s.sysread(bytes)
-    # Ruby doesn't expose pread(2)
-    if (flags & Socket::MSG_PEEK) != 0
-      if @read_s.respond_to?(:sysseek)
-        @read_s.sysseek(-ret.size, IO::SEEK_CUR)
-      else
-        @read_s.seek(-ret.size, IO::SEEK_CUR)
-      end
-    end
-    ret
-  end
-  alias_method :recv, :recv_nonblock
-
-  def write(data)
-    @write_s.write data
-  end
-
-  def syswrite(data)
-    @write_s.syswrite data
-  end
-
-end
-
 class MogileFS::Client
   attr_writer :readonly
 end
 
-class TCPSocket
-
-  class << self
-
-    attr_accessor :connections
-    attr_accessor :sockets
-
-    alias old_new new
-
-    def new(host, port)
-      raise Errno::ECONNREFUSED if @sockets.empty?
-      @connections << [host, port]
-      @sockets.pop
+require 'socket'
+class TempServer
+  attr_reader :port
+
+  def self.destroy_all!
+    ObjectSpace.each_object(TempServer) { |t| t.destroy! }
+  end
+
+  def initialize(server_proc)
+    @port = @sock = nil
+    retries = 0
+    begin
+      @port = 5000 + $$ % 1000 + rand(60000)
+      @sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
+      @sock.bind(Socket.pack_sockaddr_in(@port, '127.0.0.1'))
+      @sock.listen(5)
+    rescue Errno::EADDRINUSE
+      @sock.close rescue nil
+      retry if (retries += 1) < 10
     end
+    @thr = Thread.new(@sock, @port) { |s,p| server_proc.call(s, p) }
+  end
 
-    alias open new
-
+  def destroy!
+    @sock.close rescue nil
+    Thread.kill(@thr) rescue nil
   end
 
 end
@@ -154,9 +96,6 @@ class TestMogileFS < Test::Unit::TestCase
                                   :root => @root
     @backend = FakeBackend.new
     @client.instance_variable_set '@backend', @backend
-
-    TCPSocket.sockets = []
-    TCPSocket.connections = []
   end
 
   def teardown