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)
29 alias teardown teardown_mogilefs
32 x!("mogtool", "--trackers=#{@trackers.join(',')}",
33 "--domain=#@domain", *args)
36 # the mogtool definition of gzip is wrong and just raw zlib deflate
37 def test_bigfile_gzip_mogtool
38 mogtool!("inject", "--gzip", "--bigfile", RAND.path, @big_uuid)
42 def test_bigfile_mogtool
43 mogtool!("inject", "--bigfile", RAND.path, @big_uuid)
46 # ensure fallback works for rebalanced/replaced files
47 part1 = "#@big_uuid,1"
48 tmp = tmpfile("part1")
49 before_uris = @client.get_uris(part1)
50 @client.get_file_data(part1, tmp)
52 @client.store_file(part1, nil, tmp.path)
53 wait_for_DELETE(before_uris)
56 # corrupt the existing data in part1
57 @client.store_content(part1, nil, "HELLO")
58 @client.get_uris(part1)
60 # corruption is detected on verify
61 junk = tmpfile("junk")
62 assert_raises(MogileFS::ChecksumMismatchError) do
63 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => true)
66 # corruption is NOT detected on verify
67 junk = tmpfile("junk")
68 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => false)
70 # restoring no-corrupted data succeeds!
71 @client.store_file(part1, nil, tmp.path)
75 before_uris = @client.get_uris(part1)
77 junk = tmpfile("junk")
78 assert_raises(MogileFS::Backend::UnknownKeyError) do
79 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => true)
83 def wait_for_DELETE(uris)
87 Net::HTTP.start(uri.host, uri.port) do |http|
88 sleep(0.1) while Net::HTTPOK === http.head(uri.path)
105 sha1 = Digest::SHA1.new
107 while r.read(16384, buf)
112 res = @client.bigfile_write("_big_info:#@big_uuid", w, :verify => true)
115 assert_equal RAND_SHA1, read_sha1
116 assert_equal RAND.size, res[0]