diff options
Diffstat (limited to 'jni/ruby/test/cgi/test_cgi_core.rb')
-rw-r--r-- | jni/ruby/test/cgi/test_cgi_core.rb | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/jni/ruby/test/cgi/test_cgi_core.rb b/jni/ruby/test/cgi/test_cgi_core.rb new file mode 100644 index 0000000..274d088 --- /dev/null +++ b/jni/ruby/test/cgi/test_cgi_core.rb @@ -0,0 +1,312 @@ +require 'test/unit' +require 'cgi' +require 'stringio' + + +class CGICoreTest < 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 + $stdout = STDOUT + end + + def test_cgi_parse_illegal_query + @environ = { + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'a=111&&b=222&c&d=', + 'HTTP_COOKIE' => '_session_id=12345; name1=val1&val2;', + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + } + ENV.update(@environ) + cgi = CGI.new + assert_equal(["a","b","c","d"],cgi.keys.sort) + assert_equal("",cgi["d"]) + end + + def test_cgi_core_params_GET + @environ = { + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'id=123&id=456&id=&id&str=%40h+%3D%7E+%2F%5E%24%2F', + 'HTTP_COOKIE' => '_session_id=12345; name1=val1&val2;', + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + } + ENV.update(@environ) + cgi = CGI.new + ## cgi[] + assert_equal('123', cgi['id']) + assert_equal('@h =~ /^$/', cgi['str']) + ## cgi.params + assert_equal(['123', '456', ''], cgi.params['id']) + assert_equal(['@h =~ /^$/'], cgi.params['str']) + ## cgi.keys + assert_equal(['id', 'str'], cgi.keys.sort) + ## cgi.key?, cgi.has_key?, cgi.include? + assert_equal(true, cgi.key?('id')) + assert_equal(true, cgi.has_key?('id')) + assert_equal(true, cgi.include?('id')) + assert_equal(false, cgi.key?('foo')) + assert_equal(false, cgi.has_key?('foo')) + assert_equal(false, cgi.include?('foo')) + ## invalid parameter name + assert_equal('', cgi['*notfound*']) # [ruby-dev:30740] + assert_equal([], cgi.params['*notfound*']) + end + + + def test_cgi_core_params_POST + query_str = 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F' + @environ = { + 'REQUEST_METHOD' => 'POST', + 'CONTENT_LENGTH' => query_str.length.to_s, + 'HTTP_COOKIE' => '_session_id=12345; name1=val1&val2;', + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + } + ENV.update(@environ) + $stdin = StringIO.new + $stdin << query_str + $stdin.rewind + cgi = CGI.new + ## cgi[] + assert_equal('123', cgi['id']) + assert_equal('@h =~ /^$/', cgi['str']) + ## cgi.params + assert_equal(['123', '456', ''], cgi.params['id']) + assert_equal(['@h =~ /^$/'], cgi.params['str']) + ## invalid parameter name + assert_equal('', cgi['*notfound*']) + assert_equal([], cgi.params['*notfound*']) + end + + def test_cgi_core_params_encoding_check + query_str = 'str=%BE%BE%B9%BE' + @environ = { + 'REQUEST_METHOD' => 'POST', + 'CONTENT_LENGTH' => query_str.length.to_s, + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + } + ENV.update(@environ) + $stdin = StringIO.new + $stdin << query_str + $stdin.rewind + if defined?(::Encoding) + hash={} + cgi = CGI.new(:accept_charset=>"UTF-8"){|key,val|hash[key]=val} + ## cgi[] + assert_equal("\xBE\xBE\xB9\xBE".force_encoding("UTF-8"), cgi['str']) + ## cgi.params + assert_equal(["\xBE\xBE\xB9\xBE".force_encoding("UTF-8")], cgi.params['str']) + ## accept-charset error + assert_equal({"str"=>"\xBE\xBE\xB9\xBE".force_encoding("UTF-8")},hash) + + $stdin.rewind + assert_raise(CGI::InvalidEncoding) do + cgi = CGI.new(:accept_charset=>"UTF-8") + end + + $stdin.rewind + cgi = CGI.new(:accept_charset=>"EUC-JP") + ## cgi[] + assert_equal("\xBE\xBE\xB9\xBE".force_encoding("EUC-JP"), cgi['str']) + ## cgi.params + assert_equal(["\xBE\xBE\xB9\xBE".force_encoding("EUC-JP")], cgi.params['str']) + else + assert(true) + end + end + + + def test_cgi_core_cookie + @environ = { + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F', + 'HTTP_COOKIE' => '_session_id=12345; name1=val1&val2;', + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + } + ENV.update(@environ) + cgi = CGI.new + assert_not_equal(nil,cgi.cookies) + [ ['_session_id', ['12345'], ], + ['name1', ['val1', 'val2'], ], + ].each do |key, expected| + cookie = cgi.cookies[key] + assert_kind_of(CGI::Cookie, cookie) + assert_equal(expected, cookie.value) + assert_equal(false, cookie.secure) + assert_nil(cookie.expires) + assert_nil(cookie.domain) + assert_equal('', cookie.path) + end + end + + + def test_cgi_core_maxcontentlength + @environ = { + 'REQUEST_METHOD' => 'POST', + 'CONTENT_LENGTH' => (64 * 1024 * 1024).to_s + } + ENV.update(@environ) + ex = assert_raise(StandardError) do + CGI.new + end + assert_equal("too large post data.", ex.message) + end if CGI.const_defined?(:MAX_CONTENT_LENGTH) + + + def test_cgi_core_out + @environ = { + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F', + 'HTTP_COOKIE' => '_session_id=12345; name1=val1&val2;', + 'SERVER_SOFTWARE' => 'Apache 2.2.0', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + } + ENV.update(@environ) + cgi = CGI.new + ## euc string + euc_str = "\270\253\244\355\241\242\277\315\244\254\245\264\245\337\244\316\244\350\244\246\244\300" + ## utf8 (not converted) + options = { 'charset'=>'utf8' } + $stdout = StringIO.new + cgi.out(options) { euc_str } + assert_nil(options['language']) + actual = $stdout.string + expected = "Content-Type: text/html; charset=utf8\r\n" + + "Content-Length: 22\r\n" + + "\r\n" + + euc_str + if defined?(::Encoding) + actual.force_encoding("ASCII-8BIT") + expected.force_encoding("ASCII-8BIT") + end + assert_equal(expected, actual) + ## language is keeped + options = { 'charset'=>'Shift_JIS', 'language'=>'en' } + $stdout = StringIO.new + cgi.out(options) { euc_str } + assert_equal('en', options['language']) + ## HEAD method + ENV['REQUEST_METHOD'] = 'HEAD' + options = { 'charset'=>'utf8' } + $stdout = StringIO.new + cgi.out(options) { euc_str } + actual = $stdout.string + expected = "Content-Type: text/html; charset=utf8\r\n" + + "Content-Length: 22\r\n" + + "\r\n" + assert_equal(expected, actual) + end + + + def test_cgi_core_print + @environ = { + 'REQUEST_METHOD' => 'GET', + } + ENV.update(@environ) + cgi = CGI.new + $stdout = StringIO.new + str = "foobar" + cgi.print(str) + expected = str + actual = $stdout.string + assert_equal(expected, actual) + end + + + def test_cgi_core_environs + @environ = { + 'REQUEST_METHOD' => 'GET', + } + ENV.update(@environ) + cgi = CGI.new + ## + list1 = %w[ AUTH_TYPE CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO + PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST + REMOTE_IDENT REMOTE_USER REQUEST_METHOD SCRIPT_NAME + SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE + HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING + HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM HTTP_HOST + HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT + ] + # list2 = %w[ CONTENT_LENGTH SERVER_PORT ] + ## string expected + list1.each do |name| + @environ[name] = "**#{name}**" + end + ENV.update(@environ) + list1.each do |name| + method = name.sub(/\AHTTP_/, '').downcase + actual = cgi.__send__ method + expected = "**#{name}**" + assert_equal(expected, actual) + end + ## integer expected + ENV['CONTENT_LENGTH'] = '123' + ENV['SERVER_PORT'] = '8080' + assert_equal(123, cgi.content_length) + assert_equal(8080, cgi.server_port) + ## raw cookie + ENV['HTTP_COOKIE'] = 'name1=val1' + ENV['HTTP_COOKIE2'] = 'name2=val2' + assert_equal('name1=val1', cgi.raw_cookie) + assert_equal('name2=val2', cgi.raw_cookie2) + end + + + def test_cgi_core_htmltype_header + @environ = { + 'REQUEST_METHOD' => 'GET', + } + ENV.update(@environ) + ## no htmltype + cgi = CGI.new + assert_raise(NoMethodError) do cgi.doctype end + assert_equal("Content-Type: text/html\r\n\r\n",cgi.header) + ## html3 + cgi = CGI.new('html3') + expected = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">' + assert_equal(expected, cgi.doctype) + assert_equal("Content-Type: text/html\r\n\r\n",cgi.header) + ## html4 + cgi = CGI.new('html4') + expected = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' + assert_equal(expected, cgi.doctype) + assert_equal("Content-Type: text/html\r\n\r\n",cgi.header) + ## html4 transitional + cgi = CGI.new('html4Tr') + expected = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' + assert_equal(expected, cgi.doctype) + assert_equal("Content-Type: text/html\r\n\r\n",cgi.header) + ## html4 frameset + cgi = CGI.new('html4Fr') + expected = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">' + assert_equal(expected, cgi.doctype) + assert_equal("Content-Type: text/html\r\n\r\n",cgi.header) + ## html5 + cgi = CGI.new('html5') + expected = '<!DOCTYPE HTML>' + assert_equal(expected, cgi.doctype) + assert_match(/^<HEADER><\/HEADER>$/i,cgi.header) + end + + + instance_methods.each do |method| + private method if method =~ /^test_(.*)/ && $1 != ENV['TEST'] + end if ENV['TEST'] + +end |