test: move mocks from test_mysql to test/setup
[ruby-mogilefs-client.git] / test / setup.rb
blobb0dc53f7adb103bfd9275fffd183911f782ba533
1 require 'test/unit'
3 require 'fileutils'
4 require 'tmpdir'
5 require 'stringio'
7 require 'rubygems'
8 require 'test/zentest_assertions'
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 FakeSocket
53   attr_reader :read_s
54   attr_reader :write_s
55   attr_reader :sync
57   def initialize(read = '', write = StringIO.new)
58     @read_s = read.class.method_defined?(:sysread) ? read : StringIO.new(read)
59     @write_s = write
60     @closed = false
61     @sync = false
62   end
64   def sync=(do_sync)
65     @sync = do_sync
66     @write_s.sync = do_sync
67     @read_s.sync = do_sync
68   end
70   def closed?
71     @closed
72   end
74   def close
75     @closed = true
76     return nil
77   end
79   def gets
80     @read_s.gets
81   end
83   def peeraddr
84     ['AF_INET', 6001, 'localhost', '127.0.0.1']
85   end
87   def read(bytes = nil)
88     @read_s.read bytes
89   end
91   def sysread(bytes, buf = '')
92     @read_s.sysread bytes, buf
93   end
95   def recv_nonblock(bytes, flags = 0)
96     ret = @read_s.sysread(bytes)
97     # Ruby doesn't expose pread(2)
98     if (flags & Socket::MSG_PEEK) != 0
99       if @read_s.respond_to?(:sysseek)
100         @read_s.sysseek(-ret.size, IO::SEEK_CUR)
101       else
102         @read_s.seek(-ret.size, IO::SEEK_CUR)
103       end
104     end
105     ret
106   end
107   alias_method :recv, :recv_nonblock
109   def write(data)
110     @write_s.write data
111   end
113   def syswrite(data)
114     @write_s.syswrite data
115   end
119 class MogileFS::Client
120   attr_writer :readonly
123 class TCPSocket
125   class << self
127     attr_accessor :connections
128     attr_accessor :sockets
130     alias old_new new
132     def new(host, port)
133       raise Errno::ECONNREFUSED if @sockets.empty?
134       @connections << [host, port]
135       @sockets.pop
136     end
138     alias open new
140   end
144 class TestMogileFS < Test::Unit::TestCase
146   undef_method :default_test
148   def setup
149     @tempdir = File.join Dir.tmpdir, "test_mogilefs_#{$$}"
150     @root = File.join @tempdir, 'root'
151     FileUtils.mkdir_p @root
153     @client = @klass.new :hosts => ['kaa:6001'], :domain => 'test',
154                                   :root => @root
155     @backend = FakeBackend.new
156     @client.instance_variable_set '@backend', @backend
158     TCPSocket.sockets = []
159     TCPSocket.connections = []
160   end
162   def teardown
163     FileUtils.rm_rf @tempdir
164   end
168 # for our mock results
169 class Array
170   alias_method :fetch_row, :shift
173 class FakeMysql
174   attr_reader :expect
175   TBL_DEVICES = [
176     # devid, hostip,    altip,         http_port, http_get_port
177     [ 1,    '10.0.0.1', '192.168.0.1', 7500,      7600 ],
178     [ 2,    '10.0.0.2', '192.168.0.2', 7500,      7600 ],
179     [ 3,    '10.0.0.3', nil,           7500,      nil ],
180     [ 4,    '10.0.0.4', nil,           7500,      nil ],
181   ]
182   TBL_DOMAINS = [
183     # dmid, namespace
184     [ 1, 'test' ],
185     [ 2, 'foo' ],
186   ]
188   def initialize
189     @expect = []
190   end
192   def quote(str)
193     str.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
194   end
196   def query(sql = '')
197     case sql
198     when MogileFS::Mysql::GET_DEVICES then TBL_DEVICES
199     when MogileFS::Mysql::GET_DOMAINS then TBL_DOMAINS
200     else
201       @expect.shift
202     end
203   end