IPAddressTest.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. //
  2. // IPAddressTest.cs - NUnit Test Cases for System.Net.IPAddress
  3. //
  4. // Authors:
  5. // Gonzalo Paniagua Javier ([email protected])
  6. // Martin Willemoes Hansen ([email protected])
  7. //
  8. // (C) Ximian, Inc. http://www.ximian.com
  9. // (C) 2003 Martin Willemoes Hansen
  10. // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
  11. //
  12. using NUnit.Framework;
  13. using System;
  14. using System.Net;
  15. using System.Net.Sockets;
  16. using System.Runtime.InteropServices;
  17. namespace MonoTests.System.Net
  18. {
  19. [TestFixture]
  20. public class IPAddressTest
  21. {
  22. static string[] ipv6AddressList = new string[] {
  23. "::", "0:0:0:0:0:0:0:0",
  24. "1::", "1:0:0:0:0:0:0:0",
  25. "2:2::", "2:2:0:0:0:0:0:0",
  26. "7:7:7:7:7:7:7:0", "7:7:7:7:7:7:7:0",
  27. "::1", "0:0:0:0:0:0:0:1",
  28. "0:7:7:7:7:7:7:7", "0:7:7:7:7:7:7:7",
  29. "E::1", "E:0:0:0:0:0:0:1",
  30. "E::2:2", "E:0:0:0:0:0:2:2",
  31. "E:0:6:6:6:6:6:6", "E:0:6:6:6:6:6:6",
  32. "E:E::1", "E:E:0:0:0:0:0:1",
  33. "E:E::2:2", "E:E:0:0:0:0:2:2",
  34. "E:E:0:5:5:5:5:5", "E:E:0:5:5:5:5:5",
  35. "E:E:E::1", "E:E:E:0:0:0:0:1",
  36. "E:E:E::2:2", "E:E:E:0:0:0:2:2",
  37. "E:E:E:0:4:4:4:4", "E:E:E:0:4:4:4:4",
  38. "E:E:E:E::1", "E:E:E:E:0:0:0:1",
  39. "E:E:E:E::2:2", "E:E:E:E:0:0:2:2",
  40. "E:E:E:E:0:3:3:3", "E:E:E:E:0:3:3:3",
  41. "E:E:E:E:E::1", "E:E:E:E:E:0:0:1",
  42. "E:E:E:E:E:0:2:2", "E:E:E:E:E:0:2:2",
  43. "E:E:E:E:E:E:0:1", "E:E:E:E:E:E:0:1",
  44. "::0.2.0.2", "0:0:0:0:0:0:2:2",
  45. "::FFFF:192.168.0.1", "::FFFF:192.168.0.1",
  46. "::FFFF:0.168.0.1", "::FFFF:0.168.0.1",
  47. "::FFFF", "::0.0.255.255",
  48. "::10.0.0.1", "::10.0.0.1",
  49. "1234::1234:0:0", "1234:0:0:0:0:1234:0:0",
  50. "1:0:1:0:1:0:1:0", "1:0:1:0:1:0:1:0",
  51. "1:1:1::1:1:0", "1:1:1:0:0:1:1:0",
  52. "::1234:0:0", "0:0:0:0:0:1234:0:0",
  53. "3ffe:38e1::100:1:1", "3ffe:38e1::0100:1:0001",
  54. "0:0:1:2::", "0:0:1:2:00:00:000:0000",
  55. "100:0:1:2::abcd", "100:0:1:2:0:0:000:abcd",
  56. "ffff::abcd", "ffff:0:0:0:0:0:00:abcd",
  57. "ffff:0:0:2::abcd", "ffff:0:0:2:0:0:00:abcd",
  58. "0:0:1:2::", "0:0:1:2:0:00:0000:0000",
  59. "::1:0:0", "0000:0000::1:0000:0000",
  60. "::111:234:5:6:789a:0", "0:0:111:234:5:6:789A:0",
  61. "11:22:33:44:55:66:77:8", "11:22:33:44:55:66:77:8",
  62. "0:0:7711:ab42:1230::", "::7711:ab42:1230:0:0:0",
  63. "fec0:0:0:ffff::1%1",
  64. };
  65. static string[] ipv4ParseOk = new string[] {
  66. "192.168.1.1", "192.168.1.1",
  67. "0xff.0x7f.0x20.0x01", "255.127.32.1",
  68. "0xff.0x7f.0x20.0xf", "255.127.32.15",
  69. "0.0.0.0", IPAddress.Any.ToString(),
  70. "255.255.255.255", IPAddress.Broadcast.ToString(),
  71. #if ONLY_1_1
  72. "12.1.1.3 ", "12.1.1.3",
  73. "12.1 foo.1.2.3.4.5.bar", "12.0.0.1",
  74. "12.1.4.6 foo.bar.test.test.bag", "12.1.4.6",
  75. "12.6 foo.1.2.3.4.5.", "12.0.0.6",
  76. "12.1.1.3 g", "12.1.1.3",
  77. " ", "0.0.0.0",
  78. "", "0.0.0.0",
  79. #endif
  80. "12.1.1.3 abc", "12.1.1.3",
  81. "12.1 .1.2", "12.0.0.1",
  82. "12.1 .zzzz.2", "12.0.0.1",
  83. "12.1.7", "12.1.0.7",
  84. "12", "0.0.0.12",
  85. "12.5.3 foo.67.test.test.7FFFFFFFFFfaFFF789FFFFFFFFFFFFFFF", "12.5.0.3",
  86. "12.1 foo.bar.test.test.baf", "12.0.0.1",
  87. "12.1.4.6 foo.bar.test.test.baf", "12.1.4.6",
  88. "12.3 foo.bar.test.test.4", "12.0.0.3",
  89. "12 foo.bar.test.test.baf", "0.0.0.12",
  90. //"65536", "0.1.0.0",
  91. //"65535", "0.0.255.255",
  92. //"20.65535", "20.0.255.255"
  93. };
  94. static string [] ipv4ParseWrong = new string [] {
  95. " foo",
  96. "12.. .",
  97. "12.1.2. ",
  98. "12.1.8. ",
  99. ".1.1.6",
  100. " 12.1.1.1",
  101. "12.+1.1.4",
  102. "12.1.-1.5",
  103. "257.1.1.9",
  104. #if NET_2_0
  105. "12.1.1.3 ",
  106. "12.1 foo.1.2.3.4.5.bar",
  107. "12.1 foo.1.2.3.4.5.",
  108. "12.1.1.3 g",
  109. " ",
  110. "",
  111. #endif
  112. "12.1.foo.1.2.3.4.5.bar",
  113. "12.",
  114. "12.1.2.",
  115. "12...",
  116. " "
  117. };
  118. [Test]
  119. public void PublicFields ()
  120. {
  121. Assert.AreEqual ((long) 0, IPAddress.Any.Address, "#1");
  122. Assert.AreEqual ((long) 0xFFFFFFFF, IPAddress.Broadcast.Address, "#2");
  123. long loopback = IPAddress.HostToNetworkOrder (BitConverter.IsLittleEndian ?
  124. 0x7f000001 :
  125. 0x0100007f);
  126. Assert.AreEqual (loopback, IPAddress.Loopback.Address, "#3");
  127. Assert.AreEqual ((long) 0xFFFFFFFF, IPAddress.None.Address, "#4");
  128. }
  129. [Test]
  130. public void ToStringV4 ()
  131. {
  132. IPAddress ip = IPAddress.Parse ("192.168.1.1");
  133. Assert.AreEqual ("192.168.1.1", ip.ToString (), "#1");
  134. Assert.AreEqual ("0.0.0.0", IPAddress.Any.ToString (), "#2");
  135. Assert.AreEqual ("255.255.255.255", IPAddress.Broadcast.ToString (), "#3");
  136. Assert.AreEqual ("127.0.0.1", IPAddress.Loopback.ToString (), "#4");
  137. Assert.AreEqual ("255.255.255.255", IPAddress.None.ToString (), "#5");
  138. }
  139. #if NET_1_1
  140. [Test]
  141. public void ToStringV6 ()
  142. {
  143. if (!Socket.SupportsIPv6)
  144. Assert.Ignore ("IPv6 must be enabled in machine.config");
  145. for(int i=0; i<ipv6AddressList.Length/2; i++) {
  146. string addr = IPAddress.Parse (ipv6AddressList[i*2+1]).ToString().ToLower();
  147. Assert.AreEqual (ipv6AddressList[i*2].ToLower(), addr, "ToStringIPv6 #" + i);
  148. }
  149. }
  150. #endif
  151. [Test]
  152. public void IsLoopbackV4 ()
  153. {
  154. IPAddress ip;
  155. ip = IPAddress.Parse ("127.0.0.1");
  156. Assert.IsTrue (IPAddress.IsLoopback (ip), "#1");
  157. ip = IPAddress.Any;
  158. Assert.IsFalse (IPAddress.IsLoopback (ip), "#2");
  159. ip = IPAddress.Loopback;
  160. Assert.IsTrue (IPAddress.IsLoopback (ip), "#3");
  161. ip = IPAddress.Parse ("::101");
  162. Assert.IsFalse (IPAddress.IsLoopback (ip), "#4");
  163. }
  164. #if NET_1_1
  165. [Test]
  166. public void IsLoopbackV6 ()
  167. {
  168. if (!Socket.SupportsIPv6)
  169. Assert.Ignore ("IPv6 must be enabled in machine.config");
  170. IPAddress ip = IPAddress.IPv6Loopback;
  171. Assert.IsTrue (IPAddress.IsLoopback (ip), "#1");
  172. ip = IPAddress.IPv6None;
  173. Assert.IsFalse (IPAddress.IsLoopback (ip), "#2");
  174. }
  175. [Test]
  176. public void GetAddressBytesV4 ()
  177. {
  178. byte[] dataIn = { 10, 11, 12, 13 };
  179. byte[] dataOut = IPAddress.Parse ("10.11.12.13").GetAddressBytes ();
  180. for (int i = 0; i < dataIn.Length; i++)
  181. Assert.AreEqual (dataOut [i], dataIn [i], "GetAddressBytesV4");
  182. }
  183. [Test]
  184. public void GetAddressBytesV6 ()
  185. {
  186. if (!Socket.SupportsIPv6)
  187. Assert.Ignore ("IPv6 must be enabled in machine.config");
  188. byte[] dataIn = new byte[]{ 0x01, 0x23, 0x45, 0x67, 0x89, 0x98, 0x76, 0x54, 0x32, 0x10, 0x01, 0x23, 0x45, 0x67, 0x89, 0x98 };
  189. byte[] dataOut = IPAddress.Parse ("123:4567:8998:7654:3210:0123:4567:8998").GetAddressBytes ();
  190. for (int i = 0; i < dataIn.Length; i++)
  191. Assert.AreEqual (dataOut [i], dataIn [i], "GetAddressBytesV6 #1");
  192. dataIn = new byte[]{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x01 };
  193. dataOut = IPAddress.Parse ("::FFFF:127.0.0.1").GetAddressBytes ();
  194. for (int i = 0; i < dataIn.Length; i++)
  195. Assert.AreEqual (dataOut [i], dataIn [i], "GetAddressBytesV6 #2");
  196. }
  197. #endif
  198. [Test]
  199. public void Address ()
  200. {
  201. // hm, lame, anything is accepted by ms.net
  202. /*
  203. try {
  204. IPAddress ip1 = new IPAddress (0x0000000100000000);
  205. Assertion.Fail ("#1");
  206. } catch (ArgumentOutOfRangeException) {}
  207. IPAddress ip = IPAddress.Parse ("127.0.0.1");
  208. ip.Address = 0;
  209. ip.Address = 0xffffffff;
  210. try {
  211. ip.Address = -1;
  212. Assertion.Fail ("#2");
  213. } catch (ArgumentOutOfRangeException) {}
  214. try {
  215. ip.Address = 0x0000000100000000;
  216. Assertion.Fail ("#3");
  217. } catch (ArgumentOutOfRangeException) {}
  218. */
  219. }
  220. [Test]
  221. public void ParseOkV4 ()
  222. {
  223. for (int i = 0; i < ipv4ParseOk.Length / 2; i++) {
  224. IPAddress ip;
  225. try {
  226. ip = IPAddress.Parse (ipv4ParseOk [i*2]);
  227. Assert.AreEqual (ipv4ParseOk [i * 2 + 1], ip.ToString (), "ParseOkV4:" + i);
  228. } catch (FormatException) {
  229. Assert.Fail ("Cannot parse test i=" + i + ": '" + ipv4ParseOk [i*2] + "'");
  230. }
  231. }
  232. }
  233. #if NET_1_1
  234. [Test]
  235. public void ParseOkV6 ()
  236. {
  237. if (!Socket.SupportsIPv6)
  238. Assert.Ignore ("IPv6 must be enabled in machine.config");
  239. for (int i = 0; i < ipv6AddressList.Length / 2; i++) {
  240. string source = ipv6AddressList [i*2].ToLower();
  241. IPAddress ip = IPAddress.Parse (source);
  242. Assert.IsTrue (ip.ToString ().ToLower () == source,
  243. string.Format("ParseIPv6 #{0}-1: {1} != {2}", i,
  244. ip.ToString ().ToLower (), source));
  245. ip = IPAddress.Parse (ipv6AddressList [i*2+1].ToLower ());
  246. Assert.IsTrue (ip.ToString ().ToLower () == source,
  247. string.Format("ParseIPv6 #{0}-2: {1} != {2}", i,
  248. ip.ToString ().ToLower (), source));
  249. }
  250. }
  251. #endif
  252. [Test]
  253. public void ParseWrongV4 ()
  254. {
  255. for (int i = 0; i < ipv4ParseWrong.Length; i++) {
  256. string ipAddress = ipv4ParseWrong [i];
  257. try {
  258. IPAddress ip = IPAddress.Parse (ipAddress);
  259. Assert.Fail ("#1:" + i + " (" + ipAddress + ")");
  260. } catch (FormatException ex) {
  261. Assert.AreEqual (typeof (FormatException), ex.GetType (), "#2:" + i);
  262. Assert.IsNull (ex.InnerException, "#3:" + i);
  263. Assert.IsNotNull (ex.Message, "#4:" + i);
  264. }
  265. }
  266. }
  267. [Test]
  268. public void Parse_IpString_Null ()
  269. {
  270. try {
  271. IPAddress.Parse ((string) null);
  272. Assert.Fail ("#1");
  273. } catch (ArgumentNullException ex) {
  274. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  275. Assert.IsNull (ex.InnerException, "#3");
  276. Assert.IsNotNull (ex.Message, "#4");
  277. Assert.AreEqual ("ipString", ex.ParamName, "#5");
  278. }
  279. }
  280. [Test]
  281. public void NetworkHost ()
  282. {
  283. long [] tested = new long [] { 0, 1, 1, 1};
  284. long [] expectedLE = new long [] {0, 256, 16777216, 72057594037927936 };
  285. long [] expected;
  286. expected = BitConverter.IsLittleEndian ? expectedLE : tested;
  287. short short0 = IPAddress.NetworkToHostOrder ((short) tested [0]);
  288. Assert.AreEqual ((short) expected [0], short0, "#A1");
  289. short0 = IPAddress.HostToNetworkOrder (short0);
  290. Assert.AreEqual ((short) tested [0], short0, "#A2");
  291. int int0 = IPAddress.NetworkToHostOrder ((int) tested [0]);
  292. Assert.AreEqual ((int) expected [0], int0, "#B1");
  293. int0 = IPAddress.HostToNetworkOrder (int0);
  294. Assert.AreEqual ((int) tested [0], int0, "#B2");
  295. long long0 = IPAddress.NetworkToHostOrder (tested [0]);
  296. Assert.AreEqual (expected [0], long0, "#C1");
  297. long0 = IPAddress.HostToNetworkOrder (long0);
  298. Assert.AreEqual (tested [0], long0, "#C2");
  299. short0 = IPAddress.NetworkToHostOrder ((short) tested [1]);
  300. Assert.AreEqual ((short) expected [1], short0, "#D1");
  301. short0 = IPAddress.HostToNetworkOrder (short0);
  302. Assert.AreEqual ((short) tested [1], short0, "#D2");
  303. int0 = IPAddress.NetworkToHostOrder ((int) tested [2]);
  304. Assert.AreEqual ((int) expected [2], int0, "#E1");
  305. int0 = IPAddress.HostToNetworkOrder (int0);
  306. Assert.AreEqual ((int) tested [2], int0, "#E2");
  307. long0 = IPAddress.NetworkToHostOrder (tested [3]);
  308. Assert.AreEqual (expected [3], long0, "#F1");
  309. long0 = IPAddress.HostToNetworkOrder (long0);
  310. Assert.AreEqual (tested [3], long0, "#F2");
  311. }
  312. [Test]
  313. public void LoopbackIPv6 ()
  314. {
  315. Assert.IsTrue (new Uri("http://[0:0:0:0::127.0.0.1]/").IsLoopback, "#1");
  316. Assert.IsFalse (new Uri ("http://[0:0:0:0::127.1.2.3]/").IsLoopback, "#2");
  317. Assert.IsTrue (new Uri ("http://[0:0:0:0::0.0.0.1]/").IsLoopback, "#3");
  318. }
  319. [Test] // bug #76792
  320. public void Constructor0_Address_4Byte ()
  321. {
  322. byte[] bytes = new byte[4] { 192, 202, 112, 37 };
  323. #if NET_2_0
  324. IPAddress i = new IPAddress (bytes);
  325. Assert.AreEqual (bytes, i.GetAddressBytes (), "#1");
  326. Assert.AreEqual ("192.202.112.37", i.ToString (), "#2");
  327. #else
  328. try {
  329. new IPAddress (bytes);
  330. Assert.Fail ("#1");
  331. } catch (ArgumentException ex) {
  332. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  333. Assert.IsNotNull (ex.Message, "#3");
  334. Assert.AreEqual ("address", ex.Message, "#4");
  335. Assert.IsNull (ex.ParamName, "#5");
  336. Assert.IsNull (ex.InnerException, "#6");
  337. }
  338. #endif
  339. }
  340. [Test]
  341. #if TARGET_JVM
  342. [Ignore ("TD BUG ID: 7213")]
  343. #endif
  344. public void Constructor0_Address_Invalid ()
  345. {
  346. try {
  347. new IPAddress (new byte [0]);
  348. Assert.Fail ("#A1");
  349. } catch (ArgumentException ex) {
  350. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  351. Assert.IsNull (ex.InnerException, "#A3");
  352. Assert.IsNotNull (ex.Message, "#A4");
  353. #if NET_2_0
  354. Assert.IsFalse (ex.Message == "address", ex.Message, "#A5");
  355. Assert.IsNotNull (ex.ParamName, "#A6");
  356. Assert.AreEqual ("address", ex.ParamName, "#A7");
  357. #else
  358. Assert.AreEqual ("address", ex.Message, "#A5");
  359. Assert.IsNull (ex.ParamName, "#A6");
  360. #endif
  361. }
  362. try {
  363. new IPAddress (new byte [3] { 192, 202, 112 });
  364. Assert.Fail ("#B1");
  365. } catch (ArgumentException ex) {
  366. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
  367. Assert.IsNull (ex.InnerException, "#B3");
  368. Assert.IsNotNull (ex.Message, "#B4");
  369. #if NET_2_0
  370. Assert.IsFalse (ex.Message == "address", ex.Message, "#B5");
  371. Assert.IsNotNull (ex.ParamName, "#B6");
  372. Assert.AreEqual ("address", ex.ParamName, "#B7");
  373. #else
  374. Assert.AreEqual ("address", ex.Message, "#B5");
  375. Assert.IsNull (ex.ParamName, "#B6");
  376. #endif
  377. }
  378. try {
  379. new IPAddress (new byte [5] { 192, 202, 112, 142, 25 });
  380. Assert.Fail ("#C1");
  381. } catch (ArgumentException ex) {
  382. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
  383. Assert.IsNull (ex.InnerException, "#C3");
  384. Assert.IsNotNull (ex.Message, "#C4");
  385. #if NET_2_0
  386. Assert.IsFalse (ex.Message == "address", "#C5");
  387. Assert.IsNotNull (ex.ParamName, "#C6");
  388. Assert.AreEqual ("address", ex.ParamName, "#C7");
  389. #else
  390. Assert.AreEqual ("address", ex.Message, "#C5");
  391. Assert.IsNull (ex.ParamName, "#C6");
  392. #endif
  393. }
  394. }
  395. [Test]
  396. public void Constructor0_Address_Null ()
  397. {
  398. try {
  399. new IPAddress ((byte []) null);
  400. Assert.Fail ("#1");
  401. } catch (ArgumentNullException ex) {
  402. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  403. Assert.IsNull (ex.InnerException, "#3");
  404. Assert.IsNotNull (ex.Message, "#4");
  405. Assert.AreEqual ("address", ex.ParamName, "#5");
  406. }
  407. }
  408. [Test]
  409. #if TARGET_JVM
  410. [Ignore ("TD BUG ID: 7213")]
  411. #endif
  412. public void Constructor1_Address_4Byte ()
  413. {
  414. byte [] bytes = new byte [4] { 192, 202, 112, 37 };
  415. try {
  416. new IPAddress (bytes, 0);
  417. Assert.Fail ("#1");
  418. } catch (ArgumentException ex) {
  419. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  420. Assert.IsNull (ex.InnerException, "#3");
  421. Assert.IsNotNull (ex.Message, "#4");
  422. #if NET_2_0
  423. Assert.IsFalse (ex.Message == "address", "#5");
  424. Assert.IsNotNull (ex.ParamName, "#6");
  425. Assert.AreEqual ("address", ex.ParamName, "#7");
  426. #else
  427. Assert.AreEqual ("address", ex.Message, "#5");
  428. Assert.IsNull (ex.ParamName, "#6");
  429. #endif
  430. }
  431. }
  432. [Test]
  433. public void Constructor1_Address_Null ()
  434. {
  435. try {
  436. new IPAddress ((byte []) null, 5);
  437. Assert.Fail ("#1");
  438. } catch (ArgumentNullException ex) {
  439. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  440. Assert.IsNull (ex.InnerException, "#3");
  441. Assert.IsNotNull (ex.Message, "#4");
  442. Assert.AreEqual ("address", ex.ParamName, "#5");
  443. }
  444. }
  445. #if NET_2_0
  446. [Test]
  447. public void TryParse_IpString_Null ()
  448. {
  449. IPAddress i;
  450. try {
  451. IPAddress.TryParse ((string) null, out i);
  452. Assert.Fail ("#1");
  453. } catch (ArgumentNullException ex) {
  454. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  455. Assert.IsNull (ex.InnerException, "#3");
  456. Assert.IsNotNull (ex.Message, "#4");
  457. Assert.AreEqual ("ipString", ex.ParamName, "#5");
  458. }
  459. }
  460. [Test]
  461. public void TryParse ()
  462. {
  463. IPAddress i;
  464. Assert.IsTrue (IPAddress.TryParse ("0.0.0.0", out i), "#1");
  465. Assert.IsTrue (IPAddress.TryParse ("127.0.0.1", out i), "#2");
  466. Assert.IsFalse (IPAddress.TryParse ("www.mono-project.com", out i), "#3");
  467. Assert.IsTrue (IPAddress.TryParse ("0001:0002:0003:0004:0005:0006:0007:0008", out i), "#4");
  468. Assert.IsTrue (IPAddress.TryParse ("1:2:3:4:5:6:7:8", out i), "#5");
  469. Assert.IsTrue (IPAddress.TryParse ("1::8", out i), "#6");
  470. Assert.IsTrue (IPAddress.TryParse ("1::3:4:5:6:7:8", out i), "#7");
  471. Assert.IsFalse (IPAddress.TryParse ("1::2:3:4:5::6:7:8", out i), "#8"); // :: ::
  472. Assert.IsFalse (IPAddress.TryParse ("1::2:3:4:5:6:7:8", out i), "#9");
  473. Assert.IsFalse (IPAddress.TryParse ("1;2:3:4:5:6:7:8", out i), "#10"); // ;
  474. // FIXME:
  475. // Assert.IsFalse (IPAddress.TryParse ("1:2:3:4:5:6:7:8/10", out i), "#11"); // subnet
  476. }
  477. [Test]
  478. public void TryParseOkV4 ()
  479. {
  480. for (int i = 0; i < ipv4ParseOk.Length / 2; i++) {
  481. IPAddress ip;
  482. Assert.IsTrue (IPAddress.TryParse (ipv4ParseOk [i * 2], out ip), "#1:" + i);
  483. Assert.AreEqual (ipv4ParseOk [i * 2 + 1], ip.ToString (), "#2:" + i);
  484. }
  485. }
  486. [Test]
  487. public void TryParseWrongV4 ()
  488. {
  489. for (int i = 0; i < ipv4ParseWrong.Length; i++) {
  490. IPAddress ip;
  491. string ipAddress = ipv4ParseWrong [i];
  492. Assert.IsFalse (IPAddress.TryParse (ipAddress, out ip), "#1:" + i);
  493. Assert.IsNull (ip, "#2:" + i);
  494. }
  495. }
  496. [Test]
  497. public void IsIPv6LinkLocal ()
  498. {
  499. Assert.IsTrue (IPAddress.Parse ("FE80::1").IsIPv6LinkLocal, "#1");
  500. Assert.IsTrue (IPAddress.Parse ("FE81::1").IsIPv6LinkLocal, "#2");
  501. Assert.IsFalse (IPAddress.Parse ("FD81::1").IsIPv6LinkLocal, "#3");
  502. Assert.IsFalse (IPAddress.Parse ("FF80::1").IsIPv6LinkLocal, "#4");
  503. Assert.IsTrue (IPAddress.Parse ("FE91::1").IsIPv6LinkLocal, "#5");
  504. Assert.IsTrue (IPAddress.Parse ("FEA0::1").IsIPv6LinkLocal, "#6");
  505. Assert.IsFalse (IPAddress.Parse ("FEC0::1").IsIPv6LinkLocal, "#7");
  506. }
  507. [Test]
  508. public void IsIPv6SiteLocal ()
  509. {
  510. Assert.IsTrue (IPAddress.Parse ("FEC0::1").IsIPv6SiteLocal, "#1");
  511. Assert.IsTrue (IPAddress.Parse ("FEC1::1").IsIPv6SiteLocal, "#2");
  512. Assert.IsFalse (IPAddress.Parse ("FE81::1").IsIPv6SiteLocal, "#3");
  513. Assert.IsFalse (IPAddress.Parse ("FFC0::1").IsIPv6SiteLocal, "#4");
  514. Assert.IsTrue (IPAddress.Parse ("FED1::1").IsIPv6SiteLocal, "#5");
  515. Assert.IsTrue (IPAddress.Parse ("FEE1::1").IsIPv6SiteLocal, "#6");
  516. }
  517. [Test]
  518. public void IsIPv6Multicast ()
  519. {
  520. Assert.IsTrue (IPAddress.Parse ("FF00::1").IsIPv6Multicast, "#1");
  521. Assert.IsTrue (IPAddress.Parse ("FF01::1").IsIPv6Multicast, "#2");
  522. Assert.IsFalse (IPAddress.Parse ("FE00::1").IsIPv6Multicast, "#3");
  523. }
  524. #endif
  525. }
  526. }