From f30670001b75860875d7a3d8efea824145df2a4d Mon Sep 17 00:00:00 2001 From: naruse Date: Thu, 28 Aug 2008 00:19:26 +0000 Subject: [PATCH] * test/cgi/test_cgi_header.rb: add test for CGI::Header. Patch by Takeyuki Fujioka. [ruby-dev:36010] [ruby-dev:36011] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18888 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/cgi/test_cgi_header.rb | 177 ++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100755 test/cgi/test_cgi_header.rb diff --git a/test/cgi/test_cgi_header.rb b/test/cgi/test_cgi_header.rb new file mode 100755 index 0000000000..c92d01754a --- /dev/null +++ b/test/cgi/test_cgi_header.rb @@ -0,0 +1,177 @@ +require 'test/unit' +require 'cgi' + + +class CGIHeaderTest < Test::Unit::TestCase + + + def setup + @environ = { + 'SERVER_PROTOCOL' => 'HTTP/1.1', + 'REQUEST_METHOD' => 'GET', + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + } + ENV.update(@environ) + end + + + def teardown + @environ.each do |key, val| ENV.delete(key) end + end + + + def test_cgi_header_simple + cgi = CGI.new + ## default content type + expected = "Content-Type: text/html\r\n\r\n" + actual = cgi.header + assert_equal(expected, actual) + ## content type specified as string + expected = "Content-Type: text/xhtml; charset=utf8\r\n\r\n" + actual = cgi.header('text/xhtml; charset=utf8') + assert_equal(expected, actual) + ## content type specified as hash + expected = "Content-Type: image/png\r\n\r\n" + actual = cgi.header('type'=>'image/png') + assert_equal(expected, actual) + ## charset specified + expected = "Content-Type: text/html; charset=utf8\r\n\r\n" + actual = cgi.header('charset'=>'utf8') + assert_equal(expected, actual) + end + + + def test_cgi_header_complex + cgi = CGI.new + options = { + 'type' => 'text/xhtml', + 'charset' => 'utf8', + 'status' => 'REDIRECT', + 'server' => 'webrick', + 'connection' => 'close', + 'length' => 123, + 'language' => 'ja', + 'expires' => Time.gm(2000, 1, 23, 12, 34, 56), + 'location' => 'http://www.ruby-lang.org/', + } + expected = "Status: 302 Found\r\n" + expected << "Server: webrick\r\n" + expected << "Connection: close\r\n" + expected << "Content-Type: text/xhtml; charset=utf8\r\n" + expected << "Content-Length: 123\r\n" + expected << "Content-Language: ja\r\n" + expected << "Expires: Sun, 23 Jan 2000 12:34:56 GMT\r\n" + expected << "location: http://www.ruby-lang.org/\r\n" + expected << "\r\n" + actual = cgi.header(options) + assert_equal(expected, actual) + end + + + def test_cgi_header_argerr + cgi = CGI.new + #expected = NoMethodError # must be ArgumentError + if defined?(CGI::RELEASE) + expected = ArgumentError # for CGIAlt + else + expected = NoMethodError # for Ruby1.8 + end + ex = assert_raise(expected) do + cgi.header(nil) + end + end + + + def test_cgi_header_cookie + cgi = CGI.new + cookie1 = CGI::Cookie.new('name1', 'abc', '123') + cookie2 = CGI::Cookie.new('name'=>'name2', 'value'=>'value2', 'secure'=>true) + ctype = "Content-Type: text/html\r\n" + sep = "\r\n" + c1 = "Set-Cookie: name1=abc&123; path=\r\n" + c2 = "Set-Cookie: name2=value2; path=; secure\r\n" + ## CGI::Cookie object + actual = cgi.header('cookie'=>cookie1) + expected = ctype + c1 + sep + assert_equal(expected, actual) + ## String + actual = cgi.header('cookie'=>cookie2.to_s) + expected = ctype + c2 + sep + assert_equal(expected, actual) + ## Array + actual = cgi.header('cookie'=>[cookie1, cookie2]) + expected = ctype + c1 + c2 + sep + assert_equal(expected, actual) + ## Hash + actual = cgi.header('cookie'=>{'name1'=>cookie1, 'name2'=>cookie2}) + expected = ctype + c1 + c2 + sep + assert_equal(expected, actual) + end + + + def test_cgi_header_output_cookies + cgi = CGI.new + ## output cookies + cookies = [ CGI::Cookie.new('name1', 'abc', '123'), + CGI::Cookie.new('name'=>'name2', 'value'=>'value2', 'secure'=>true), + ] + cgi.instance_variable_set('@output_cookies', cookies) + expected = "Content-Type: text/html; charset=utf8\r\n" + expected << "Set-Cookie: name1=abc&123; path=\r\n" + expected << "Set-Cookie: name2=value2; path=; secure\r\n" + expected << "\r\n" + ## header when string + actual = cgi.header('text/html; charset=utf8') + assert_equal(expected, actual) + ## _header_for_string + actual = cgi.header('type'=>'text/html', 'charset'=>'utf8') + assert_equal(expected, actual) + end + + + def test_cgi_header_nph + cgi = CGI.new + ## 'nph' is true + ENV['SERVER_SOFTWARE'] = 'Apache 2.2.0' + actual1 = cgi.header('nph'=>true) + ## when old IIS, NPH-mode is forced + ENV['SERVER_SOFTWARE'] = 'IIS/4.0' + actual2 = cgi.header + actual3 = cgi.header('status'=>'REDIRECT', 'location'=>'http://www.example.com/') + ## newer IIS doesn't require NPH-mode ## [ruby-dev:30537] + ENV['SERVER_SOFTWARE'] = 'IIS/5.0' + actual4 = cgi.header + actual5 = cgi.header('status'=>'REDIRECT', 'location'=>'http://www.example.com/') + ## assertion + now = Time.now + expected = "HTTP/1.1 200 OK\r\n" + expected << "Date: #{CGI.rfc1123_date(now)}\r\n" + expected << "Server: Apache 2.2.0\r\n" + expected << "Connection: close\r\n" + expected << "Content-Type: text/html\r\n" + expected << "\r\n" + assert_equal(expected, actual1) + expected.sub!(/^Server: .*?\r\n/, "Server: IIS/4.0\r\n") + assert_equal(expected, actual2) + expected.sub!(/^HTTP\/1.1 200 OK\r\n/, "HTTP/1.1 302 Found\r\n") + expected.sub!(/\r\n\r\n/, "\r\nlocation: http://www.example.com/\r\n\r\n") + assert_equal(expected, actual3) + expected = "Content-Type: text/html\r\n" + expected << "\r\n" + assert_equal(expected, actual4) + expected = "Status: 302 Found\r\n" + expected << "Content-Type: text/html\r\n" + expected << "location: http://www.example.com/\r\n" + expected << "\r\n" + assert_equal(expected, actual5) + ensure + ENV.delete('SERVER_SOFTWARE') + end + + + + instance_methods.each do |method| + private method if method =~ /^test_(.*)/ && $1 != ENV['TEST'] + end if ENV['TEST'] + +end