connect_timeout: match :timeout if unset
[ruby-mogilefs-client.git] / test / fresh.rb
blob4c53ac261fdc15d08da02796d6b6ca7d7a5afb68
1 # -*- encoding: binary -*-
2 require "./test/exec"
3 require "tmpdir"
4 require "fileutils"
5 require "net/http"
7 module TestFreshSetup
8   include TestExec
10   def setup_mogilefs(plugins = nil)
11     @teardown_pid = $$
12     @test_host = "127.0.0.1"
13     setup_mogstored
14     @tracker = TCPServer.new(@test_host, 0)
15     @tracker_port = @tracker.addr[1]
17     @dbname = Tempfile.new(["mogfresh", ".sqlite3"], @docroot)
18     @mogilefsd_conf = Tempfile.new(["mogilefsd", "conf"], @docroot)
19     @mogilefsd_pid = Tempfile.new(["mogilefsd", "pid"], @docroot)
20     @dbpath = @dbname.path
22     cmd = %w(mogdbsetup --yes --type=SQLite --dbname) << @dbpath
23     x!(*cmd)
25     @mogilefsd_conf.puts "db_dsn DBI:SQLite:#@dbpath"
26     @mogilefsd_conf.write <<EOF
27 conf_port #@tracker_port
28 listen #@test_host
29 pidfile #{@mogilefsd_pid.path}
30 replicate_jobs 1
31 fsck_jobs 1
32 query_jobs 1
33 mogstored_stream_port #{@mogstored_mgmt_port}
34 node_timeout 10
35 EOF
36     @mogilefsd_conf.flush
38     @trackers = @hosts = [ "#@test_host:#@tracker_port" ]
39     @tracker.close
40     start_tracker
41     @admin = MogileFS::Admin.new(:hosts => @hosts)
42     50.times do
43       break if File.size(@mogstored_pid.path) > 0
44       sleep 0.1
45     end
46   end
48   def start_tracker
49     x!("mogilefsd", "--daemon", "--config=#{@mogilefsd_conf.path}")
50     wait_for_port @tracker_port
51   end
53   def wait_for_port(port)
54     tries = 50
55     begin
56       TCPSocket.new(@test_host, port).close
57       return
58     rescue
59       sleep 0.1
60     end while (tries -= 1) > 0
61     raise "#@test_host:#{port} never became ready"
62   end
64   def add_host_device_domain
65     assert_equal [], @admin.get_hosts
66     args = { :ip => @test_host, :port => @mogstored_http_port }
67     args[:status] = "alive"
68     @admin.create_host("me", args)
69     assert File.directory?("#@docroot/dev1")
70     assert File.directory?("#@docroot/dev2")
71     yield_for_monitor_update { @admin.get_hosts.empty? or break }
73     me = @admin.get_hosts.find { |x| x["hostname"] == "me" }
74     assert_instance_of Hash, me, me.inspect
75     assert_kind_of Integer, me["hostid"], me
76     assert_equal true, @admin.create_device(me["hostid"], 1)
77     yield_for_monitor_update { @admin.get_devices.empty? or break }
78     wait_for_usage_file "dev1"
79     assert_equal true, @admin.create_device("me", 2)
80     wait_for_usage_file "dev2"
82     # MogileFS::Server 2.60+ shows reject_bad_md5 monitor status
83     dev = @admin.get_devices[0]
84     if dev.include?("reject_bad_md5")
85       assert [true, false, nil].include?(dev["reject_bad_md5"]), dev.inspect
86     end
88     out = err = nil
89     tries = 0
90     begin
91       out.close! if out
92       err.close! if err
93       status, out, err = mogadm("check")
94       assert status.success?, status.inspect
95       if (tries += 1) > 100
96         warn err.read
97         puts out.read
98         raise "mogadm failed"
99       end
100       sleep 0.1
101     end until out.read =~ /write?able/
103     domain = "rbmogtest.#$$"
104     @admin.create_domain(domain)
105     yield_for_monitor_update { @admin.get_domains.include?(domain) and break }
106     @domain = domain
107   end
109   def teardown_mogilefs
110     return if $$ != @teardown_pid
111     if @mogstored_pid
112       pid = File.read(@mogstored_pid.path).to_i
113       Process.kill(:TERM, pid) if pid > 0
114     end
115     if @mogilefsd_pid
116       s = TCPSocket.new(@test_host, @tracker_port)
117       s.write "!shutdown\r\n"
118       s.close
119     end
120     FileUtils.rmtree(@docroot)
121   end
123   def wait_for_usage_file(device)
124     uri = URI("http://#@test_host:#@mogstored_http_port/#{device}/usage")
125     res = nil
126     100.times do
127       res = Net::HTTP.get_response(uri)
128       if Net::HTTPOK === res
129         puts res.body if $DEBUG
130         return
131       end
132       puts res.inspect if $DEBUG
133       sleep 0.1
134     end
135     raise "#{uri} failed to appear: #{res.inspect}"
136   end
138   def setup_mogstored
139     @docroot = Dir.mktmpdir(["mogfresh", "docroot"])
140     Dir.mkdir("#@docroot/dev1")
141     Dir.mkdir("#@docroot/dev2")
142     @mogstored_mgmt = TCPServer.new(@test_host, 0)
143     @mogstored_http = TCPServer.new(@test_host, 0)
144     @mogstored_mgmt_port = @mogstored_mgmt.addr[1]
145     @mogstored_http_port = @mogstored_http.addr[1]
146     @mogstored_conf = Tempfile.new(["mogstored", "conf"], @docroot)
147     @mogstored_pid = Tempfile.new(["mogstored", "pid"], @docroot)
148     @mogstored_conf.write <<EOF
149 pidfile = #{@mogstored_pid.path}
150 maxconns = 1000
151 httplisten = #@test_host:#{@mogstored_http_port}
152 mgmtlisten = #@test_host:#{@mogstored_mgmt_port}
153 docroot = #@docroot
155     @mogstored_conf.flush
156     @mogstored_mgmt.close
157     @mogstored_http.close
159     x!("mogstored", "--daemon", "--config=#{@mogstored_conf.path}")
160     wait_for_port @mogstored_mgmt_port
161     wait_for_port @mogstored_http_port
162   end