IPAddressTest.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  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. "::2", "0:0:0:0:0:0:0:2",
  29. "::F", "0:0:0:0:0:0:0:F",
  30. "::10", "0:0:0:0:0:0:0:10",
  31. "::A0", "0:0:0:0:0:0:0:A0",
  32. "::F0", "0:0:0:0:0:0:0:F0",
  33. "::FF", "0:0:0:0:0:0:0:FF",
  34. "::0.1.0.0", "0:0:0:0:0:0:1:0",
  35. "::0.2.0.0", "0:0:0:0:0:0:2:0",
  36. "::0.15.0.0", "0:0:0:0:0:0:F:0",
  37. "::0.16.0.0", "0:0:0:0:0:0:10:0",
  38. "::0.160.0.0", "0:0:0:0:0:0:A0:0",
  39. "::0.240.0.0", "0:0:0:0:0:0:F0:0",
  40. "::0.255.0.0", "0:0:0:0:0:0:FF:0",
  41. "::1001", "0:0:0:0:0:0:0:1001",
  42. "::1002", "0:0:0:0:0:0:0:1002",
  43. "::100F", "0:0:0:0:0:0:0:100F",
  44. "::1010", "0:0:0:0:0:0:0:1010",
  45. "::10A0", "0:0:0:0:0:0:0:10A0",
  46. "::10F0", "0:0:0:0:0:0:0:10F0",
  47. "::10FF", "0:0:0:0:0:0:0:10FF",
  48. "::0.1.0.1", "0:0:0:0:0:0:1:1",
  49. "::0.2.0.2", "0:0:0:0:0:0:2:2",
  50. "::0.15.0.15", "0:0:0:0:0:0:F:F",
  51. "::0.16.0.16", "0:0:0:0:0:0:10:10",
  52. "::0.160.0.160", "0:0:0:0:0:0:A0:A0",
  53. "::0.240.0.240", "0:0:0:0:0:0:F0:F0",
  54. "::0.255.0.255", "0:0:0:0:0:0:FF:FF",
  55. "::FFFF:0:1", "0:0:0:0:0:FFFF:0:1",
  56. "::FFFF:0:2", "0:0:0:0:0:FFFF:0:2",
  57. "::FFFF:0:F", "0:0:0:0:0:FFFF:0:F",
  58. "::FFFF:0:10", "0:0:0:0:0:FFFF:0:10",
  59. "::FFFF:0:A0", "0:0:0:0:0:FFFF:0:A0",
  60. "::FFFF:0:F0", "0:0:0:0:0:FFFF:0:F0",
  61. "::FFFF:0:FF", "0:0:0:0:0:FFFF:0:FF",
  62. "::FFFF:0.1.0.0", "0:0:0:0:0:FFFF:1:0",
  63. "::FFFF:0.2.0.0", "0:0:0:0:0:FFFF:2:0",
  64. "::FFFF:0.15.0.0", "0:0:0:0:0:FFFF:F:0",
  65. "::FFFF:0.16.0.0", "0:0:0:0:0:FFFF:10:0",
  66. "::FFFF:0.160.0.0", "0:0:0:0:0:FFFF:A0:0",
  67. "::FFFF:0.240.0.0", "0:0:0:0:0:FFFF:F0:0",
  68. "::FFFF:0.255.0.0", "0:0:0:0:0:FFFF:FF:0",
  69. "::FFFF:0:1001", "0:0:0:0:0:FFFF:0:1001",
  70. "::FFFF:0:1002", "0:0:0:0:0:FFFF:0:1002",
  71. "::FFFF:0:100F", "0:0:0:0:0:FFFF:0:100F",
  72. "::FFFF:0:1010", "0:0:0:0:0:FFFF:0:1010",
  73. "::FFFF:0:10A0", "0:0:0:0:0:FFFF:0:10A0",
  74. "::FFFF:0:10F0", "0:0:0:0:0:FFFF:0:10F0",
  75. "::FFFF:0:10FF", "0:0:0:0:0:FFFF:0:10FF",
  76. "::FFFF:0.1.0.1", "0:0:0:0:0:FFFF:1:1",
  77. "::FFFF:0.2.0.2", "0:0:0:0:0:FFFF:2:2",
  78. "::FFFF:0.15.0.15", "0:0:0:0:0:FFFF:F:F",
  79. "::FFFF:0.16.0.16", "0:0:0:0:0:FFFF:10:10",
  80. "::FFFF:0.160.0.160", "0:0:0:0:0:FFFF:A0:A0",
  81. "::FFFF:0.240.0.240", "0:0:0:0:0:FFFF:F0:F0",
  82. "::FFFF:0.255.0.255", "0:0:0:0:0:FFFF:FF:FF",
  83. "0:7:7:7:7:7:7:7", "0:7:7:7:7:7:7:7",
  84. "E::1", "E:0:0:0:0:0:0:1",
  85. "E::2:2", "E:0:0:0:0:0:2:2",
  86. "E:0:6:6:6:6:6:6", "E:0:6:6:6:6:6:6",
  87. "E:E::1", "E:E:0:0:0:0:0:1",
  88. "E:E::2:2", "E:E:0:0:0:0:2:2",
  89. "E:E:0:5:5:5:5:5", "E:E:0:5:5:5:5:5",
  90. "E:E:E::1", "E:E:E:0:0:0:0:1",
  91. "E:E:E::2:2", "E:E:E:0:0:0:2:2",
  92. "E:E:E:0:4:4:4:4", "E:E:E:0:4:4:4:4",
  93. "E:E:E:E::1", "E:E:E:E:0:0:0:1",
  94. "E:E:E:E::2:2", "E:E:E:E:0:0:2:2",
  95. "E:E:E:E:0:3:3:3", "E:E:E:E:0:3:3:3",
  96. "E:E:E:E:E::1", "E:E:E:E:E:0:0:1",
  97. "E:E:E:E:E:0:2:2", "E:E:E:E:E:0:2:2",
  98. "E:E:E:E:E:E:0:1", "E:E:E:E:E:E:0:1",
  99. "::0.2.0.2", "0:0:0:0:0:0:2:2",
  100. "::FFFF:192.168.0.1", "::FFFF:192.168.0.1",
  101. "::FFFF:0.168.0.1", "::FFFF:0.168.0.1",
  102. "::FFFF", "::0.0.255.255",
  103. "::EEEE:A00:1", "::EEEE:10.0.0.1",
  104. "::10.0.0.1", "::10.0.0.1",
  105. "1234::1234:0:0", "1234:0:0:0:0:1234:0:0",
  106. "1:0:1:0:1:0:1:0", "1:0:1:0:1:0:1:0",
  107. "1:1:1::1:1:0", "1:1:1:0:0:1:1:0",
  108. "::1234:0:0", "0:0:0:0:0:1234:0:0",
  109. "3ffe:38e1::100:1:1", "3ffe:38e1::0100:1:0001",
  110. "0:0:1:2::", "0:0:1:2:00:00:000:0000",
  111. "100:0:1:2::abcd", "100:0:1:2:0:0:000:abcd",
  112. "ffff::abcd", "ffff:0:0:0:0:0:00:abcd",
  113. "ffff:0:0:2::abcd", "ffff:0:0:2:0:0:00:abcd",
  114. "0:0:1:2::", "0:0:1:2:0:00:0000:0000",
  115. "::1:0:0", "0000:0000::1:0000:0000",
  116. "::111:234:5:6:789a:0", "0:0:111:234:5:6:789A:0",
  117. "11:22:33:44:55:66:77:8", "11:22:33:44:55:66:77:8",
  118. "0:0:7711:ab42:1230::", "::7711:ab42:1230:0:0:0",
  119. "fec0:0:0:ffff::1%1",
  120. };
  121. static string[] ipv6ParseWrong = new string[] {
  122. ":::4df",
  123. "4df:::",
  124. "0:::4df",
  125. "4df:::0",
  126. "::4df:::",
  127. "0::4df:::",
  128. " ::1",
  129. ":: 1",
  130. ":",
  131. "0:0:0:0:0:0:0:0:0",
  132. "0:0:0:0:0:0:0",
  133. "0FFFF::",
  134. "FFFF0::",
  135. "[::1",
  136. };
  137. static string[] ipv4ParseOk = new string[] {
  138. "192.168.1.1", "192.168.1.1",
  139. "0xff.0x7f.0x20.0x01", "255.127.32.1",
  140. "0xff.0x7f.0x20.0xf", "255.127.32.15",
  141. "0.0.0.0", IPAddress.Any.ToString(),
  142. "255.255.255.255", IPAddress.Broadcast.ToString(),
  143. "12.1.1.3 abc", "12.1.1.3",
  144. "12.1 .1.2", "12.0.0.1",
  145. "12.1 .zzzz.2", "12.0.0.1",
  146. "12.1.7", "12.1.0.7",
  147. "12", "0.0.0.12",
  148. "12.5.3 foo.67.test.test.7FFFFFFFFFfaFFF789FFFFFFFFFFFFFFF", "12.5.0.3",
  149. "12.1 foo.bar.test.test.baf", "12.0.0.1",
  150. "12.1.4.6 foo.bar.test.test.baf", "12.1.4.6",
  151. "12.3 foo.bar.test.test.4", "12.0.0.3",
  152. "12 foo.bar.test.test.baf", "0.0.0.12",
  153. "65536", "0.1.0.0",
  154. "65535", "0.0.255.255",
  155. "20.65535", "20.0.255.255",
  156. "0313.027035210", "203.92.58.136", // bug #411920
  157. "0313.0134.035210", "203.92.58.136", // too
  158. "1434328179", "85.126.28.115", // too
  159. "3397943208", "202.136.127.168", // too
  160. };
  161. static string [] ipv4ParseWrong = new string [] {
  162. " foo",
  163. "12.. .",
  164. "12.1.2. ",
  165. "12.1.8. ",
  166. ".1.1.6",
  167. " 12.1.1.1",
  168. "12.+1.1.4",
  169. "12.1.-1.5",
  170. "257.1.1.9",
  171. "255.1.1.256",
  172. "12.1.1.3 ",
  173. "12.1 foo.1.2.3.4.5.bar",
  174. "12.1 foo.1.2.3.4.5.",
  175. "12.1.1.3 g",
  176. " ",
  177. "",
  178. "12.1.foo.1.2.3.4.5.bar",
  179. "12.",
  180. "12.1.2.",
  181. "12...",
  182. " ",
  183. "7848198702",
  184. };
  185. static byte [] ipv4MappedIPv6Prefix = new byte [] { 0,0, 0,0, 0,0, 0,0, 0,0, 0xFF,0xFF };
  186. [Test]
  187. public void PublicFields ()
  188. {
  189. Assert.AreEqual ((long) 0, IPAddress.Any.Address, "#1");
  190. Assert.AreEqual ((long) 0xFFFFFFFF, IPAddress.Broadcast.Address, "#2");
  191. long loopback = IPAddress.HostToNetworkOrder (BitConverter.IsLittleEndian ?
  192. 0x7f000001 :
  193. 0x0100007f);
  194. Assert.AreEqual (loopback, IPAddress.Loopback.Address, "#3");
  195. Assert.AreEqual ((long) 0xFFFFFFFF, IPAddress.None.Address, "#4");
  196. }
  197. [Test]
  198. public void ToStringV4 ()
  199. {
  200. IPAddress ip = IPAddress.Parse ("192.168.1.1");
  201. Assert.AreEqual ("192.168.1.1", ip.ToString (), "#1");
  202. Assert.AreEqual ("0.0.0.0", IPAddress.Any.ToString (), "#2");
  203. Assert.AreEqual ("255.255.255.255", IPAddress.Broadcast.ToString (), "#3");
  204. Assert.AreEqual ("127.0.0.1", IPAddress.Loopback.ToString (), "#4");
  205. Assert.AreEqual ("255.255.255.255", IPAddress.None.ToString (), "#5");
  206. }
  207. [Test]
  208. public void ToStringV6 ()
  209. {
  210. for(int i=0; i<ipv6AddressList.Length/2; i++) {
  211. string addr = IPAddress.Parse (ipv6AddressList[i*2+1]).ToString().ToLower();
  212. Assert.AreEqual (ipv6AddressList[i*2].ToLower(), addr, "ToStringIPv6 #" + i);
  213. }
  214. }
  215. [Test]
  216. public void IsLoopbackV4 ()
  217. {
  218. IPAddress ip;
  219. ip = IPAddress.Parse ("127.0.0.1");
  220. Assert.IsTrue (IPAddress.IsLoopback (ip), "#1");
  221. ip = IPAddress.Any;
  222. Assert.IsFalse (IPAddress.IsLoopback (ip), "#2");
  223. ip = IPAddress.Loopback;
  224. Assert.IsTrue (IPAddress.IsLoopback (ip), "#3");
  225. ip = IPAddress.Parse ("::101");
  226. Assert.IsFalse (IPAddress.IsLoopback (ip), "#4");
  227. }
  228. [Test]
  229. public void IsLoopbackV6 ()
  230. {
  231. if (!Socket.SupportsIPv6)
  232. Assert.Ignore ("IPv6 must be enabled in machine.config");
  233. IPAddress ip = IPAddress.IPv6Loopback;
  234. Assert.IsTrue (IPAddress.IsLoopback (ip), "#1");
  235. ip = IPAddress.IPv6None;
  236. Assert.IsFalse (IPAddress.IsLoopback (ip), "#2");
  237. }
  238. [Test]
  239. public void GetAddressBytesV4 ()
  240. {
  241. byte[] dataIn = { 10, 11, 12, 13 };
  242. byte[] dataOut = IPAddress.Parse ("10.11.12.13").GetAddressBytes ();
  243. for (int i = 0; i < dataIn.Length; i++)
  244. Assert.AreEqual (dataOut [i], dataIn [i], "GetAddressBytesV4");
  245. }
  246. [Test]
  247. public void GetAddressBytesV6 ()
  248. {
  249. byte[] dataIn = new byte[]{ 0x01, 0x23, 0x45, 0x67, 0x89, 0x98, 0x76, 0x54, 0x32, 0x10, 0x01, 0x23, 0x45, 0x67, 0x89, 0x98 };
  250. byte[] dataOut = IPAddress.Parse ("123:4567:8998:7654:3210:0123:4567:8998").GetAddressBytes ();
  251. for (int i = 0; i < dataIn.Length; i++)
  252. Assert.AreEqual (dataOut [i], dataIn [i], "GetAddressBytesV6 #1");
  253. dataIn = new byte[]{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x01 };
  254. dataOut = IPAddress.Parse ("::FFFF:127.0.0.1").GetAddressBytes ();
  255. for (int i = 0; i < dataIn.Length; i++)
  256. Assert.AreEqual (dataOut [i], dataIn [i], "GetAddressBytesV6 #2");
  257. }
  258. [Test]
  259. public void Address ()
  260. {
  261. // hm, lame, anything is accepted by ms.net
  262. /*
  263. try {
  264. IPAddress ip1 = new IPAddress (0x0000000100000000);
  265. Assertion.Fail ("#1");
  266. } catch (ArgumentOutOfRangeException) {}
  267. IPAddress ip = IPAddress.Parse ("127.0.0.1");
  268. ip.Address = 0;
  269. ip.Address = 0xffffffff;
  270. try {
  271. ip.Address = -1;
  272. Assertion.Fail ("#2");
  273. } catch (ArgumentOutOfRangeException) {}
  274. try {
  275. ip.Address = 0x0000000100000000;
  276. Assertion.Fail ("#3");
  277. } catch (ArgumentOutOfRangeException) {}
  278. */
  279. }
  280. [Test]
  281. public void ParseOkV4 ()
  282. {
  283. for (int i = 0; i < ipv4ParseOk.Length / 2; i++) {
  284. IPAddress ip;
  285. try {
  286. ip = IPAddress.Parse (ipv4ParseOk [i*2]);
  287. Assert.AreEqual (ipv4ParseOk [i * 2 + 1], ip.ToString (), "ParseOkV4:" + i);
  288. } catch (FormatException) {
  289. Assert.Fail ("Cannot parse test i=" + i + ": '" + ipv4ParseOk [i*2] + "'");
  290. }
  291. }
  292. }
  293. [Test]
  294. public void ParseOkV6 ()
  295. {
  296. for (int i = 0; i < ipv6AddressList.Length / 2; i++) {
  297. string source = ipv6AddressList [i*2].ToLower();
  298. IPAddress ip = IPAddress.Parse (source);
  299. Assert.AreEqual (ip.ToString ().ToLower (), source,
  300. string.Format("ParseIPv6 #{0}-1: {1} != {2}", i,
  301. ip.ToString ().ToLower (), source));
  302. ip = IPAddress.Parse (ipv6AddressList [i*2+1].ToLower ());
  303. Assert.AreEqual (ip.ToString ().ToLower (), source,
  304. string.Format("ParseIPv6 #{0}-2: {1} != {2}", i,
  305. ip.ToString ().ToLower (), source));
  306. }
  307. }
  308. [Test]
  309. public void ParseWrongV4 ()
  310. {
  311. for (int i = 0; i < ipv4ParseWrong.Length; i++) {
  312. string ipAddress = ipv4ParseWrong [i];
  313. try {
  314. IPAddress ip = IPAddress.Parse (ipAddress);
  315. Assert.Fail ("#1:" + i + " (" + ipAddress + ")");
  316. } catch (FormatException ex) {
  317. Assert.AreEqual (typeof (FormatException), ex.GetType (), "#2:" + i);
  318. Assert.IsNull (ex.InnerException, "#3:" + i);
  319. Assert.IsNotNull (ex.Message, "#4:" + i);
  320. }
  321. }
  322. }
  323. [Test]
  324. public void Parse_IpString_Null ()
  325. {
  326. try {
  327. IPAddress.Parse ((string) null);
  328. Assert.Fail ("#1");
  329. } catch (ArgumentNullException ex) {
  330. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  331. Assert.IsNull (ex.InnerException, "#3");
  332. Assert.IsNotNull (ex.Message, "#4");
  333. Assert.AreEqual ("ipString", ex.ParamName, "#5");
  334. }
  335. }
  336. [Test]
  337. public void NetworkHost ()
  338. {
  339. long [] tested = new long [] { 0, 1, 1, 1};
  340. long [] expectedLE = new long [] {0, 256, 16777216, 72057594037927936 };
  341. long [] expected;
  342. expected = BitConverter.IsLittleEndian ? expectedLE : tested;
  343. short short0 = IPAddress.NetworkToHostOrder ((short) tested [0]);
  344. Assert.AreEqual ((short) expected [0], short0, "#A1");
  345. short0 = IPAddress.HostToNetworkOrder (short0);
  346. Assert.AreEqual ((short) tested [0], short0, "#A2");
  347. int int0 = IPAddress.NetworkToHostOrder ((int) tested [0]);
  348. Assert.AreEqual ((int) expected [0], int0, "#B1");
  349. int0 = IPAddress.HostToNetworkOrder (int0);
  350. Assert.AreEqual ((int) tested [0], int0, "#B2");
  351. long long0 = IPAddress.NetworkToHostOrder (tested [0]);
  352. Assert.AreEqual (expected [0], long0, "#C1");
  353. long0 = IPAddress.HostToNetworkOrder (long0);
  354. Assert.AreEqual (tested [0], long0, "#C2");
  355. short0 = IPAddress.NetworkToHostOrder ((short) tested [1]);
  356. Assert.AreEqual ((short) expected [1], short0, "#D1");
  357. short0 = IPAddress.HostToNetworkOrder (short0);
  358. Assert.AreEqual ((short) tested [1], short0, "#D2");
  359. int0 = IPAddress.NetworkToHostOrder ((int) tested [2]);
  360. Assert.AreEqual ((int) expected [2], int0, "#E1");
  361. int0 = IPAddress.HostToNetworkOrder (int0);
  362. Assert.AreEqual ((int) tested [2], int0, "#E2");
  363. long0 = IPAddress.NetworkToHostOrder (tested [3]);
  364. Assert.AreEqual (expected [3], long0, "#F1");
  365. long0 = IPAddress.HostToNetworkOrder (long0);
  366. Assert.AreEqual (tested [3], long0, "#F2");
  367. }
  368. [Test]
  369. public void LoopbackIPv6 ()
  370. {
  371. Assert.IsTrue (new Uri("http://[0:0:0:0::127.0.0.1]/").IsLoopback, "#1");
  372. Assert.IsFalse (new Uri ("http://[0:0:0:0::127.1.2.3]/").IsLoopback, "#2");
  373. Assert.IsTrue (new Uri ("http://[0:0:0:0::0.0.0.1]/").IsLoopback, "#3");
  374. }
  375. [Test] // bug #76792
  376. public void Constructor0_Address_4Byte ()
  377. {
  378. byte[] bytes = new byte[4] { 192, 202, 112, 37 };
  379. IPAddress i = new IPAddress (bytes);
  380. Assert.AreEqual (bytes, i.GetAddressBytes (), "#1");
  381. Assert.AreEqual ("192.202.112.37", i.ToString (), "#2");
  382. }
  383. [Test]
  384. public void Constructor0_Address_Invalid ()
  385. {
  386. try {
  387. new IPAddress (new byte [0]);
  388. Assert.Fail ("#A1");
  389. } catch (ArgumentException ex) {
  390. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  391. Assert.IsNull (ex.InnerException, "#A3");
  392. Assert.IsNotNull (ex.Message, "#A4");
  393. Assert.IsFalse (ex.Message == "address", ex.Message, "#A5");
  394. Assert.IsNotNull (ex.ParamName, "#A6");
  395. Assert.AreEqual ("address", ex.ParamName, "#A7");
  396. }
  397. try {
  398. new IPAddress (new byte [3] { 192, 202, 112 });
  399. Assert.Fail ("#B1");
  400. } catch (ArgumentException ex) {
  401. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
  402. Assert.IsNull (ex.InnerException, "#B3");
  403. Assert.IsNotNull (ex.Message, "#B4");
  404. Assert.IsFalse (ex.Message == "address", ex.Message, "#B5");
  405. Assert.IsNotNull (ex.ParamName, "#B6");
  406. Assert.AreEqual ("address", ex.ParamName, "#B7");
  407. }
  408. try {
  409. new IPAddress (new byte [5] { 192, 202, 112, 142, 25 });
  410. Assert.Fail ("#C1");
  411. } catch (ArgumentException ex) {
  412. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
  413. Assert.IsNull (ex.InnerException, "#C3");
  414. Assert.IsNotNull (ex.Message, "#C4");
  415. Assert.IsFalse (ex.Message == "address", "#C5");
  416. Assert.IsNotNull (ex.ParamName, "#C6");
  417. Assert.AreEqual ("address", ex.ParamName, "#C7");
  418. }
  419. }
  420. [Test]
  421. public void Constructor0_Address_Null ()
  422. {
  423. try {
  424. new IPAddress ((byte []) null);
  425. Assert.Fail ("#1");
  426. } catch (ArgumentNullException ex) {
  427. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  428. Assert.IsNull (ex.InnerException, "#3");
  429. Assert.IsNotNull (ex.Message, "#4");
  430. Assert.AreEqual ("address", ex.ParamName, "#5");
  431. }
  432. }
  433. [Test]
  434. public void Constructor1_Address_4Byte ()
  435. {
  436. byte [] bytes = new byte [4] { 192, 202, 112, 37 };
  437. try {
  438. new IPAddress (bytes, 0);
  439. Assert.Fail ("#1");
  440. } catch (ArgumentException ex) {
  441. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  442. Assert.IsNull (ex.InnerException, "#3");
  443. Assert.IsNotNull (ex.Message, "#4");
  444. Assert.IsFalse (ex.Message == "address", "#5");
  445. Assert.IsNotNull (ex.ParamName, "#6");
  446. Assert.AreEqual ("address", ex.ParamName, "#7");
  447. }
  448. }
  449. [Test]
  450. public void Constructor1_Address_Null ()
  451. {
  452. try {
  453. new IPAddress ((byte []) null, 5);
  454. Assert.Fail ("#1");
  455. } catch (ArgumentNullException ex) {
  456. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  457. Assert.IsNull (ex.InnerException, "#3");
  458. Assert.IsNotNull (ex.Message, "#4");
  459. Assert.AreEqual ("address", ex.ParamName, "#5");
  460. }
  461. }
  462. [Test]
  463. public void FromBytes1 ()
  464. {
  465. byte[] val1 = new byte[4];
  466. val1[0] = 82;
  467. val1[1] = 165;
  468. val1[2] = 240;
  469. val1[3] = 134;
  470. CompareIPs (val1, "82.165.240.134");
  471. byte[] val2 = new byte[4];
  472. val2[0] = 123;
  473. val2[1] = 124;
  474. val2[2] = 125;
  475. val2[3] = 126;
  476. CompareIPs (val2, "123.124.125.126");
  477. }
  478. void CompareIPs (byte [] bytes, string address)
  479. {
  480. IPAddress ip = new IPAddress (bytes);
  481. IPAddress ip2 = IPAddress.Parse (address);
  482. Assert.IsTrue (ip2.Equals (ip), "#A-" + address);
  483. Assert.IsTrue (ip.Equals (ip2), "#B-" + address);
  484. }
  485. [Test]
  486. public void TryParse_IpString_Null ()
  487. {
  488. IPAddress i;
  489. try {
  490. IPAddress.TryParse ((string) null, out i);
  491. Assert.Fail ("#1");
  492. } catch (ArgumentNullException ex) {
  493. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  494. Assert.IsNull (ex.InnerException, "#3");
  495. Assert.IsNotNull (ex.Message, "#4");
  496. Assert.AreEqual ("ipString", ex.ParamName, "#5");
  497. }
  498. }
  499. [Test]
  500. public void TryParse ()
  501. {
  502. IPAddress i;
  503. Assert.IsTrue (IPAddress.TryParse ("0.0.0.0", out i), "#1");
  504. Assert.IsTrue (IPAddress.TryParse ("127.0.0.1", out i), "#2");
  505. Assert.IsFalse (IPAddress.TryParse ("www.mono-project.com", out i), "#3");
  506. Assert.IsTrue (IPAddress.TryParse ("0001:0002:0003:0004:0005:0006:0007:0008", out i), "#4");
  507. Assert.IsTrue (IPAddress.TryParse ("1:2:3:4:5:6:7:8", out i), "#5");
  508. Assert.IsTrue (IPAddress.TryParse ("1::8", out i), "#6");
  509. Assert.IsTrue (IPAddress.TryParse ("1::3:4:5:6:7:8", out i), "#7");
  510. Assert.IsFalse (IPAddress.TryParse ("1::2:3:4:5::6:7:8", out i), "#8"); // :: ::
  511. Assert.IsFalse (IPAddress.TryParse ("1::2:3:4:5:6:7:8", out i), "#9");
  512. Assert.IsFalse (IPAddress.TryParse ("1;2:3:4:5:6:7:8", out i), "#10"); // ;
  513. // FIXME:
  514. // Assert.IsFalse (IPAddress.TryParse ("1:2:3:4:5:6:7:8/10", out i), "#11"); // subnet
  515. }
  516. [Test]
  517. public void TryParseOkV4 ()
  518. {
  519. for (int i = 0; i < ipv4ParseOk.Length / 2; i++) {
  520. IPAddress ip;
  521. Assert.IsTrue (IPAddress.TryParse (ipv4ParseOk [i * 2], out ip), "#1:" + i);
  522. Assert.AreEqual (ipv4ParseOk [i * 2 + 1], ip.ToString (), "#2:" + i);
  523. }
  524. }
  525. [Test]
  526. public void TryParseWrongV4 ()
  527. {
  528. for (int i = 0; i < ipv4ParseWrong.Length; i++) {
  529. IPAddress ip;
  530. string ipAddress = ipv4ParseWrong [i];
  531. Assert.IsFalse (IPAddress.TryParse (ipAddress, out ip), "#1:" + i);
  532. Assert.IsNull (ip, "#2:" + i);
  533. }
  534. }
  535. [Test]
  536. public void IsIPv6LinkLocal ()
  537. {
  538. Assert.IsTrue (IPAddress.Parse ("FE80::1").IsIPv6LinkLocal, "#1");
  539. Assert.IsTrue (IPAddress.Parse ("FE81::1").IsIPv6LinkLocal, "#2");
  540. Assert.IsFalse (IPAddress.Parse ("FD81::1").IsIPv6LinkLocal, "#3");
  541. Assert.IsFalse (IPAddress.Parse ("FF80::1").IsIPv6LinkLocal, "#4");
  542. Assert.IsTrue (IPAddress.Parse ("FE91::1").IsIPv6LinkLocal, "#5");
  543. Assert.IsTrue (IPAddress.Parse ("FEA0::1").IsIPv6LinkLocal, "#6");
  544. Assert.IsFalse (IPAddress.Parse ("FEC0::1").IsIPv6LinkLocal, "#7");
  545. }
  546. [Test]
  547. public void IsIPv6SiteLocal ()
  548. {
  549. Assert.IsTrue (IPAddress.Parse ("FEC0::1").IsIPv6SiteLocal, "#1");
  550. Assert.IsTrue (IPAddress.Parse ("FEC1::1").IsIPv6SiteLocal, "#2");
  551. Assert.IsFalse (IPAddress.Parse ("FE81::1").IsIPv6SiteLocal, "#3");
  552. Assert.IsFalse (IPAddress.Parse ("FFC0::1").IsIPv6SiteLocal, "#4");
  553. Assert.IsTrue (IPAddress.Parse ("FED1::1").IsIPv6SiteLocal, "#5");
  554. Assert.IsTrue (IPAddress.Parse ("FEE1::1").IsIPv6SiteLocal, "#6");
  555. }
  556. [Test]
  557. public void IsIPv6Multicast ()
  558. {
  559. Assert.IsTrue (IPAddress.Parse ("FF00::1").IsIPv6Multicast, "#1");
  560. Assert.IsTrue (IPAddress.Parse ("FF01::1").IsIPv6Multicast, "#2");
  561. Assert.IsFalse (IPAddress.Parse ("FE00::1").IsIPv6Multicast, "#3");
  562. }
  563. [Test]
  564. public void IsIPv6Teredo ()
  565. {
  566. Assert.IsTrue (IPAddress.Parse ("2001::1").IsIPv6Teredo, "#1");
  567. Assert.IsFalse (IPAddress.Parse ("2002::1").IsIPv6Teredo, "#2");
  568. }
  569. [Test]
  570. public void ParseWrongV6 ()
  571. {
  572. if (!Socket.SupportsIPv6)
  573. Assert.Ignore ("IPv6 must be enabled in machine.config");
  574. for (int i = 0; i < ipv6ParseWrong.Length; i++) {
  575. string ipAddress = ipv6ParseWrong [i];
  576. try {
  577. IPAddress ip = IPAddress.Parse (ipAddress);
  578. Assert.Fail ("#1:" + i + " (" + ipAddress + ")");
  579. } catch (FormatException ex) {
  580. Assert.AreEqual (typeof (FormatException), ex.GetType (), "#2:" + i);
  581. Assert.IsNull (ex.InnerException, "#3:" + i);
  582. Assert.IsNotNull (ex.Message, "#4:" + i);
  583. }
  584. }
  585. }
  586. #if NET_4_5
  587. [Test]
  588. public void MapToIPv6 ()
  589. {
  590. for (int i = 0; i < ipv4ParseOk.Length / 2; i++) {
  591. IPAddress v4 = IPAddress.Parse (ipv4ParseOk [i * 2]);
  592. byte [] v4bytes = v4.GetAddressBytes ();
  593. IPAddress v6 = v4.MapToIPv6 ();
  594. byte [] v6bytes = v6.GetAddressBytes ();
  595. IPAddress v4back = v6.MapToIPv4 ();
  596. Assert.IsTrue (StartsWith (v6bytes, ipv4MappedIPv6Prefix), "MapToIPv6 #" + i + ".1");
  597. Assert.IsTrue (v6bytes [12] == v4bytes [0], "MapToIPv6 #" + i + ".2");
  598. Assert.IsTrue (v6bytes [13] == v4bytes [1], "MapToIPv6 #" + i + ".3");
  599. Assert.IsTrue (v6bytes [14] == v4bytes [2], "MapToIPv6 #" + i + ".4");
  600. Assert.IsTrue (v6bytes [15] == v4bytes [3], "MapToIPv6 #" + i + ".5");
  601. Assert.IsTrue (v4.Equals (v4back), "MapToIPv4 #" + i);
  602. }
  603. //TODO: Test using MapToIPv4/6 with anything other than IPv4/6 addresses.
  604. //Currently it is not possible to do with the IPAddress implementation.
  605. }
  606. static bool StartsWith (byte [] a, byte [] b)
  607. {
  608. if (a.Length < b.Length)
  609. return false;
  610. for (int i = 0; i < b.Length; i++)
  611. {
  612. if (a [i] != b [i])
  613. return false;
  614. }
  615. return true;
  616. }
  617. #endif
  618. [Test]
  619. public void EqualsFromBytes ()
  620. {
  621. for (int i = 0; i < ipv4ParseOk.Length / 2; i++) {
  622. IPAddress ip = IPAddress.Parse (ipv4ParseOk [i * 2]);
  623. IPAddress ipFromBytes = new IPAddress (ip.GetAddressBytes ());
  624. Assert.IsTrue (ip.Equals (ipFromBytes), "EqualsFromBytes #" + i);
  625. }
  626. }
  627. }
  628. }