1 # -*- encoding: binary -*-
5 unless File.executable?(`which mogtool 2>/dev/null`.strip)
6 warn "mogtool not found, skipping #{__FILE__}"
10 class TestMogtoolBigfile < Test::Unit::TestCase
11 include TestFreshSetup
12 buf = File.open("/dev/urandom") { |fp| fp.read(1024) }
14 RAND = Tempfile.new("rand")
16 sha1 = Digest::SHA1.new
17 100.times { sha1 << buf; RAND.write(buf) }
19 RAND_SHA1 = sha1.hexdigest
23 add_host_device_domain
25 @big_uuid = "big-#{uuid}"
26 @client = MogileFS::MogileFS.new(:hosts => @trackers, :domain => @domain)
30 x!("mogtool", "--trackers=#{@trackers.join(',')}",
31 "--domain=#@domain", *args)
34 # the mogtool definition of gzip is wrong and just raw zlib deflate
35 def test_bigfile_gzip_mogtool
36 mogtool!("inject", "--gzip", "--bigfile", RAND.path, @big_uuid)
40 def test_bigfile_mogtool
41 mogtool!("inject", "--bigfile", RAND.path, @big_uuid)
44 # ensure fallback works for rebalanced/replaced files
45 part1 = "#@big_uuid,1"
46 tmp = tmpfile("part1")
47 before_uris = @client.get_uris(part1)
48 @client.get_file_data(part1, tmp)
50 @client.store_file(part1, nil, tmp.path)
51 wait_for_DELETE(before_uris)
54 # corrupt the existing data in part1
55 @client.store_content(part1, nil, "HELLO")
56 @client.get_uris(part1)
58 # corruption is detected on verify
59 junk = tmpfile("junk")
60 assert_raises(MogileFS::ChecksumMismatchError) do
61 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => true)
64 # corruption is NOT detected on verify
65 junk = tmpfile("junk")
66 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => false)
68 # restoring no-corrupted data succeeds!
69 @client.store_file(part1, nil, tmp.path)
73 before_uris = @client.get_uris(part1)
75 junk = tmpfile("junk")
76 assert_raises(MogileFS::Backend::UnknownKeyError) do
77 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => true)
81 def wait_for_DELETE(uris)
85 Net::HTTP.start(uri.host, uri.port) do |http|
86 sleep(0.1) while Net::HTTPOK === http.head(uri.path)
103 sha1 = Digest::SHA1.new
105 while r.read(16384, buf)
110 res = @client.bigfile_write("_big_info:#@big_uuid", w, :verify => true)
113 assert_equal RAND_SHA1, read_sha1
114 assert_equal RAND.size, res[0]