test/setup: EACCES, not EACCES_S_
[ruby-mogilefs-client.git] / test / setup.rb
blob322ccf38cadaba78fc94c9fde8583e712672098b
1 STDIN.sync = STDOUT.sync = STDERR.sync = true
2 require 'test/unit'
4 require 'fileutils'
5 require 'tmpdir'
6 require 'stringio'
8 require 'rubygems'
9 require 'test/zentest_assertions'
11 $TESTING = true
13 require 'mogilefs'
15 class FakeBackend
17   attr_reader :lasterr, :lasterrstr
19   def initialize
20     @responses = Hash.new { |h,k| h[k] = [] }
21     @lasterr = nil
22     @lasterrstr = nil
23   end
25   def error(err_snake)
26     err_camel = err_snake.gsub(/(?:^|_)([a-z])/) { $1.upcase } << 'Error'
27     unless MogileFS::Backend.const_defined?(err_camel)
28       MogileFS::Backend.class_eval("class #{err_camel} < MogileFS::Error; end")
29     end
30     MogileFS::Backend.const_get(err_camel)
31   end
33   def method_missing(meth, *args)
34     meth = meth.to_s
35     if meth =~ /(.*)=$/ then
36       @responses[$1] << args.first
37     else
38       response = @responses[meth].shift
39       case response
40       when Array then
41         @lasterr = response.first
42         @lasterrstr = response.last
43         raise error(@lasterr), @lasterrstr
44         return nil
45       end
46       return response
47     end
48   end
50 end
52 class MogileFS::Client
53   attr_writer :readonly
54 end
56 require 'socket'
57 class TempServer
58   attr_reader :port
60   def self.destroy_all!
61     ObjectSpace.each_object(TempServer) { |t| t.destroy! }
62   end
64   def initialize(server_proc)
65     @thr = @port = @sock = nil
66     retries = 0
67     begin
68       @port = 1024 + rand(32768 - 1024)
69       @sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
70       @sock.bind(Socket.pack_sockaddr_in(@port, '127.0.0.1'))
71       @sock.listen(5)
72     rescue Errno::EADDRINUSE, Errno::EACCES
73       @sock.close rescue nil
74       retry if (retries += 1) < 10
75     end
76     @thr = Thread.new(@sock, @port) { |s,p| server_proc.call(s, p) }
77   end
79   def destroy!
80     @sock.close rescue nil
81     Thread.kill(@thr) rescue nil
82   end
84 end
86 class TestMogileFS < Test::Unit::TestCase
88   undef_method :default_test
90   def setup
91     @client = @klass.new :hosts => ['kaa:6001'], :domain => 'test'
92     @backend = FakeBackend.new
93     @client.instance_variable_set '@backend', @backend
94   end
96 end
98 # for our mock results
99 class Array
100   alias_method :fetch_row, :shift
103 class FakeMysql
104   attr_reader :expect
105   TBL_DEVICES = [
106     # devid, hostip,    altip,         http_port, http_get_port
107     [ 1,    '10.0.0.1', '192.168.0.1', 7500,      7600 ],
108     [ 2,    '10.0.0.2', '192.168.0.2', 7500,      7600 ],
109     [ 3,    '10.0.0.3', nil,           7500,      nil ],
110     [ 4,    '10.0.0.4', nil,           7500,      nil ],
111   ]
112   TBL_DOMAINS = [
113     # dmid, namespace
114     [ 1, 'test' ],
115     [ 2, 'foo' ],
116   ]
118   def initialize
119     @expect = []
120   end
122   def quote(str)
123     str.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
124   end
126   def query(sql = '')
127     case sql
128     when MogileFS::Mysql::GET_DEVICES then TBL_DEVICES
129     when MogileFS::Mysql::GET_DOMAINS then TBL_DOMAINS
130     else
131       @expect.shift
132     end
133   end