PageRenderTime 26ms CodeModel.GetById 5ms RepoModel.GetById 0ms app.codeStats 0ms

/test/cgi/test_cgi_util.rb

http://github.com/ruby/ruby
Ruby | 193 lines | 181 code | 11 blank | 1 comment | 0 complexity | ed65b91b45c0f80d3477c445db4982d4 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # frozen_string_literal: true
  2. require 'test/unit'
  3. require 'cgi'
  4. require 'stringio'
  5. require_relative 'update_env'
  6. class CGIUtilTest < Test::Unit::TestCase
  7. include CGI::Util
  8. include UpdateEnv
  9. def setup
  10. @environ = {}
  11. update_env(
  12. 'REQUEST_METHOD' => 'GET',
  13. 'SCRIPT_NAME' => nil,
  14. )
  15. @str1="&<>\" \xE3\x82\x86\xE3\x82\x93\xE3\x82\x86\xE3\x82\x93".dup
  16. @str1.force_encoding("UTF-8") if defined?(::Encoding)
  17. end
  18. def teardown
  19. ENV.update(@environ)
  20. end
  21. def test_cgi_escape
  22. assert_equal('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93', CGI.escape(@str1))
  23. assert_equal('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93'.ascii_only?, CGI.escape(@str1).ascii_only?) if defined?(::Encoding)
  24. end
  25. def test_cgi_escape_with_unreserved_characters
  26. assert_equal("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",
  27. CGI.escape("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"),
  28. "should not escape any unreserved characters, as per RFC3986 Section 2.3")
  29. end
  30. def test_cgi_escape_with_invalid_byte_sequence
  31. assert_nothing_raised(ArgumentError) do
  32. assert_equal('%C0%3C%3C', CGI.escape("\xC0\<\<".dup.force_encoding("UTF-8")))
  33. end
  34. end
  35. def test_cgi_escape_preserve_encoding
  36. assert_equal(Encoding::US_ASCII, CGI.escape("\xC0\<\<".dup.force_encoding("US-ASCII")).encoding)
  37. assert_equal(Encoding::ASCII_8BIT, CGI.escape("\xC0\<\<".dup.force_encoding("ASCII-8BIT")).encoding)
  38. assert_equal(Encoding::UTF_8, CGI.escape("\xC0\<\<".dup.force_encoding("UTF-8")).encoding)
  39. end
  40. def test_cgi_unescape
  41. str = CGI.unescape('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93')
  42. assert_equal(@str1, str)
  43. return unless defined?(::Encoding)
  44. assert_equal(@str1.encoding, str.encoding)
  45. assert_equal("\u{30E1 30E2 30EA 691C 7D22}", CGI.unescape("\u{30E1 30E2 30EA}%E6%A4%9C%E7%B4%A2"))
  46. end
  47. def test_cgi_unescape_preserve_encoding
  48. assert_equal(Encoding::US_ASCII, CGI.unescape("%C0%3C%3C".dup.force_encoding("US-ASCII")).encoding)
  49. assert_equal(Encoding::ASCII_8BIT, CGI.unescape("%C0%3C%3C".dup.force_encoding("ASCII-8BIT")).encoding)
  50. assert_equal(Encoding::UTF_8, CGI.unescape("%C0%3C%3C".dup.force_encoding("UTF-8")).encoding)
  51. end
  52. def test_cgi_unescape_accept_charset
  53. return unless defined?(::Encoding)
  54. assert_raise(TypeError) {CGI.unescape('', nil)}
  55. assert_separately(%w[-rcgi/util], "#{<<-"begin;"}\n#{<<-"end;"}")
  56. begin;
  57. assert_equal("", CGI.unescape(''))
  58. end;
  59. end
  60. def test_cgi_pretty
  61. assert_equal("<HTML>\n <BODY>\n </BODY>\n</HTML>\n",CGI.pretty("<HTML><BODY></BODY></HTML>"))
  62. assert_equal("<HTML>\n\t<BODY>\n\t</BODY>\n</HTML>\n",CGI.pretty("<HTML><BODY></BODY></HTML>","\t"))
  63. end
  64. def test_cgi_escapeHTML
  65. assert_equal("&#39;&amp;&quot;&gt;&lt;", CGI.escapeHTML("'&\"><"))
  66. end
  67. def test_cgi_escape_html_duplicated
  68. orig = "Ruby".dup.force_encoding("US-ASCII")
  69. str = CGI.escapeHTML(orig)
  70. assert_equal(orig, str)
  71. assert_not_same(orig, str)
  72. end
  73. def assert_cgi_escape_html_preserve_encoding(str, encoding)
  74. assert_equal(encoding, CGI.escapeHTML(str.dup.force_encoding(encoding)).encoding)
  75. end
  76. def test_cgi_escape_html_preserve_encoding
  77. Encoding.list do |enc|
  78. assert_cgi_escape_html_preserve_encoding("'&\"><", enc)
  79. assert_cgi_escape_html_preserve_encoding("Ruby", enc)
  80. end
  81. end
  82. def test_cgi_escape_html_dont_freeze
  83. assert_not_predicate CGI.escapeHTML("'&\"><".dup), :frozen?
  84. assert_not_predicate CGI.escapeHTML("'&\"><".freeze), :frozen?
  85. assert_not_predicate CGI.escapeHTML("Ruby".dup), :frozen?
  86. assert_not_predicate CGI.escapeHTML("Ruby".freeze), :frozen?
  87. end
  88. def test_cgi_unescapeHTML
  89. assert_equal("'&\"><", CGI.unescapeHTML("&#39;&amp;&quot;&gt;&lt;"))
  90. end
  91. def test_cgi_unescapeHTML_invalid
  92. assert_equal('&<&amp>&quot&abcdefghijklmn', CGI.unescapeHTML('&&lt;&amp&gt;&quot&abcdefghijklmn'))
  93. end
  94. Encoding.list.each do |enc|
  95. begin
  96. escaped = "&#39;&amp;&quot;&gt;&lt;".encode(enc)
  97. unescaped = "'&\"><".encode(enc)
  98. rescue Encoding::ConverterNotFoundError
  99. next
  100. else
  101. define_method("test_cgi_escapeHTML:#{enc.name}") do
  102. assert_equal(escaped, CGI.escapeHTML(unescaped))
  103. end
  104. define_method("test_cgi_unescapeHTML:#{enc.name}") do
  105. assert_equal(unescaped, CGI.unescapeHTML(escaped))
  106. end
  107. end
  108. end
  109. Encoding.list.each do |enc|
  110. next unless enc.ascii_compatible?
  111. begin
  112. escaped = "%25+%2B"
  113. unescaped = "% +".encode(enc)
  114. rescue Encoding::ConverterNotFoundError
  115. next
  116. else
  117. define_method("test_cgi_escape:#{enc.name}") do
  118. assert_equal(escaped, CGI.escape(unescaped))
  119. end
  120. define_method("test_cgi_unescape:#{enc.name}") do
  121. assert_equal(unescaped, CGI.unescape(escaped, enc))
  122. end
  123. end
  124. end
  125. def test_cgi_unescapeHTML_uppercasecharacter
  126. assert_equal("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86", CGI.unescapeHTML("&#x3042;&#x3044;&#X3046;"))
  127. end
  128. def test_cgi_include_escape
  129. assert_equal('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93', escape(@str1))
  130. end
  131. def test_cgi_include_escapeHTML
  132. assert_equal("&#39;&amp;&quot;&gt;&lt;", escapeHTML("'&\"><"))
  133. end
  134. def test_cgi_include_h
  135. assert_equal("&#39;&amp;&quot;&gt;&lt;", h("'&\"><"))
  136. end
  137. def test_cgi_include_unescape
  138. str = unescape('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93')
  139. assert_equal(@str1, str)
  140. return unless defined?(::Encoding)
  141. assert_equal(@str1.encoding, str.encoding)
  142. assert_equal("\u{30E1 30E2 30EA 691C 7D22}", unescape("\u{30E1 30E2 30EA}%E6%A4%9C%E7%B4%A2"))
  143. end
  144. def test_cgi_include_unescapeHTML
  145. assert_equal("'&\"><", unescapeHTML("&#39;&amp;&quot;&gt;&lt;"))
  146. end
  147. def test_cgi_escapeElement
  148. assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<BR><A HREF="url"></A>', "A", "IMG"))
  149. assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<BR><A HREF="url"></A>', ["A", "IMG"]))
  150. assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<BR><A HREF="url"></A>', "A", "IMG"))
  151. assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<BR><A HREF="url"></A>', ["A", "IMG"]))
  152. end
  153. def test_cgi_unescapeElement
  154. assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescapeElement(escapeHTML('<BR><A HREF="url"></A>'), "A", "IMG"))
  155. assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescapeElement(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]))
  156. assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), "A", "IMG"))
  157. assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]))
  158. end
  159. end