-//\r
-// UriBuilderTest.cs - NUnit Test Cases for System.UriBuilder\r
-//\r
-// Authors:\r
-// Lawrence Pit (loz@cable.a2000.nl)\r
-// Martin Willemoes Hansen (mwh@sysrq.dk)\r
-//\r
-// (C) 2003 Martin Willemoes Hansen\r
-//\r
-\r
-using NUnit.Framework;\r
-using System;\r
-\r
-namespace MonoTests.System\r
-{\r
- [TestFixture]\r
- public class UriBuilderTest \r
- {\r
- private UriBuilder b, b2, b3;\r
- \r
- [SetUp]\r
- public void GetReady()\r
- {\r
- b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html");\r
- }\r
-\r
- [Test]\r
- public void Constructors ()\r
- {\r
- b = new UriBuilder ();\r
- Assertion.AssertEquals ("#1", "http", b.Scheme);\r
- Assertion.AssertEquals ("#2", "loopback", b.Host);\r
- Assertion.AssertEquals ("#3", -1, b.Port);\r
- \r
- try {\r
- b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html", "extras");\r
- Assertion.Fail ("#4 should have thrown an ArgumentException because extraValue must start with '?' or '#' character.");\r
- } catch (ArgumentException) {}\r
- \r
- b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html", "#extras");\r
- }\r
- \r
- [Test]\r
- public void UserInfo ()\r
- { \r
- b = new UriBuilder ("mailto://myname:mypwd@contoso.com?subject=hello");\r
- Assertion.AssertEquals ("#1", "myname", b.UserName);\r
- Assertion.AssertEquals ("#2", "mypwd", b.Password);\r
- \r
- b = new UriBuilder ("mailto:", "contoso.com");\r
- b.UserName = "myname";\r
- b.Password = "mypwd";\r
- Assertion.AssertEquals ("#3: known to fail with ms.net.", "myname:mypwd", b.Uri.UserInfo);\r
- }\r
-\r
- [Test]\r
- public void Path ()\r
- { \r
- b.Path = ((char) 0xa9) + " 2002";\r
- Assertion.AssertEquals ("#1: known to fail with ms.net, should at least return a slash.", "/%A9%202002", b.Path); \r
- } \r
- \r
- [Test]\r
- [ExpectedException (typeof (ArgumentOutOfRangeException))]\r
- public void BadPort1 ()\r
- {\r
- b.Port = -12345;\r
- }\r
-\r
- [Test]\r
- [ExpectedException (typeof (ArgumentOutOfRangeException))]\r
- public void BadPort3 ()\r
- {\r
- b.Port = -1;\r
- }\r
-\r
- [Test]\r
- public void Query ()\r
- {\r
- b.Query = ((char) 0xa9) + " 2002";\r
- Assertion.AssertEquals ("#1: known to fail with ms.net, should've been escaped.", "?%A9%202002", b.Query); \r
- Assertion.AssertEquals ("#2", String.Empty, b.Fragment);\r
- b.Query = "?test";\r
- Assertion.AssertEquals ("#3", "??test", b.Query);\r
- b.Query = null;\r
- Assertion.AssertEquals ("#4", String.Empty, b.Query);\r
- }\r
- \r
- [Test]\r
- public void Fragment ()\r
- {\r
- b.Fragment = ((char) 0xa9) + " 2002";\r
- Assertion.AssertEquals ("#1: known to fail with ms.net, should've been escaped.", "#%A9%202002", b.Fragment);\r
- Assertion.AssertEquals ("#2", String.Empty, b.Query);\r
- b.Fragment = "#test";\r
- Assertion.AssertEquals ("#3", "##test", b.Fragment);\r
- b.Fragment = null;\r
- Assertion.AssertEquals ("#4", String.Empty, b.Fragment);\r
- }\r
- \r
- [Test]\r
- public void Scheme ()\r
- {\r
- b.Scheme = "http";\r
- Assertion.AssertEquals ("#1", b.Scheme, "http");\r
- b.Scheme = "http:";\r
- Assertion.AssertEquals ("#2", b.Scheme, "http");\r
- b.Scheme = "http://";\r
- Assertion.AssertEquals ("#3", b.Scheme, "http");\r
- b.Scheme = "http://foo/bar";\r
- Assertion.AssertEquals ("#4", b.Scheme, "http");\r
- b.Scheme = "mailto:";\r
- Assertion.AssertEquals ("#5", b.Scheme, "mailto");\r
- b.Scheme = "unknown";\r
- Assertion.AssertEquals ("#6", b.Scheme, "unknown");\r
- b.Scheme = "unknown://";\r
- Assertion.AssertEquals ("#7", b.Scheme, "unknown");\r
- }\r
- \r
- [Test]\r
- public void Equals ()\r
- {\r
- b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html?item=1");\r
- b2 = new UriBuilder ("http", "www.ximian.com", 80, "/foo/bar/index.html", "?item=1");\r
- b3 = new UriBuilder (new Uri ("http://www.ximian.com/foo/bar/index.html?item=1"));\r
- \r
- Assertion.Assert ("#1", b.Equals (b2));\r
- Assertion.Assert ("#2", b.Uri.Equals (b2.Uri));\r
- Assertion.Assert ("#3", b.Equals (b3));\r
- Assertion.Assert ("#4", b2.Equals (b3));\r
- Assertion.Assert ("#5", b3.Equals (b));\r
- }\r
- \r
- [Test]\r
- public void ToStringTest ()\r
- {\r
- Assertion.AssertEquals ("#1 known to fail with ms.net, should've been canonicalized.", b.Uri.ToString (), b.ToString ());\r
- }\r
- }\r
-}\r
-\r
+//
+// UriBuilderTest.cs - NUnit Test Cases for System.UriBuilder
+//
+// Authors:
+// Lawrence Pit (loz@cable.a2000.nl)
+// Martin Willemoes Hansen (mwh@sysrq.dk)
+//
+// (C) 2003 Martin Willemoes Hansen
+// Copyright (C) 2010 Novell, Inc (http://www.novell.com)
+//
+
+using NUnit.Framework;
+using System;
+
+namespace MonoTests.System
+{
+ [TestFixture]
+ public class UriBuilderTest
+ {
+ private UriBuilder b, b2, b3;
+
+ [SetUp]
+ public void GetReady()
+ {
+ b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html");
+ }
+
+ [Test] // ctor ()
+ public void Constructor_Empty ()
+ {
+ b = new UriBuilder ();
+ Assert.AreEqual ("http", b.Scheme, "#1");
+ Assert.AreEqual ("localhost", b.Host, "#2");
+ Assert.AreEqual (-1, b.Port, "#4");
+ Assert.AreEqual (string.Empty, b.Query, "#5");
+ Assert.AreEqual (string.Empty, b.Fragment, "#6");
+ }
+
+ [Test] // ctor (string)
+ public void Constructor1 ()
+ {
+ b = new UriBuilder ("http://www.ximian.com:8001#test?name=50");
+ Assert.AreEqual ("#test?name=50", b.Fragment, "#A1");
+ Assert.AreEqual ("www.ximian.com", b.Host, "#A2");
+ Assert.AreEqual (string.Empty, b.Password, "#A3");
+ Assert.AreEqual ("/", b.Path, "#A4");
+ Assert.AreEqual (8001, b.Port, "#A5");
+ Assert.AreEqual (string.Empty, b.Query, "#A5");
+ Assert.AreEqual ("http", b.Scheme, "#A6");
+ Assert.AreEqual ("http://www.ximian.com:8001/#test?name=50", b.Uri.ToString (), "#A7");
+ Assert.AreEqual (string.Empty, b.UserName, "#A8");
+
+ b = new UriBuilder ("http://www.ximian.com?name=50#test");
+ Assert.AreEqual ("#test", b.Fragment, "#B1");
+ Assert.AreEqual ("www.ximian.com", b.Host, "#B2");
+ Assert.AreEqual (string.Empty, b.Password, "#B3");
+ Assert.AreEqual ("/", b.Path, "#B4");
+ Assert.AreEqual (80, b.Port, "#B5");
+ Assert.AreEqual ("?name=50", b.Query, "#B5");
+ Assert.AreEqual ("http", b.Scheme, "#B6");
+ Assert.AreEqual ("http://www.ximian.com/?name=50#test", b.Uri.ToString (), "#B7");
+ Assert.AreEqual (string.Empty, b.UserName, "#B8");
+ }
+
+ [Test] // ctor (string)
+ public void Constructor1_Uri_Null ()
+ {
+ try {
+ new UriBuilder ((string) null);
+ Assert.Fail ("#1");
+ } catch (ArgumentNullException ex) {
+ Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+ Assert.IsNull (ex.InnerException, "#3");
+ Assert.IsNotNull (ex.Message, "#4");
+ Assert.IsNotNull (ex.ParamName, "#5");
+ Assert.AreEqual ("uriString", ex.ParamName, "#6");
+ }
+ }
+
+ [Test] // ctor (Uri)
+#if NET_4_0
+ [ExpectedException (typeof (ArgumentNullException))]
+#else
+ [ExpectedException (typeof (NullReferenceException))]
+#endif
+ public void Constructor2_Uri_Null ()
+ {
+ new UriBuilder ((Uri) null);
+ }
+
+ [Test]
+ public void Constructor_5 ()
+ {
+ b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html", "#extras");
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void Constructor_5_BadExtraValue ()
+ {
+ b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html", "extras");
+ // should have thrown an ArgumentException because extraValue must start with '?' or '#' character.
+ }
+
+ [Test]
+ public void Constructor_StringStringInt ()
+ {
+ UriBuilder ub = new UriBuilder ("http", "www.mono-project.com", 80);
+ Assert.AreEqual ("http://www.mono-project.com/", ub.Uri.AbsoluteUri, "Uri.AbsoluteUri");
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void Constructor_RelativeUri ()
+ {
+ Uri relative = new Uri ("../dir/subdir/file", UriKind.RelativeOrAbsolute);
+ UriBuilder ub = new UriBuilder (relative);
+ }
+
+ [Test]
+ public void UserInfo ()
+ {
+ string s = "mailto://myname:mypwd@contoso.com?subject=hello";
+ b = new UriBuilder (s);
+ Assert.AreEqual (s, b.ToString (), "1.ToString");
+ Assert.AreEqual (string.Empty, b.UserName, "1.UserName");
+ Assert.AreEqual (string.Empty, b.Password, "1.Password");
+ Assert.AreEqual ("//myname:mypwd@contoso.com", b.Uri.LocalPath, "1.Uri.LocalPath");
+
+ // weird ?caching? issue, UserInfo is not updated if we look at the value of UserName before setting Password
+ b = new UriBuilder ("mailto", "contoso.com");
+ b.UserName = "myname";
+ Assert.AreEqual ("myname", b.Uri.UserInfo, "2.UserName");
+ b.Password = "mypwd";
+ Assert.AreEqual ("myname", b.Uri.UserInfo, "2.Password");
+ Assert.AreEqual ("/", b.Uri.LocalPath, "2.Uri.LocalPath");
+
+ b = new UriBuilder ("mailto", "contoso.com");
+ b.UserName = "myname";
+ b.Password = "mypwd";
+ Assert.AreEqual ("myname:mypwd", b.Uri.UserInfo, "3.Uri.UserInfo");
+ Assert.AreEqual ("/", b.Uri.LocalPath, "3.Uri.LocalPath");
+ }
+
+ [Test]
+ public void Path ()
+ {
+ b.Path = ((char) 0xa9) + " 2002";
+ Assert.AreEqual ("%C2%A9%202002", b.Path);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentOutOfRangeException))]
+ public void BadPort1 ()
+ {
+ b.Port = -12345;
+ }
+
+ [Test]
+ public void DefaultPort ()
+ {
+ b.Port = -1;
+ Assert.AreEqual (-1, b.Port, "#1");
+ Assert.AreEqual ("http://www.ximian.com/foo/bar/index.html", b.ToString (), "#2");
+ }
+
+ [Test]
+ public void Query ()
+ {
+ b.Query = ((char) 0xa9) + " 2002";
+ Assert.AreEqual ("?\xA9 2002", b.Query, "#1");
+ Assert.AreEqual (string.Empty, b.Fragment, "#2");
+ b.Query = "?test";
+ Assert.AreEqual ("??test", b.Query, "#3");
+ b.Query = null;
+ Assert.AreEqual (string.Empty, b.Query, "#4");
+ b.Fragment = "test";
+ Assert.AreEqual ("#test", b.Fragment, "#5");
+ b.Query = "name";
+ Assert.AreEqual ("#test", b.Fragment, "#6");
+ Assert.AreEqual ("?name", b.Query, "#7");
+ b.Fragment = "run";
+ Assert.AreEqual ("#run", b.Fragment, "#8");
+ b.Query = null;
+ Assert.AreEqual ("#run", b.Fragment, "#9");
+ Assert.AreEqual (string.Empty, b.Query, "#10");
+ }
+
+ [Test]
+ public void Fragment ()
+ {
+ b.Fragment = ((char) 0xa9) + " 2002";
+ Assert.AreEqual ("#\xA9 2002", b.Fragment, "#1");
+ Assert.AreEqual (string.Empty, b.Query, "#2");
+ b.Fragment = "#test";
+ Assert.AreEqual ("##test", b.Fragment, "#3");
+ b.Fragment = null;
+ Assert.AreEqual (String.Empty, b.Fragment, "#4");
+ b.Query = "name";
+ Assert.AreEqual ("?name", b.Query, "#5");
+ b.Fragment = null;
+ Assert.AreEqual ("?name", b.Query, "#6");
+ Assert.AreEqual (string.Empty, b.Fragment, "#7");
+ }
+
+ [Test]
+ public void Scheme ()
+ {
+ b.Scheme = "http";
+ Assert.AreEqual ("http", b.Scheme, "#1");
+ b.Scheme = "http:";
+ Assert.AreEqual ("http", b.Scheme, "#2");
+ b.Scheme = "http://";
+ Assert.AreEqual ("http", b.Scheme, "#3");
+ b.Scheme = "http://foo/bar";
+ Assert.AreEqual ("http", b.Scheme, "#4");
+ b.Scheme = "mailto:";
+ Assert.AreEqual ("mailto", b.Scheme, "#5");
+ b.Scheme = "unknown";
+ Assert.AreEqual ("unknown", b.Scheme, "#6");
+ b.Scheme = "unknown://";
+ Assert.AreEqual ("unknown", b.Scheme, "#7");
+ }
+
+ [Test]
+ public void Equals ()
+ {
+ b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html?item=1");
+ Assert.AreEqual ("foo/bar/index.html%3Fitem=1", b.Path, "1.Path");
+ Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html%3Fitem=1", b.ToString (), "1.ToString");
+
+ b2 = new UriBuilder ("http", "www.ximian.com", 80, "/foo/bar/index.html", "?item=1");
+ Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html?item=1", b2.ToString (), "2.ToString");
+
+ b3 = new UriBuilder (new Uri ("http://www.ximian.com/foo/bar/index.html?item=1"));
+ Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html?item=1", b3.ToString (), "3.ToString");
+
+ Assert.IsFalse (b.Equals (b2), "#1");
+ Assert.IsFalse (b.Uri.Equals (b2.Uri), "#2");
+ Assert.IsFalse (b.Equals (b3), "#3");
+ Assert.IsFalse (b3.Equals (b), "#4");
+ Assert.IsTrue (b2.Equals (b3), "#5");
+ }
+
+ [Test]
+ public void ToStringTest ()
+ {
+ Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html", b.ToString (), "#1");
+ Assert.AreEqual ("http://www.ximian.com/foo/bar/index.html", b.Uri.ToString (), "#2");
+ }
+
+ [Test]
+ public void EmptyQuery () // bug 57082
+ {
+ b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", null);
+ string noquery = "http://www.ximian.com/lalala/lelele.aspx";
+ Assert.AreEqual (noquery, b.Uri.ToString (), "#1");
+ b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "?");
+ Assert.AreEqual (noquery, b.Uri.ToString (), "#2");
+ b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "??");
+ Assert.AreEqual (noquery + "??", b.Uri.ToString (), "#3");
+ b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "?something");
+ Assert.AreEqual (noquery + "?something", b.Uri.ToString (), "#4");
+ }
+
+ [Test] // bug #76501
+ public void TestToString76501 ()
+ {
+ UriBuilder ub = new UriBuilder (
+ "http://mondomaine/trucmuche/login.aspx");
+ ub.Query = ub.Query.TrimStart (new char [] {'?'}) + "&ticket=bla";
+ Assert.IsTrue (ub.ToString ().IndexOf ("80//") < 0);
+ }
+
+ [Test]
+ public void TestAppendFragment ()
+ {
+ UriBuilder uri = new UriBuilder ("http://www.mono-project.com/Main_Page");
+ uri.Fragment = "Features";
+ Assert.AreEqual ("#Features", uri.Fragment, "#1");
+ Assert.AreEqual ("http://www.mono-project.com/Main_Page#Features", uri.Uri.ToString (), "#2");
+ }
+
+ [Test]
+ public void IPv6_Host ()
+ {
+ UriBuilder ub = new UriBuilder ("http", "[1:2:3:4:5:6:7:8]", 8080, "/dir/subdir/file");
+ Assert.AreEqual ("[1:2:3:4:5:6:7:8]", ub.Host, "Host.1");
+ Assert.AreEqual ("[0001:0002:0003:0004:0005:0006:0007:0008]", ub.Uri.Host, "Uri.Host");
+ // once the Uri is created then some builder properties may change
+ Assert.AreEqual ("[0001:0002:0003:0004:0005:0006:0007:0008]", ub.Host, "Host.2");
+ }
+
+ [Test]
+ public void IPv6_Host_IncompleteAddress ()
+ {
+ UriBuilder ub = new UriBuilder ("http", "1:2:3:4:5:6:7:8", 8080, "/dir/subdir/file");
+ Assert.AreEqual ("[1:2:3:4:5:6:7:8]", ub.Host, "1.Host");
+ Assert.AreEqual ("http://[1:2:3:4:5:6:7:8]:8080/dir/subdir/file", ub.ToString (), "1.ToString ()");
+
+ ub = new UriBuilder ("http", "1:", 8080, "/dir/subdir/file");
+ Assert.AreEqual ("[1:]", ub.Host, "2.Host");
+ Assert.AreEqual ("http://[1:]:8080/dir/subdir/file", ub.ToString (), "2.ToString ()");
+
+ ub = new UriBuilder ("http", "[1:", 8080, "/dir/subdir/file");
+ Assert.AreEqual ("[1:", ub.Host, "3.Host");
+ Assert.AreEqual ("http://[1::8080/dir/subdir/file", ub.ToString (), "3.ToString ()");
+
+ ub = new UriBuilder ("http", "1:2]", 8080, "/dir/subdir/file");
+ Assert.AreEqual ("[1:2]]", ub.Host, "4.Host");
+ Assert.AreEqual ("http://[1:2]]:8080/dir/subdir/file", ub.ToString (), "4.ToString ()");
+ }
+
+ [Test]
+ public void Path_UriAbsolutePath_Path ()
+ {
+ UriBuilder ub = new UriBuilder ("http", "127.0.0.1", 80, "dir/subdir/file");
+ Assert.AreEqual ("dir/subdir/file", ub.Path, "Path.1");
+ Assert.AreEqual ("/dir/subdir/file", ub.Uri.AbsolutePath, "Uri.AbsolutePath");
+ // once the Uri is created then some builder properties may change
+ Assert.AreEqual ("/dir/subdir/file", ub.Path, "Path.2");
+ }
+
+ [Test]
+ public void UnparsableUri ()
+ {
+ // some URI can't be parsed by System.Uri but are accepted by UriBuilder
+ Uri u = null;
+ string uri = "www.mono-project.com";
+ Assert.IsFalse (Uri.TryCreate (uri, UriKind.Absolute, out u), "1.Uri.TryCreate");
+ UriBuilder ub = new UriBuilder (uri);
+ Assert.AreEqual ("www.mono-project.com", ub.Host, "1.Host");
+ Assert.AreEqual ("http", ub.Scheme, "1.Scheme");
+ Assert.AreEqual (80, ub.Port, "1.Port");
+ Assert.AreEqual ("/", ub.Path, "1.Path");
+
+ // always assume http, port 80
+ uri = "ftp.novell.com/dir/subdir/file";
+ ub = new UriBuilder (uri);
+ Assert.IsFalse (Uri.TryCreate (uri, UriKind.Absolute, out u), "2.Uri.TryCreate");
+ Assert.AreEqual ("ftp.novell.com", ub.Host, "2.Host");
+ Assert.AreEqual ("http", ub.Scheme, "2.Scheme");
+ Assert.AreEqual (80, ub.Port, "2.Port");
+ Assert.AreEqual ("/dir/subdir/file", ub.Path, "2.Path");
+ }
+
+ [Test]
+ public void AspNetRedirectUsage_Old ()
+ {
+ Uri uri = new Uri ("http://192.168.0.21:80/WebResource.axd?d=AAAAAAAAAAEAAAAAAAAAAA2");
+ UriBuilder ub = new UriBuilder (uri);
+ ub.Path = "error404.aspx?aspxerrorpath=/WebResource.axd";
+ ub.Fragment = null;
+ ub.Password = null;
+ ub.Query = null;
+ ub.UserName = null;
+ // a bug in older UriBuilder did not encode the ? - existing ASP.NET depends on buggy behavior
+ Assert.AreEqual ("http://192.168.0.21/error404.aspx%3Faspxerrorpath=/WebResource.axd", ub.Uri.ToString ());
+ }
+
+ [Test]
+ public void AspNetRedirectUsage_New ()
+ {
+ string path = "error404.aspx?aspxerrorpath=/WebResource.axd";
+ Uri uri = new Uri ("http://192.168.0.21:80/WebResource.axd?d=AAAAAAAAAAEAAAAAAAAAAA2");
+ UriBuilder ub = new UriBuilder (uri);
+ int qpos = path.IndexOf ('?');
+ ub.Path = path.Substring (0, qpos);
+ ub.Fragment = null;
+ ub.Password = null;
+ ub.Query = path.Substring (qpos + 1);
+ ub.UserName = null;
+ // this is what ASP.NET really means (the ?)
+ Assert.AreEqual ("http://192.168.0.21/error404.aspx?aspxerrorpath=/WebResource.axd", ub.Uri.ToString ());
+ }
+ }
+}
+