1 # -*- encoding: binary -*-
2 require "./test/integration"
5 unless File.executable?(`which mogtool 2>/dev/null`.strip)
6 warn "mogtool not found, skipping #{__FILE__}"
10 class TestMogtoolBigfile < TestMogIntegration
11 buf = File.open("/dev/urandom") { |fp| fp.read(1024) }
13 RAND = Tempfile.new("rand")
15 sha1 = Digest::SHA1.new
16 100.times { sha1 << buf; RAND.write(buf) }
18 RAND_SHA1 = sha1.hexdigest
23 @big_uuid = "big-#{uuid}"
24 @client = MogileFS::MogileFS.new(:hosts => @trackers, :domain => @domain)
28 x!("mogtool", "--trackers=#{@trackers.join(',')}",
29 "--domain=#@domain", *args)
32 # the mogtool definition of gzip is wrong and just raw zlib deflate
33 def test_bigfile_gzip_mogtool
34 mogtool!("inject", "--gzip", "--bigfile", RAND.path, @big_uuid)
38 def test_bigfile_mogtool
39 mogtool!("inject", "--bigfile", RAND.path, @big_uuid)
42 # ensure fallback works for rebalanced/replaced files
43 part1 = "#@big_uuid,1"
44 tmp = tmpfile("part1")
45 before_uris = @client.get_uris(part1)
46 @client.get_file_data(part1) { |sock| MogileFS::X.copy_stream(sock, tmp) }
48 @client.store_file(part1, nil, tmp.path)
49 wait_for_DELETE(before_uris)
52 # corrupt the existing data in part1
53 @client.store_content(part1, nil, "HELLO")
54 after_uris = @client.get_uris(part1)
56 # corruption is detected on verify
57 junk = tmpfile("junk")
58 assert_raises(MogileFS::ChecksumMismatchError) do
59 @client.bigfile_write("_big_info:#@big_uuid", junk, :verify => true)
62 # corruption is NOT detected on verify
63 junk = tmpfile("junk")
64 assert_nothing_raised do
65 @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]