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