1 # -*- encoding: binary -*-
4 require 'mogstored_rack'
11 class TestMogstoredRack < Test::Unit::TestCase
12 include TestFreshSetup
17 def test_range_put_new_file
18 add_host_device_domain
19 client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
21 io = client.new_file "range0", :largefile => :content_range
23 assert_equal "", client.get_file_data("range0")
25 io = client.new_file "writes", :largefile => :content_range
26 %w(a b c d e).each { |x| io.write(x) }
28 assert_equal "abcde", client.get_file_data("writes")
30 io = client.new_file "puts", :largefile => :content_range
31 %w(a b c d e).each { |x| io.puts(x) }
32 assert ! client.exist?("puts")
34 assert_equal "a\nb\nc\nd\ne\n", client.get_file_data("puts")
37 def test_stream_new_file
38 add_host_device_domain
39 client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
40 client.new_file("chunky", :largefile => :stream) do |io|
41 assert_instance_of MogileFS::NewFile::Stream, io
42 assert_equal(5, io.write("HELLO"))
45 assert_equal "HELLO", client.get_file_data("chunky")
47 io = client.new_file("puts", :largefile => :stream)
48 assert_instance_of MogileFS::NewFile::Stream, io
49 assert_equal io, IO.select(nil, [io])[1][0], "IO.select-able"
51 assert_nil(io.puts("PUTS!"))
52 assert_nil(io.puts("PUTZ"))
54 assert_equal "PUTS!\nPUTZ\n", client.get_file_data("puts")
56 io = client.new_file("putc", :largefile => :stream)
57 assert_equal(0x20, io.putc(0x20))
59 assert_equal " ", client.get_file_data("putc")
61 io = client.new_file("print splat", :largefile => :stream)
64 assert_equal "123", client.get_file_data("print splat")
66 io = client.new_file("printf", :largefile => :stream)
67 assert_nil io.printf("%x", 1638)
69 assert_equal "666", client.get_file_data("printf")
71 io = client.new_file("syswrite", :largefile => :stream)
72 assert_equal 4, io.syswrite("good")
73 assert_equal 7, io.syswrite("morning")
75 assert_equal "goodmorning", client.get_file_data("syswrite")
77 io = client.new_file("md5", :largefile=>:stream, :content_md5=>:trailer)
78 assert_instance_of Digest::MD5, io.md5
79 assert_nil io.puts("HIHI")
81 assert_equal "HIHI\n", client.get_file_data("md5")
82 assert_equal Digest::MD5.hexdigest("HIHI\n"), io.md5.hexdigest
84 io = client.new_file("<<", :largefile=>:stream)
85 assert_equal(io, io << ">>")
87 assert_equal ">>", client.get_file_data("<<")
90 def test_stream_new_file_with_content_length
91 add_host_device_domain
92 client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
93 io = client.new_file("clen", :largefile=>:stream,:content_length=>6)
96 assert_equal "HIHIHI", client.get_file_data("clen")
98 io = client.new_file("clen", :largefile=>:stream,:content_length=>1)
100 assert_raises(MogileFS::SizeMismatchError) { io.close }
101 assert_equal "HIHIHI", client.get_file_data("clen")
103 io = client.new_file("md5", :largefile=>:stream,
104 :content_length=>6, :content_md5=>:trailer)
105 assert_equal(io, io << "MD5MD5")
107 assert_equal "MD5MD5", client.get_file_data("md5")
108 assert_equal Digest::MD5.hexdigest("MD5MD5"), io.md5.hexdigest
110 io = client.new_file("md5", :largefile=>:stream,
111 :content_length=>6, :content_md5=>:trailer)
112 assert_equal(io, io << "MD5MD")
113 assert_raises(MogileFS::SizeMismatchError) { io.close }
114 assert_equal Digest::MD5.hexdigest("MD5MD"), io.md5.hexdigest
118 add_host_device_domain
119 client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
120 node = "#@test_host:#@mogstored_http_port"
122 # not modifying this hash in the same process
123 MogileFS::HTTPFile::MD5_TRAILER_NODES[node] = true
124 client.store_content("md5_me", nil, "HELLO WORLD")
126 _, status = Process.waitpid2(pid)
127 assert status.success?, status.inspect
128 assert_equal "HELLO WORLD", client.get_file_data("md5_me")
132 @docroot = Dir.mktmpdir(["mogfresh", "docroot"])
133 Dir.mkdir("#@docroot/dev1")
134 Dir.mkdir("#@docroot/dev2")
135 @mogstored_mgmt = TCPServer.new(@test_host, 0)
136 @mogstored_http = TCPServer.new(@test_host, 0)
137 @mogstored_mgmt_port = @mogstored_mgmt.addr[1]
138 @mogstored_http_port = @mogstored_http.addr[1]
139 @mogstored_conf = Tempfile.new(["mogstored", "conf"])
140 @mogstored_pid = Tempfile.new(["mogstored", "pid"])
141 @mogstored_conf.write <<EOF
142 pidfile = #{@mogstored_pid.path}
144 mgmtlisten = #@test_host:#{@mogstored_mgmt_port}
148 @mogstored_conf.flush
149 @mogstored_mgmt.close
153 x!("mogstored", "--daemon", "--config=#{@mogstored_conf.path}")
154 wait_for_port @mogstored_mgmt_port
157 # I would use Rainbows! + *Threads + Ruby 1.9.3 in production
159 @ru = Tempfile.new(%w(mogstored_rack .ru))
161 run MogstoredRack.new("#@docroot")
165 @unicorn_pid = Tempfile.new(%w(unicorn .pid))
166 @unicorn_conf = Tempfile.new(%w(unicorn.conf .rb))
167 @unicorn_stderr = Tempfile.new(%w(unicorn .stderr))
168 @unicorn_stdout = Tempfile.new(%w(unicorn .stdout))
169 @unicorn_conf.write <<EOF
170 require "mogstored_rack"
171 listen "#@test_host:#{@mogstored_http_port}"
172 pid "#{@unicorn_pid.path}"
173 stderr_path "#{@unicorn_stderr.path}"
174 stdout_path "#{@unicorn_stdout.path}"
175 rewindable_input false
179 @mogstored_http.close
180 x!("unicorn", "-E", "deployment",
181 "--daemon", "--config", @unicorn_conf.path, @ru.path)
182 wait_for_port @mogstored_http_port
184 break if File.size(@unicorn_pid.path) > 0
190 pid = File.read(@unicorn_pid.path).to_i
191 Process.kill(:QUIT, pid) if pid > 0
193 puts(@unicorn_stderr.read) if $DEBUG
195 end if ok && `which unicorn`.chomp.size > 0