get_file_data supports offset and count
[ruby-mogilefs-client.git] / test / test_mogilefs_integration.rb
blobe42185adb1d3c4fc785f89b9bf0a897ddc8863d2
1 # -*- encoding: binary -*-
2 require './test/integration'
4 class TestMogileFSIntegration < TestMogIntegration
5   def setup
6     super
7     @client = MogileFS::MogileFS.new(:hosts => @trackers, :domain => @domain)
8   end
10   def test_CRUD
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     sio = StringIO.new("")
18     rv = @client.get_file_data("CRUD", sio)
19     assert_equal 4, rv
20     assert_equal "DATA", sio.string
21     assert_equal 8, @client.store_content("CRUD", "default", "MOARDATA")
22     assert_equal "MOARDATA", @client.get_file_data("CRUD")
23     assert_equal true, @client.delete("CRUD")
24     assert_raises(MogileFS::Backend::UnknownKeyError) { @client.delete("CRUD") }
26     data = "hello world\n".freeze
27     tmp = tmpfile("blob")
28     tmp.sync = true
29     tmp.write(data)
30     tmp.rewind
31     assert_equal tmp.size, @client.store_file("blob", nil, tmp)
32     assert_equal(data, @client.get_file_data("blob"))
34     data = "pipe!\n".freeze
35     r, w = IO.pipe
36     th = Thread.new do
37       w.write(data)
38       w.close
39     end
40     assert_equal data.size, @client.store_file("pipe", nil, r)
41     assert_nothing_raised do
42       r.close
43       th.join
44     end
45     assert_equal(data, @client.get_file_data("pipe"))
47     cbk = MogileFS::Util::StoreContent.new(nil) do |write_callback|
48       10.times { write_callback.call("data") }
49     end
50     assert_nil cbk.length
51     nr = @client.store_content('store_content', nil, cbk)
52     assert_equal 40, nr
53     assert_equal("data" * 10, @client.get_file_data('store_content'))
54   end
56   def test_store_non_rewindable
57     tmp = Object.new
58     def tmp.size
59       666
60     end
62     assert_raises(MogileFS::HTTPFile::NonRetryableError) do
63       @client.store_file("non_rewindable", nil, tmp)
64     end
65   end
67   def test_file_info
68     assert_equal 3, @client.store_content("file_info", "default", "FOO")
69     res = @client.file_info("file_info")
70     assert_kind_of Integer, res["fid"]
71     assert_equal 3, res["length"]
72     assert ! res.include?("devids")
73     assert_kind_of Integer, res["devcount"]
75     res = @client.file_info("file_info", :devices => true)
76     assert_kind_of Integer, res["fid"]
77     assert_equal 3, res["length"]
78     assert_kind_of Integer, res["devcount"]
79     devids = res.delete("devids")
80     assert_instance_of Array, devids
81     devids.each { |devid| assert_kind_of Integer, devid }
82     assert_equal res["devcount"], devids.size
83   end
85   def test_file_debug
86     assert_equal 3, @client.store_content("file_debug", "default", "BUG")
87     a = @client.file_debug("file_debug")
88     b = @client.file_debug(:key => "file_debug")
89     fid = @client.file_info("file_debug")["fid"]
90     c = @client.file_debug(fid)
91     d = @client.file_debug(:fid => fid)
93     [ a, b, c, d ].each do |res|
94       assert_equal fid, res["fid_fid"]
95       assert_equal 0, res["fid_classid"]
96       assert_equal "file_debug", res["fid_dkey"]
97       assert_equal 3, res["fid_length"]
98       assert_kind_of Array, res["devids"]
99       assert_kind_of Integer, res["devids"][0]
100       res["devids"].each do |devid|
101         uri = URI.parse(res["devpath_#{devid}"])
102         assert_equal "http", uri.scheme
103       end
104       assert_equal "default", res["fid_class"]
105     end
106     @client.delete("file_debug")
107     rv = @client.file_debug(fid)
108     assert rv.keys.grep(/\Afid_/).empty?, rv.inspect
109   end
111   def test_file_debug_in_progress
112     rv = @client.new_file("file_debug_in_progress") do |http_file|
113       http_file << "ZZZZ"
114       dests = http_file.instance_variable_get(:@dests)
115       dests[0][1] =~ %r{/(\d+)\.fid\z}
116       fid = $1.to_i
117       rv = @client.file_debug(fid)
118       devids = dests.map { |x| x[0].to_i }.sort
119       assert_equal devids, rv["tempfile_devids"].sort
120       assert_equal "file_debug_in_progress", rv["tempfile_dkey"]
121     end
122     assert_equal 4, rv
123   end