summaryrefslogtreecommitdiff
path: root/test/cgi/test_cgi_header.rb
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-28 00:19:26 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-28 00:19:26 +0000
commitf30670001b75860875d7a3d8efea824145df2a4d (patch)
tree70b6453893a1ff91e8c985936a6e36e29a067411 /test/cgi/test_cgi_header.rb
parent5d93e408663dd85fef72cc51a49ee837cb0af45f (diff)
* 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
Diffstat (limited to 'test/cgi/test_cgi_header.rb')
-rwxr-xr-xtest/cgi/test_cgi_header.rb177
1 files changed, 177 insertions, 0 deletions
diff --git a/test/cgi/test_cgi_header.rb b/test/cgi/test_cgi_header.rb
new file mode 100755
index 00000000000..c92d01754a7
--- /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