Rewrite tests to not use threads (1.9)
[ruby-mogilefs-client.git] / test / setup.rb
blob4ac99bb36ae9a669949145730e9aae1ca88bc807
1 STDIN.sync = STDOUT.sync = STDERR.sync = true
2 require 'test/unit'
3 require 'tempfile'
4 require 'fileutils'
5 require 'tmpdir'
6 require 'stringio'
8 trap('CHLD') { Process.waitpid(-1, Process::WNOHANG) rescue nil }
10 $TESTING = true
12 require 'mogilefs'
14 class FakeBackend
16   attr_reader :lasterr, :lasterrstr
18   def initialize
19     @responses = Hash.new { |h,k| h[k] = [] }
20     @lasterr = nil
21     @lasterrstr = nil
22   end
24   def error(err_snake)
25     err_camel = err_snake.gsub(/(?:^|_)([a-z])/) { $1.upcase } << 'Error'
26     unless MogileFS::Backend.const_defined?(err_camel)
27       MogileFS::Backend.class_eval("class #{err_camel} < MogileFS::Error; end")
28     end
29     MogileFS::Backend.const_get(err_camel)
30   end
32   def method_missing(meth, *args)
33     meth = meth.to_s
34     if meth =~ /(.*)=$/ then
35       @responses[$1] << args.first
36     else
37       response = @responses[meth].shift
38       case response
39       when Array then
40         @lasterr = response.first
41         @lasterrstr = response.last
42         raise error(@lasterr), @lasterrstr
43         return nil
44       end
45       return response
46     end
47   end
49 end
51 class MogileFS::Client
52   attr_writer :readonly
53 end
55 require 'socket'
56 class TempServer
57   attr_reader :port, :pid
59   def self.destroy_all!
60     ObjectSpace.each_object(TempServer) { |t| t.destroy! }
61   end
63   at_exit { TempServer.destroy_all! }
65   def initialize(server_proc)
66     @pid = @port = @sock = nil
67     retries = 0
68     begin
69       @port = 1024 + rand(32768 - 1024)
70       @sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
71       @sock.bind(Socket.pack_sockaddr_in(@port, '127.0.0.1'))
72       @sock.listen(5)
73     rescue Errno::EADDRINUSE, Errno::EACCES
74       @sock.close rescue nil
75       retry if (retries += 1) < 10
76     end
77     @pid = fork { server_proc.call(@sock, @port) }
78     @sock.close rescue nil
79   end
81   def destroy!
82     @sock.close rescue nil
83     Process.kill('KILL', @pid) rescue nil
84   end
86 end
88 class TestMogileFS < Test::Unit::TestCase
90   undef_method :default_test if method_defined?(:default_test)
92   def setup
93     @client = @klass.new :hosts => ['kaa:6001'], :domain => 'test'
94     @backend = FakeBackend.new
95     @client.instance_variable_set '@backend', @backend
96   end
98 end
100 # for our mock results
101 class Array
102   alias_method :fetch_row, :shift
105 class FakeMysql
106   attr_reader :expect
107   TBL_DEVICES = [
108     # devid, hostip,    altip,         http_port, http_get_port
109     [ 1,    '10.0.0.1', '192.168.0.1', 7500,      7600 ],
110     [ 2,    '10.0.0.2', '192.168.0.2', 7500,      7600 ],
111     [ 3,    '10.0.0.3', nil,           7500,      nil ],
112     [ 4,    '10.0.0.4', nil,           7500,      nil ],
113   ]
114   TBL_DOMAINS = [
115     # dmid, namespace
116     [ 1, 'test' ],
117     [ 2, 'foo' ],
118   ]
120   def initialize
121     @expect = []
122   end
124   def quote(str)
125     str.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
126   end
128   def query(sql = '')
129     case sql
130     when MogileFS::Mysql::GET_DEVICES then TBL_DEVICES
131     when MogileFS::Mysql::GET_DOMAINS then TBL_DOMAINS
132     else
133       @expect.shift
134     end
135   end