cleanup unused variable warnings
[ruby-mogilefs-client.git] / test / setup.rb
blobb831cc1a0f64f3f5d41ed649630a05590fd41e35
1 # -*- encoding: binary -*-
2 STDIN.sync = STDOUT.sync = STDERR.sync = true
3 require 'test/unit'
4 require 'tempfile'
5 require 'fileutils'
6 require 'tmpdir'
7 require 'stringio'
9 trap('CHLD') { Process.waitpid(-1, Process::WNOHANG) rescue nil }
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, :pid
60   def self.destroy_all!
61     ObjectSpace.each_object(TempServer) { |t| t.destroy! }
62   end
64   at_exit { TempServer.destroy_all! }
66   def initialize(server_proc, port = nil)
67     @pid = @sock = nil
68     @port = port
69     retries = 10
70     begin
71       @port ||= 1024 + rand(32768 - 1024)
72       @sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
73       @sock.bind(Socket.pack_sockaddr_in(@port.to_i, '127.0.0.1'))
74       @sock.listen(5)
75     rescue Errno::EADDRINUSE, Errno::EACCES => err
76       @sock.close rescue nil
77       @port = nil
78       retry if port.nil? && (retries -= 1) > 0
79       warn "retries failed: #{retries} port=#{port.inspect}"
80       raise err
81     end
82     @pid = fork { server_proc.call(@sock, @port) }
83     @sock.close rescue nil
84   end
86   def destroy!
87     @sock.close rescue nil
88     Process.kill('KILL', @pid) rescue nil
89   end
91 end
93 class TestMogileFS < Test::Unit::TestCase
95   undef_method :default_test if method_defined?(:default_test)
97   def setup
98     @client = @klass.new :hosts => ['kaa:6001'], :domain => 'test'
99     @backend = FakeBackend.new
100     @client.instance_variable_set '@backend', @backend
101   end
105 # for our mock results
106 class Array
107   alias_method :fetch_row, :shift
110 class FakeMysql
111   attr_reader :expect
112   TBL_DEVICES = [
113     # devid, hostip, altip, http_port, http_get_port, dev status, host status
114     [ 1, '10.0.0.1', '192.168.0.1', 7500, 7600, 'readonly', 'alive' ],
115     [ 2, '10.0.0.2', '192.168.0.2', 7500, 7600, 'alive', 'alive' ],
116     [ 3, '10.0.0.3', nil, 7500, nil, 'readonly', 'alive' ],
117     [ 4, '10.0.0.4', nil, 7500, nil, 'alive', 'alive' ],
118     [ 5, '10.0.0.5', nil, 7500, nil, 'dead', 'alive' ],
119     [ 6, '10.0.0.6', nil, 7500, nil, 'alive', 'down' ],
120   ]
121   TBL_DOMAINS = [
122     # dmid, namespace
123     [ 1, 'test' ],
124     [ 2, 'foo' ],
125   ]
127   def initialize
128     @expect = []
129   end
131   def quote(str)
132     str.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
133   end
135   def query(sql = '')
136     case sql
137     when MogileFS::Mysql::GET_DEVICES then TBL_DEVICES
138     when MogileFS::Mysql::GET_DOMAINS then TBL_DOMAINS
139     else
140       @expect.shift
141     end
142   end