2 // UriBuilderTest.cs - NUnit Test Cases for System.UriBuilder
5 // Lawrence Pit (loz@cable.a2000.nl)
6 // Martin Willemoes Hansen (mwh@sysrq.dk)
8 // (C) 2003 Martin Willemoes Hansen
9 // Copyright (C) 2010 Novell, Inc (http://www.novell.com)
12 using NUnit.Framework;
14 using System.Reflection;
16 namespace MonoTests.System
19 public class UriBuilderTest
21 private UriBuilder b, b2, b3;
22 public bool IriParsing;
25 public void GetReady()
27 b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html");
29 //Make sure Uri static constructor is called
30 Uri.EscapeDataString ("");
32 FieldInfo iriParsingField = typeof (Uri).GetField ("s_IriParsing",
33 BindingFlags.Static | BindingFlags.GetField | BindingFlags.NonPublic);
34 if (iriParsingField != null)
35 IriParsing = (bool) iriParsingField.GetValue (null);
39 public void Constructor_Empty ()
41 b = new UriBuilder ();
42 Assert.AreEqual ("http", b.Scheme, "#1");
43 Assert.AreEqual ("localhost", b.Host, "#2");
44 Assert.AreEqual (-1, b.Port, "#4");
45 Assert.AreEqual (string.Empty, b.Query, "#5");
46 Assert.AreEqual (string.Empty, b.Fragment, "#6");
49 [Test] // ctor (string)
50 public void Constructor1 ()
52 b = new UriBuilder ("http://www.ximian.com:8001#test?name=50");
53 Assert.AreEqual ("#test?name=50", b.Fragment, "#A1");
54 Assert.AreEqual ("www.ximian.com", b.Host, "#A2");
55 Assert.AreEqual (string.Empty, b.Password, "#A3");
56 Assert.AreEqual ("/", b.Path, "#A4");
57 Assert.AreEqual (8001, b.Port, "#A5");
58 Assert.AreEqual (string.Empty, b.Query, "#A5");
59 Assert.AreEqual ("http", b.Scheme, "#A6");
60 Assert.AreEqual ("http://www.ximian.com:8001/#test?name=50", b.Uri.ToString (), "#A7");
61 Assert.AreEqual (string.Empty, b.UserName, "#A8");
63 b = new UriBuilder ("http://www.ximian.com?name=50#test");
64 Assert.AreEqual ("#test", b.Fragment, "#B1");
65 Assert.AreEqual ("www.ximian.com", b.Host, "#B2");
66 Assert.AreEqual (string.Empty, b.Password, "#B3");
67 Assert.AreEqual ("/", b.Path, "#B4");
68 Assert.AreEqual (80, b.Port, "#B5");
69 Assert.AreEqual ("?name=50", b.Query, "#B5");
70 Assert.AreEqual ("http", b.Scheme, "#B6");
71 Assert.AreEqual ("http://www.ximian.com/?name=50#test", b.Uri.ToString (), "#B7");
72 Assert.AreEqual (string.Empty, b.UserName, "#B8");
75 [Test] // ctor (string)
76 public void Constructor1_Uri_Null ()
79 new UriBuilder ((string) null);
81 } catch (ArgumentNullException ex) {
82 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
83 Assert.IsNull (ex.InnerException, "#3");
84 Assert.IsNotNull (ex.Message, "#4");
85 Assert.IsNotNull (ex.ParamName, "#5");
86 Assert.AreEqual ("uriString", ex.ParamName, "#6");
91 [ExpectedException (typeof (ArgumentNullException))]
92 public void Constructor2_Uri_Null ()
94 new UriBuilder ((Uri) null);
98 public void Constructor_5 ()
100 b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html", "#extras");
104 [ExpectedException (typeof (ArgumentException))]
105 public void Constructor_5_BadExtraValue ()
107 b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html", "extras");
108 // should have thrown an ArgumentException because extraValue must start with '?' or '#' character.
112 public void Constructor_StringStringInt ()
114 UriBuilder ub = new UriBuilder ("http", "www.mono-project.com", 80);
115 Assert.AreEqual ("http://www.mono-project.com/", ub.Uri.AbsoluteUri, "Uri.AbsoluteUri");
119 [ExpectedException (typeof (InvalidOperationException))]
120 public void Constructor_RelativeUri ()
122 Uri relative = new Uri ("../dir/subdir/file", UriKind.RelativeOrAbsolute);
123 UriBuilder ub = new UriBuilder (relative);
127 public void UserInfo ()
129 string s = "mailto://myname:mypwd@contoso.com?subject=hello";
130 b = new UriBuilder (s);
131 Assert.AreEqual (s, b.ToString (), "1.ToString");
132 Assert.AreEqual (string.Empty, b.UserName, "1.UserName");
133 Assert.AreEqual (string.Empty, b.Password, "1.Password");
134 Assert.AreEqual ("//myname:mypwd@contoso.com", b.Uri.LocalPath, "1.Uri.LocalPath");
136 // weird ?caching? issue, UserInfo is not updated if we look at the value of UserName before setting Password
137 b = new UriBuilder ("mailto", "contoso.com");
138 b.UserName = "myname";
139 Assert.AreEqual ("myname", b.Uri.UserInfo, "2.UserName");
140 b.Password = "mypwd";
141 Assert.AreEqual ("myname:mypwd", b.Uri.UserInfo, "2.Password");
142 Assert.AreEqual ("/", b.Uri.LocalPath, "2.Uri.LocalPath");
144 b = new UriBuilder ("mailto", "contoso.com");
145 b.UserName = "myname";
146 b.Password = "mypwd";
147 Assert.AreEqual ("myname:mypwd", b.Uri.UserInfo, "3.Uri.UserInfo");
148 Assert.AreEqual ("/", b.Uri.LocalPath, "3.Uri.LocalPath");
154 b.Path = ((char) 0xa9) + " 2002";
155 Assert.AreEqual ("%C2%A9%202002", b.Path);
159 [ExpectedException (typeof (ArgumentOutOfRangeException))]
160 public void BadPort1 ()
166 public void DefaultPort ()
169 Assert.AreEqual (-1, b.Port, "#1");
170 Assert.AreEqual ("http://www.ximian.com/foo/bar/index.html", b.ToString (), "#2");
176 b.Query = ((char) 0xa9) + " 2002";
177 Assert.AreEqual ("?\xA9 2002", b.Query, "#1");
178 Assert.AreEqual (string.Empty, b.Fragment, "#2");
180 Assert.AreEqual ("?test", b.Query, "#3");
182 Assert.AreEqual (string.Empty, b.Query, "#4");
184 Assert.AreEqual ("#test", b.Fragment, "#5");
186 Assert.AreEqual ("#test", b.Fragment, "#6");
187 Assert.AreEqual ("?name", b.Query, "#7");
189 Assert.AreEqual ("#run", b.Fragment, "#8");
191 Assert.AreEqual ("#run", b.Fragment, "#9");
192 Assert.AreEqual (string.Empty, b.Query, "#10");
196 public void Fragment ()
198 b.Fragment = ((char) 0xa9) + " 2002";
199 Assert.AreEqual ("#\xA9 2002", b.Fragment, "#1");
200 Assert.AreEqual (string.Empty, b.Query, "#2");
201 b.Fragment = "#test";
202 Assert.AreEqual ("#test", b.Fragment, "#3");
204 Assert.AreEqual (String.Empty, b.Fragment, "#4");
206 Assert.AreEqual ("?name", b.Query, "#5");
208 Assert.AreEqual ("?name", b.Query, "#6");
209 Assert.AreEqual (string.Empty, b.Fragment, "#7");
213 public void Scheme ()
216 Assert.AreEqual ("http", b.Scheme, "#1");
218 Assert.AreEqual ("http", b.Scheme, "#2");
219 b.Scheme = "http://";
220 Assert.AreEqual ("http", b.Scheme, "#3");
221 b.Scheme = "http://foo/bar";
222 Assert.AreEqual ("http", b.Scheme, "#4");
223 b.Scheme = "mailto:";
224 Assert.AreEqual ("mailto", b.Scheme, "#5");
225 b.Scheme = "unknown";
226 Assert.AreEqual ("unknown", b.Scheme, "#6");
227 b.Scheme = "unknown://";
228 Assert.AreEqual ("unknown", b.Scheme, "#7");
232 public void Equals ()
234 b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html?item=1");
235 Assert.AreEqual ("foo/bar/index.html%3Fitem=1", b.Path, "1.Path");
236 Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html%3Fitem=1", b.ToString (), "1.ToString");
238 b2 = new UriBuilder ("http", "www.ximian.com", 80, "/foo/bar/index.html", "?item=1");
239 Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html?item=1", b2.ToString (), "2.ToString");
241 b3 = new UriBuilder (new Uri ("http://www.ximian.com/foo/bar/index.html?item=1"));
242 Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html?item=1", b3.ToString (), "3.ToString");
244 Assert.IsFalse (b.Equals (b2), "#1");
245 Assert.IsFalse (b.Uri.Equals (b2.Uri), "#2");
246 Assert.IsFalse (b.Equals (b3), "#3");
247 Assert.IsFalse (b3.Equals (b), "#4");
248 Assert.IsTrue (b2.Equals (b3), "#5");
252 public void ToStringTest ()
254 Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html", b.ToString (), "#1");
255 Assert.AreEqual ("http://www.ximian.com/foo/bar/index.html", b.Uri.ToString (), "#2");
259 public void EmptyQuery () // bug 57082
261 b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", null);
262 string noquery = "http://www.ximian.com/lalala/lelele.aspx";
263 Assert.AreEqual (noquery, b.Uri.ToString (), "#1");
264 b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "?");
265 Assert.AreEqual (noquery, b.Uri.ToString (), "#2");
266 b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "??");
267 Assert.AreEqual (noquery + "?", b.Uri.ToString (), "#3");
268 b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "?something");
269 Assert.AreEqual (noquery + "?something", b.Uri.ToString (), "#4");
273 public void TestToString76501 ()
275 UriBuilder ub = new UriBuilder (
276 "http://mondomaine/trucmuche/login.aspx");
277 ub.Query = ub.Query.TrimStart (new char [] {'?'}) + "&ticket=bla";
278 Assert.IsTrue (ub.ToString ().IndexOf ("80//") < 0);
282 public void TestAppendFragment ()
284 UriBuilder uri = new UriBuilder ("http://www.mono-project.com/Main_Page");
285 uri.Fragment = "Features";
286 Assert.AreEqual ("#Features", uri.Fragment, "#1");
287 Assert.AreEqual ("http://www.mono-project.com/Main_Page#Features", uri.Uri.ToString (), "#2");
291 public void IPv6_Host ()
293 UriBuilder ub = new UriBuilder ("http", "[1:2:3:4:5:6:7:8]", 8080, "/dir/subdir/file");
294 Assert.AreEqual ("[1:2:3:4:5:6:7:8]", ub.Host, "Host.1");
296 Assert.AreEqual ("[1:2:3:4:5:6:7:8]", ub.Uri.Host, "Uri.Host");
298 Assert.AreEqual ("[0001:0002:0003:0004:0005:0006:0007:0008]", ub.Uri.Host, "Uri.Host");
299 // once the Uri is created then some builder properties may change
300 Assert.AreEqual ("[0001:0002:0003:0004:0005:0006:0007:0008]", ub.Host, "Host.2");
305 public void IPv6_Host_IncompleteAddress ()
307 UriBuilder ub = new UriBuilder ("http", "1:2:3:4:5:6:7:8", 8080, "/dir/subdir/file");
308 Assert.AreEqual ("[1:2:3:4:5:6:7:8]", ub.Host, "1.Host");
309 Assert.AreEqual ("http://[1:2:3:4:5:6:7:8]:8080/dir/subdir/file", ub.ToString (), "1.ToString ()");
311 ub = new UriBuilder ("http", "1:", 8080, "/dir/subdir/file");
312 Assert.AreEqual ("[1:]", ub.Host, "2.Host");
313 Assert.AreEqual ("http://[1:]:8080/dir/subdir/file", ub.ToString (), "2.ToString ()");
315 ub = new UriBuilder ("http", "[1:", 8080, "/dir/subdir/file");
316 Assert.AreEqual ("[1:", ub.Host, "3.Host");
317 Assert.AreEqual ("http://[1::8080/dir/subdir/file", ub.ToString (), "3.ToString ()");
319 ub = new UriBuilder ("http", "1:2]", 8080, "/dir/subdir/file");
320 Assert.AreEqual ("[1:2]]", ub.Host, "4.Host");
321 Assert.AreEqual ("http://[1:2]]:8080/dir/subdir/file", ub.ToString (), "4.ToString ()");
325 public void Path_UriAbsolutePath_Path ()
327 UriBuilder ub = new UriBuilder ("http", "127.0.0.1", 80, "dir/subdir/file");
328 Assert.AreEqual ("dir/subdir/file", ub.Path, "Path.1");
329 Assert.AreEqual ("/dir/subdir/file", ub.Uri.AbsolutePath, "Uri.AbsolutePath");
330 // once the Uri is created then some builder properties may change
331 Assert.AreEqual ("/dir/subdir/file", ub.Path, "Path.2");
335 public void UnparsableUri ()
337 // some URI can't be parsed by System.Uri but are accepted by UriBuilder
339 string uri = "www.mono-project.com";
340 Assert.IsFalse (Uri.TryCreate (uri, UriKind.Absolute, out u), "1.Uri.TryCreate");
341 UriBuilder ub = new UriBuilder (uri);
342 Assert.AreEqual ("www.mono-project.com", ub.Host, "1.Host");
343 Assert.AreEqual ("http", ub.Scheme, "1.Scheme");
344 Assert.AreEqual (80, ub.Port, "1.Port");
345 Assert.AreEqual ("/", ub.Path, "1.Path");
347 // always assume http, port 80
348 uri = "ftp.novell.com/dir/subdir/file";
349 ub = new UriBuilder (uri);
350 Assert.IsFalse (Uri.TryCreate (uri, UriKind.Absolute, out u), "2.Uri.TryCreate");
351 Assert.AreEqual ("ftp.novell.com", ub.Host, "2.Host");
352 Assert.AreEqual ("http", ub.Scheme, "2.Scheme");
353 Assert.AreEqual (80, ub.Port, "2.Port");
354 Assert.AreEqual ("/dir/subdir/file", ub.Path, "2.Path");
358 public void AspNetRedirectUsage_Old ()
360 Uri uri = new Uri ("http://192.168.0.21:80/WebResource.axd?d=AAAAAAAAAAEAAAAAAAAAAA2");
361 UriBuilder ub = new UriBuilder (uri);
362 ub.Path = "error404.aspx?aspxerrorpath=/WebResource.axd";
367 // a bug in older UriBuilder did not encode the ? - existing ASP.NET depends on buggy behavior
368 Assert.AreEqual ("http://192.168.0.21/error404.aspx%3Faspxerrorpath=/WebResource.axd", ub.Uri.ToString ());
372 public void AspNetRedirectUsage_New ()
374 string path = "error404.aspx?aspxerrorpath=/WebResource.axd";
375 Uri uri = new Uri ("http://192.168.0.21:80/WebResource.axd?d=AAAAAAAAAAEAAAAAAAAAAA2");
376 UriBuilder ub = new UriBuilder (uri);
377 int qpos = path.IndexOf ('?');
378 ub.Path = path.Substring (0, qpos);
381 ub.Query = path.Substring (qpos + 1);
383 // this is what ASP.NET really means (the ?)
384 Assert.AreEqual ("http://192.168.0.21/error404.aspx?aspxerrorpath=/WebResource.axd", ub.Uri.ToString ());
388 public void NoHostname ()
390 UriBuilder ub = new UriBuilder ("about", null, -1, "config");
391 Assert.AreEqual ("about:config", ub.ToString ());