1
// ========================================================================
2
// Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.
3
// ------------------------------------------------------------------------
4
// Licensed under the Apache License, Version 2.0 (the "License");
5
// you may not use this file except in compliance with the License.
6
// You may obtain a copy of the License at
7
// http://www.apache.org/licenses/LICENSE-2.0
8
// Unless required by applicable law or agreed to in writing, software
9
// distributed under the License is distributed on an "AS IS" BASIS,
10
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
// See the License for the specific language governing permissions and
12
// limitations under the License.
13
// ========================================================================
15
package org.mortbay.util;
17
import junit.framework.TestSuite;
20
/* ------------------------------------------------------------ */
22
* @author Greg Wilkins (gregw)
24
public class URITest extends junit.framework.TestCase
26
public URITest(String name)
31
public static junit.framework.Test suite() {
32
TestSuite suite = new TestSuite(URITest.class);
36
/* ------------------------------------------------------------ */
39
public static void main(String[] args)
41
junit.textui.TestRunner.run(suite());
44
/* ------------------------------------------------------------ */
45
public void testEncodePath()
47
// test basic encode/decode
48
StringBuffer buf = new StringBuffer();
52
URIUtil.encodePath(buf,"/foo%23+;,:=/b a r/?info ");
53
assertEquals("/foo%2523+%3B,:=/b%20a%20r/%3Finfo%20",buf.toString());
55
assertEquals("/foo%2523+%3B,:=/b%20a%20r/%3Finfo%20",URIUtil.encodePath("/foo%23+;,:=/b a r/?info "));
58
URIUtil.encodeString(buf,"foo%23;,:=b a r",";,= ");
59
assertEquals("foo%2523%3b%2c:%3db%20a%20r",buf.toString());
62
URIUtil.encodePath(buf,"/context/'list'/\"me\"/;<script>window.alert('xss');</script>");
63
assertEquals("/context/%27list%27/%22me%22/%3B%3Cscript%3Ewindow.alert(%27xss%27)%3B%3C/script%3E", buf.toString());
66
/* ------------------------------------------------------------ */
67
public void testDecodePath()
69
assertEquals("foo%23;,:=b a r",URIUtil.decodePath("foo%2523%3b%2c:%3db%20a%20r"));
70
assertEquals("foo%23;,:=b a r=",URIUtil.decodePath("xxxfoo%2523%3b%2c:%3db%20a%20r%3Dxxx".getBytes(),3,30));
71
assertEquals("fää%23;,:=b a r=",URIUtil.decodePath("fää%2523%3b%2c:%3db%20a%20r%3D"));
72
assertEquals("f\u0629\u0629%23;,:=b a r",URIUtil.decodePath("f%d8%a9%d8%a9%2523%3b%2c:%3db%20a%20r"));
75
/* ------------------------------------------------------------ */
76
public void testAddPaths()
78
assertEquals("null+null", URIUtil.addPaths(null,null),null);
79
assertEquals("null+", URIUtil.addPaths(null,""),"");
80
assertEquals("null+bbb", URIUtil.addPaths(null,"bbb"),"bbb");
81
assertEquals("null+/", URIUtil.addPaths(null,"/"),"/");
82
assertEquals("null+/bbb", URIUtil.addPaths(null,"/bbb"),"/bbb");
84
assertEquals("+null", URIUtil.addPaths("",null),"");
85
assertEquals("+", URIUtil.addPaths("",""),"");
86
assertEquals("+bbb", URIUtil.addPaths("","bbb"),"bbb");
87
assertEquals("+/", URIUtil.addPaths("","/"),"/");
88
assertEquals("+/bbb", URIUtil.addPaths("","/bbb"),"/bbb");
90
assertEquals("aaa+null", URIUtil.addPaths("aaa",null),"aaa");
91
assertEquals("aaa+", URIUtil.addPaths("aaa",""),"aaa");
92
assertEquals("aaa+bbb", URIUtil.addPaths("aaa","bbb"),"aaa/bbb");
93
assertEquals("aaa+/", URIUtil.addPaths("aaa","/"),"aaa/");
94
assertEquals("aaa+/bbb", URIUtil.addPaths("aaa","/bbb"),"aaa/bbb");
96
assertEquals("/+null", URIUtil.addPaths("/",null),"/");
97
assertEquals("/+", URIUtil.addPaths("/",""),"/");
98
assertEquals("/+bbb", URIUtil.addPaths("/","bbb"),"/bbb");
99
assertEquals("/+/", URIUtil.addPaths("/","/"),"/");
100
assertEquals("/+/bbb", URIUtil.addPaths("/","/bbb"),"/bbb");
102
assertEquals("aaa/+null", URIUtil.addPaths("aaa/",null),"aaa/");
103
assertEquals("aaa/+", URIUtil.addPaths("aaa/",""),"aaa/");
104
assertEquals("aaa/+bbb", URIUtil.addPaths("aaa/","bbb"),"aaa/bbb");
105
assertEquals("aaa/+/", URIUtil.addPaths("aaa/","/"),"aaa/");
106
assertEquals("aaa/+/bbb", URIUtil.addPaths("aaa/","/bbb"),"aaa/bbb");
108
assertEquals(";JS+null", URIUtil.addPaths(";JS",null),";JS");
109
assertEquals(";JS+", URIUtil.addPaths(";JS",""),";JS");
110
assertEquals(";JS+bbb", URIUtil.addPaths(";JS","bbb"),"bbb;JS");
111
assertEquals(";JS+/", URIUtil.addPaths(";JS","/"),"/;JS");
112
assertEquals(";JS+/bbb", URIUtil.addPaths(";JS","/bbb"),"/bbb;JS");
114
assertEquals("aaa;JS+null", URIUtil.addPaths("aaa;JS",null),"aaa;JS");
115
assertEquals("aaa;JS+", URIUtil.addPaths("aaa;JS",""),"aaa;JS");
116
assertEquals("aaa;JS+bbb", URIUtil.addPaths("aaa;JS","bbb"),"aaa/bbb;JS");
117
assertEquals("aaa;JS+/", URIUtil.addPaths("aaa;JS","/"),"aaa/;JS");
118
assertEquals("aaa;JS+/bbb", URIUtil.addPaths("aaa;JS","/bbb"),"aaa/bbb;JS");
120
assertEquals("aaa;JS+null", URIUtil.addPaths("aaa/;JS",null),"aaa/;JS");
121
assertEquals("aaa;JS+", URIUtil.addPaths("aaa/;JS",""),"aaa/;JS");
122
assertEquals("aaa;JS+bbb", URIUtil.addPaths("aaa/;JS","bbb"),"aaa/bbb;JS");
123
assertEquals("aaa;JS+/", URIUtil.addPaths("aaa/;JS","/"),"aaa/;JS");
124
assertEquals("aaa;JS+/bbb", URIUtil.addPaths("aaa/;JS","/bbb"),"aaa/bbb;JS");
126
assertEquals("?A=1+null", URIUtil.addPaths("?A=1",null),"?A=1");
127
assertEquals("?A=1+", URIUtil.addPaths("?A=1",""),"?A=1");
128
assertEquals("?A=1+bbb", URIUtil.addPaths("?A=1","bbb"),"bbb?A=1");
129
assertEquals("?A=1+/", URIUtil.addPaths("?A=1","/"),"/?A=1");
130
assertEquals("?A=1+/bbb", URIUtil.addPaths("?A=1","/bbb"),"/bbb?A=1");
132
assertEquals("aaa?A=1+null", URIUtil.addPaths("aaa?A=1",null),"aaa?A=1");
133
assertEquals("aaa?A=1+", URIUtil.addPaths("aaa?A=1",""),"aaa?A=1");
134
assertEquals("aaa?A=1+bbb", URIUtil.addPaths("aaa?A=1","bbb"),"aaa/bbb?A=1");
135
assertEquals("aaa?A=1+/", URIUtil.addPaths("aaa?A=1","/"),"aaa/?A=1");
136
assertEquals("aaa?A=1+/bbb", URIUtil.addPaths("aaa?A=1","/bbb"),"aaa/bbb?A=1");
138
assertEquals("aaa?A=1+null", URIUtil.addPaths("aaa/?A=1",null),"aaa/?A=1");
139
assertEquals("aaa?A=1+", URIUtil.addPaths("aaa/?A=1",""),"aaa/?A=1");
140
assertEquals("aaa?A=1+bbb", URIUtil.addPaths("aaa/?A=1","bbb"),"aaa/bbb?A=1");
141
assertEquals("aaa?A=1+/", URIUtil.addPaths("aaa/?A=1","/"),"aaa/?A=1");
142
assertEquals("aaa?A=1+/bbb", URIUtil.addPaths("aaa/?A=1","/bbb"),"aaa/bbb?A=1");
144
assertEquals(";JS?A=1+null", URIUtil.addPaths(";JS?A=1",null),";JS?A=1");
145
assertEquals(";JS?A=1+", URIUtil.addPaths(";JS?A=1",""),";JS?A=1");
146
assertEquals(";JS?A=1+bbb", URIUtil.addPaths(";JS?A=1","bbb"),"bbb;JS?A=1");
147
assertEquals(";JS?A=1+/", URIUtil.addPaths(";JS?A=1","/"),"/;JS?A=1");
148
assertEquals(";JS?A=1+/bbb", URIUtil.addPaths(";JS?A=1","/bbb"),"/bbb;JS?A=1");
150
assertEquals("aaa;JS?A=1+null", URIUtil.addPaths("aaa;JS?A=1",null),"aaa;JS?A=1");
151
assertEquals("aaa;JS?A=1+", URIUtil.addPaths("aaa;JS?A=1",""),"aaa;JS?A=1");
152
assertEquals("aaa;JS?A=1+bbb", URIUtil.addPaths("aaa;JS?A=1","bbb"),"aaa/bbb;JS?A=1");
153
assertEquals("aaa;JS?A=1+/", URIUtil.addPaths("aaa;JS?A=1","/"),"aaa/;JS?A=1");
154
assertEquals("aaa;JS?A=1+/bbb", URIUtil.addPaths("aaa;JS?A=1","/bbb"),"aaa/bbb;JS?A=1");
156
assertEquals("aaa;JS?A=1+null", URIUtil.addPaths("aaa/;JS?A=1",null),"aaa/;JS?A=1");
157
assertEquals("aaa;JS?A=1+", URIUtil.addPaths("aaa/;JS?A=1",""),"aaa/;JS?A=1");
158
assertEquals("aaa;JS?A=1+bbb", URIUtil.addPaths("aaa/;JS?A=1","bbb"),"aaa/bbb;JS?A=1");
159
assertEquals("aaa;JS?A=1+/", URIUtil.addPaths("aaa/;JS?A=1","/"),"aaa/;JS?A=1");
160
assertEquals("aaa;JS?A=1+/bbb", URIUtil.addPaths("aaa/;JS?A=1","/bbb"),"aaa/bbb;JS?A=1");
164
/* ------------------------------------------------------------ */
165
public void testCompactPath()
167
assertEquals("/foo/bar", URIUtil.compactPath("/foo/bar"));
168
assertEquals("/foo/bar?a=b//c", URIUtil.compactPath("/foo/bar?a=b//c"));
170
assertEquals("/foo/bar", URIUtil.compactPath("//foo//bar"));
171
assertEquals("/foo/bar?a=b//c", URIUtil.compactPath("//foo//bar?a=b//c"));
173
assertEquals("/foo/bar", URIUtil.compactPath("/foo///bar"));
174
assertEquals("/foo/bar?a=b//c", URIUtil.compactPath("/foo///bar?a=b//c"));
177
/* ------------------------------------------------------------ */
178
public void testParentPath()
180
assertEquals("parent /aaa/bbb/","/aaa/", URIUtil.parentPath("/aaa/bbb/"));
181
assertEquals("parent /aaa/bbb","/aaa/", URIUtil.parentPath("/aaa/bbb"));
182
assertEquals("parent /aaa/","/", URIUtil.parentPath("/aaa/"));
183
assertEquals("parent /aaa","/", URIUtil.parentPath("/aaa"));
184
assertEquals("parent /",null, URIUtil.parentPath("/"));
185
assertEquals("parent null",null, URIUtil.parentPath(null));
189
/* ------------------------------------------------------------ */
190
public void testCanonicalPath()
192
String[][] canonical =
194
{"/aaa/bbb/","/aaa/bbb/"},
195
{"/aaa//bbb/","/aaa//bbb/"},
196
{"/aaa///bbb/","/aaa///bbb/"},
197
{"/aaa/./bbb/","/aaa/bbb/"},
198
{"/aaa/../bbb/","/bbb/"},
199
{"/aaa/./../bbb/","/bbb/"},
200
{"/aaa/bbb/ccc/../../ddd/","/aaa/ddd/"},
202
{"./aaa/../bbb/","bbb/"},
210
{"aaa/bbb","aaa/bbb"},
213
{"/aaa/bbb","/aaa/bbb"},
214
{"/aaa//bbb","/aaa//bbb"},
215
{"/aaa/./bbb","/aaa/bbb"},
216
{"/aaa/../bbb","/bbb"},
217
{"/aaa/./../bbb","/bbb"},
219
{"./aaa/../bbb","bbb"},
220
{"aaa/bbb/..","aaa/"},
221
{"aaa/bbb/../","aaa/"},
222
{"/aaa//../bbb","/aaa/bbb"},
223
{"/aaa/./../bbb","/bbb"},
230
{"/foo/bar/../../..",null},
238
{"/foo/../bar//","/bar//"},
241
for (int t=0;t<canonical.length;t++)
242
assertEquals( "canonical "+canonical[t][0],
244
URIUtil.canonicalPath(canonical[t][0])