1require "test/unit"
2require "webrick/httputils"
3
4class TestWEBrickHTTPUtils < Test::Unit::TestCase
5  include WEBrick::HTTPUtils
6
7  def test_normilize_path
8    assert_equal("/foo",       normalize_path("/foo"))
9    assert_equal("/foo/bar/",  normalize_path("/foo/bar/"))
10
11    assert_equal("/",          normalize_path("/foo/../"))
12    assert_equal("/",          normalize_path("/foo/.."))
13    assert_equal("/",          normalize_path("/foo/bar/../../"))
14    assert_equal("/",          normalize_path("/foo/bar/../.."))
15    assert_equal("/",          normalize_path("/foo/bar/../.."))
16    assert_equal("/baz",       normalize_path("/foo/bar/../../baz"))
17    assert_equal("/baz",       normalize_path("/foo/../bar/../baz"))
18    assert_equal("/baz/",      normalize_path("/foo/../bar/../baz/"))
19    assert_equal("/...",       normalize_path("/bar/../..."))
20    assert_equal("/.../",      normalize_path("/bar/../.../"))
21
22    assert_equal("/foo/",      normalize_path("/foo/./"))
23    assert_equal("/foo/",      normalize_path("/foo/."))
24    assert_equal("/foo/",      normalize_path("/foo/././"))
25    assert_equal("/foo/",      normalize_path("/foo/./."))
26    assert_equal("/foo/bar",   normalize_path("/foo/./bar"))
27    assert_equal("/foo/bar/",  normalize_path("/foo/./bar/."))
28    assert_equal("/foo/bar/",  normalize_path("/./././foo/./bar/."))
29
30    assert_equal("/foo/bar/",  normalize_path("//foo///.//bar/.///.//"))
31    assert_equal("/",          normalize_path("//foo///..///bar/.///..//.//"))
32
33    assert_raise(RuntimeError){ normalize_path("foo/bar") }
34    assert_raise(RuntimeError){ normalize_path("..") }
35    assert_raise(RuntimeError){ normalize_path("/..") }
36    assert_raise(RuntimeError){ normalize_path("/./..") }
37    assert_raise(RuntimeError){ normalize_path("/./../") }
38    assert_raise(RuntimeError){ normalize_path("/./../..") }
39    assert_raise(RuntimeError){ normalize_path("/./../../") }
40    assert_raise(RuntimeError){ normalize_path("/./../") }
41    assert_raise(RuntimeError){ normalize_path("/../..") }
42    assert_raise(RuntimeError){ normalize_path("/../../") }
43    assert_raise(RuntimeError){ normalize_path("/../../..") }
44    assert_raise(RuntimeError){ normalize_path("/../../../") }
45    assert_raise(RuntimeError){ normalize_path("/../foo/../") }
46    assert_raise(RuntimeError){ normalize_path("/../foo/../../") }
47    assert_raise(RuntimeError){ normalize_path("/foo/bar/../../../../") }
48    assert_raise(RuntimeError){ normalize_path("/foo/../bar/../../") }
49    assert_raise(RuntimeError){ normalize_path("/./../bar/") }
50    assert_raise(RuntimeError){ normalize_path("/./../") }
51  end
52
53  def test_split_header_value
54    assert_equal(['foo', 'bar'], split_header_value('foo, bar'))
55    assert_equal(['"foo"', 'bar'], split_header_value('"foo", bar'))
56    assert_equal(['foo', '"bar"'], split_header_value('foo, "bar"'))
57    assert_equal(['*'], split_header_value('*'))
58    assert_equal(['W/"xyzzy"', 'W/"r2d2xxxx"', 'W/"c3piozzzz"'],
59                 split_header_value('W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"'))
60  end
61
62  def test_escape
63    assert_equal("/foo/bar", escape("/foo/bar"))
64    assert_equal("/~foo/bar", escape("/~foo/bar"))
65    assert_equal("/~foo%20bar", escape("/~foo bar"))
66    assert_equal("/~foo%20bar", escape("/~foo bar"))
67    assert_equal("/~foo%09bar", escape("/~foo\tbar"))
68    assert_equal("/~foo+bar", escape("/~foo+bar"))
69    bug8425 = '[Bug #8425] [ruby-core:55052]'
70    assert_nothing_raised(ArgumentError, Encoding::CompatibilityError, bug8425) {
71      assert_equal("%E3%83%AB%E3%83%93%E3%83%BC%E3%81%95%E3%82%93", escape("\u{30EB 30D3 30FC 3055 3093}"))
72    }
73  end
74
75  def test_escape_form
76    assert_equal("%2Ffoo%2Fbar", escape_form("/foo/bar"))
77    assert_equal("%2F~foo%2Fbar", escape_form("/~foo/bar"))
78    assert_equal("%2F~foo+bar", escape_form("/~foo bar"))
79    assert_equal("%2F~foo+%2B+bar", escape_form("/~foo + bar"))
80  end
81
82  def test_unescape
83    assert_equal("/foo/bar", unescape("%2ffoo%2fbar"))
84    assert_equal("/~foo/bar", unescape("/%7efoo/bar"))
85    assert_equal("/~foo/bar", unescape("%2f%7efoo%2fbar"))
86    assert_equal("/~foo+bar", unescape("/%7efoo+bar"))
87  end
88
89  def test_unescape_form
90    assert_equal("//foo/bar", unescape_form("/%2Ffoo/bar"))
91    assert_equal("//foo/bar baz", unescape_form("/%2Ffoo/bar+baz"))
92    assert_equal("/~foo/bar baz", unescape_form("/%7Efoo/bar+baz"))
93  end
94
95  def test_escape_path
96    assert_equal("/foo/bar", escape_path("/foo/bar"))
97    assert_equal("/foo/bar/", escape_path("/foo/bar/"))
98    assert_equal("/%25foo/bar/", escape_path("/%foo/bar/"))
99  end
100end
101