1 # -*- encoding: binary -*-
2 require './test/integration'
4 class TestMogileFSIntegration < TestMogIntegration
7 @client = MogileFS::MogileFS.new(:hosts => @trackers, :domain => @domain)
11 assert_equal 4, @client.store_content("CRUD", "default", "DATA")
12 assert_equal 4, @client.size("CRUD")
13 assert_equal "DATA", @client.get_file_data("CRUD")
14 assert_equal "DAT", @client.get_file_data("CRUD", nil, 3)
15 assert_equal "AT", @client.get_file_data("CRUD", nil, 2, 1)
17 tmp = Tempfile.new("z")
20 assert_equal 4, @client.get_file_data("CRUD", tmp_path)
21 assert_equal "DATA", File.read(tmp_path)
24 sio = StringIO.new("")
25 rv = @client.get_file_data("CRUD", sio)
27 assert_equal "DATA", sio.string
28 assert_equal 8, @client.store_content("CRUD", "default", "MOARDATA")
29 assert_equal "MOARDATA", @client.get_file_data("CRUD")
30 assert_equal true, @client.delete("CRUD")
31 assert_raises(MogileFS::Backend::UnknownKeyError) { @client.delete("CRUD") }
33 data = "hello world\n".freeze
38 assert_equal tmp.size, @client.store_file("blob", nil, tmp)
39 assert_equal(data, @client.get_file_data("blob"))
41 data = "pipe!\n".freeze
47 assert_equal data.size, @client.store_file("pipe", nil, r)
48 assert_nothing_raised do
52 assert_equal(data, @client.get_file_data("pipe"))
54 cbk = MogileFS::Util::StoreContent.new(nil) do |write_callback|
55 10.times { write_callback.call("data") }
58 nr = @client.store_content('store_content', nil, cbk)
60 assert_equal("data" * 10, @client.get_file_data('store_content'))
63 def test_store_non_rewindable
68 def tmp.read(len, buf = "")
72 assert_raises(MogileFS::HTTPFile::NonRetryableError) do
73 @client.store_file("non_rewindable", nil, tmp)
78 assert_equal 3, @client.store_content("file_info", "default", "FOO")
79 res = @client.file_info("file_info")
80 assert_kind_of Integer, res["fid"]
81 assert_equal 3, res["length"]
82 assert ! res.include?("devids")
83 assert_kind_of Integer, res["devcount"]
85 res = @client.file_info("file_info", :devices => true)
86 assert_kind_of Integer, res["fid"]
87 assert_equal 3, res["length"]
88 assert_kind_of Integer, res["devcount"]
89 devids = res.delete("devids")
90 assert_instance_of Array, devids
91 devids.each { |devid| assert_kind_of Integer, devid }
92 assert_equal res["devcount"], devids.size
96 assert_equal 3, @client.store_content("file_debug", "default", "BUG")
97 a = @client.file_debug("file_debug")
98 b = @client.file_debug(:key => "file_debug")
99 fid = @client.file_info("file_debug")["fid"]
100 c = @client.file_debug(fid)
101 d = @client.file_debug(:fid => fid)
103 [ a, b, c, d ].each do |res|
104 assert_equal fid, res["fid_fid"]
105 assert_equal 0, res["fid_classid"]
106 assert_equal "file_debug", res["fid_dkey"]
107 assert_equal 3, res["fid_length"]
108 assert_kind_of Array, res["devids"]
109 assert_kind_of Integer, res["devids"][0]
110 res["devids"].each do |devid|
111 uri = URI.parse(res["devpath_#{devid}"])
112 assert_equal "http", uri.scheme
114 assert_equal "default", res["fid_class"]
116 @client.delete("file_debug")
117 rv = @client.file_debug(fid)
118 assert rv.keys.grep(/\Afid_/).empty?, rv.inspect
121 def test_file_debug_in_progress
122 rv = @client.new_file("file_debug_in_progress") do |http_file|
124 dests = http_file.instance_variable_get(:@dests)
125 dests[0][1] =~ %r{/(\d+)\.fid\z}
127 rv = @client.file_debug(fid)
128 devids = dests.map { |x| x[0].to_i }.sort
129 assert_equal devids, rv["tempfile_devids"].sort
130 assert_equal "file_debug_in_progress", rv["tempfile_dkey"]
135 def test_admin_get_devices
136 admin = MogileFS::Admin.new(:hosts => @trackers)
137 devices = admin.get_devices
138 if any_device = devices[0]
139 %w(mb_asof mb_free mb_used mb_total devid weight hostid).each do |field|
140 case value = any_device[field]
143 assert value >= 0, "#{field}=#{value.inspect} is negative"
145 assert false, "#{field}=#{value.inspect} is #{value.class}"
149 field = "utilization"
150 case value = any_device[field]
153 assert value >= 0.0, "#{field}=#{value.inspect} is negative"
155 assert false, "#{field}=#{value.inspect} is #{value.class}"
160 # TODO: move this to a fresh instance
161 def test_admin_each_fid
162 admin = MogileFS::Admin.new(:hosts => @trackers)
164 count = admin.each_fid do |info|
165 seen[info["fid"]] = true
166 assert_kind_of Integer, info["fid"]
167 assert_kind_of Integer, info["length"]
168 assert_kind_of Integer, info["devcount"]
169 assert_kind_of String, info["key"]
170 assert_kind_of String, info["class"]
171 assert_kind_of String, info["domain"]
173 assert_equal count, seen.size
174 end if ENV["TEST_EXPENSIVE"]
176 def test_new_file_no_block
177 rv = @client.new_file("no_block")
178 assert_nothing_raised { rv.write "HELLO" }
180 assert_equal "HELLO", @client.get_file_data("no_block")
183 def test_new_file_known_content_length
184 rv = @client.new_file("a", :content_length => 5)
185 assert_nothing_raised { rv.write "HELLO" }
187 assert_equal "HELLO", @client.get_file_data("a")
189 rv = @client.new_file("a", :content_length => 6)
190 assert_nothing_raised { rv.write "GOOD" }
191 assert_raises(MogileFS::SizeMismatchError) { rv.close }
192 assert_equal "HELLO", @client.get_file_data("a")
195 def test_new_file_content_md5
197 b64digest = [ Digest::MD5.digest("HELLO") ].pack('m').strip
198 rv = @client.new_file("a", :content_md5 => b64digest, :content_length => 5)
199 assert_nothing_raised { rv.write "HELLO" }
201 assert_equal "HELLO", @client.get_file_data("a")
203 assert_nothing_raised { w.write "HIHI"; w.close }
204 assert_raises(ArgumentError) do
205 @client.new_file("a", :content_md5 => b64digest) { |f| f.big_io = r }
207 assert_equal "HELLO", @client.get_file_data("a")
209 assert_nothing_raised do
210 @client.new_file("a", :content_md5 => :trailer) { |f| f.big_io = r }
212 assert_equal "HIHI", @client.get_file_data("a")