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