IPAddressTest.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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. "12.1.1.3 ", "12.1.1.3",
  72. "12.1 .1.2", "12.0.0.1",
  73. "12.1.7", "12.1.0.7",
  74. "12", "0.0.0.12",
  75. "12.1 foo.1.2.3.4.5.bar", "12.0.0.1",
  76. " ", "0.0.0.0"
  77. };
  78. static object[] ipv4ParseWrong = new object[] {
  79. " foo", typeof(FormatException),
  80. "12.. .", typeof(FormatException),
  81. "12.1.2. ", typeof(FormatException),
  82. "12.1.8. ", typeof(FormatException),
  83. ".1.1.6", typeof(FormatException),
  84. " 12.1.1.1", typeof(FormatException),
  85. "12.+1.1.4", typeof(FormatException),
  86. "12.1.-1.5", typeof(FormatException),
  87. "257.1.1.9", typeof(FormatException),
  88. "12.", typeof(FormatException),
  89. "12.1.2.", typeof(FormatException),
  90. "12...", typeof(FormatException),
  91. null, typeof(ArgumentNullException),
  92. };
  93. [Test]
  94. public void PublicFields ()
  95. {
  96. Assertion.AssertEquals ("Any", IPAddress.Any.Address, (long) 0);
  97. Assertion.AssertEquals ("Broadcast", IPAddress.Broadcast.Address, (long) 0xFFFFFFFF);
  98. long loopback = IPAddress.HostToNetworkOrder (BitConverter.IsLittleEndian ?
  99. 0x7f000001 :
  100. 0x0100007f);
  101. Assertion.AssertEquals ("Loopback", IPAddress.Loopback.Address, loopback);
  102. Assertion.AssertEquals ("None", IPAddress.None.Address, (long) 0xFFFFFFFF);
  103. }
  104. [Test]
  105. public void ToStringV4 ()
  106. {
  107. IPAddress ip = IPAddress.Parse ("192.168.1.1");
  108. Assertion.AssertEquals ("ToString #1", "192.168.1.1", ip.ToString ());
  109. Assertion.AssertEquals ("ToString #2", "0.0.0.0", IPAddress.Any.ToString ());
  110. Assertion.AssertEquals ("ToString #3", "255.255.255.255", IPAddress.Broadcast.ToString ());
  111. Assertion.AssertEquals ("ToString #4", "127.0.0.1", IPAddress.Loopback.ToString ());
  112. Assertion.AssertEquals ("ToString #5", "255.255.255.255", IPAddress.None.ToString ());
  113. }
  114. #if NET_1_1
  115. [Test]
  116. public void ToStringV6 ()
  117. {
  118. if (Socket.SupportsIPv6) {
  119. for(int i=0; i<ipv6AddressList.Length/2; i++) {
  120. string addr = IPAddress.Parse (ipv6AddressList[i*2+1]).ToString().ToLower();
  121. Assertion.AssertEquals ("ToStringIPv6 #" + i, ipv6AddressList[i*2].ToLower(), addr);
  122. }
  123. } else
  124. Assert.Ignore ("IPv6 must be enabled in machine.config");
  125. }
  126. #endif
  127. [Test]
  128. public void IsLoopbackV4 ()
  129. {
  130. IPAddress ip = IPAddress.Parse ("127.0.0.1");
  131. Assertion.AssertEquals ("IsLoopback #1", true, IPAddress.IsLoopback (ip));
  132. try {
  133. ip = IPAddress.Parse ("::101");
  134. Assertion.Fail ("#2 should have thrown a FormatException");
  135. } catch {
  136. }
  137. ip = IPAddress.Any;
  138. Assertion.AssertEquals ("IsLoopback #5", false, IPAddress.IsLoopback (ip));
  139. ip = IPAddress.Loopback;
  140. Assertion.AssertEquals ("IsLoopback #6", true, IPAddress.IsLoopback (ip));
  141. }
  142. #if NET_1_1
  143. [Test]
  144. public void IsLoopbackV6 ()
  145. {
  146. if (Socket.SupportsIPv6) {
  147. IPAddress ip = IPAddress.IPv6Loopback;
  148. Assertion.AssertEquals ("IsLoopback #3", true, IPAddress.IsLoopback (ip));
  149. ip = IPAddress.IPv6None;
  150. Assertion.AssertEquals ("IsLoopback #7", false, IPAddress.IsLoopback (ip));
  151. } else
  152. Assert.Ignore ("IPv6 must be enabled in machine.config");
  153. }
  154. [Test]
  155. public void GetAddressBytesV4 ()
  156. {
  157. byte[] dataIn = { 10, 11, 12, 13 };
  158. byte[] dataOut = IPAddress.Parse ("10.11.12.13").GetAddressBytes ();
  159. for(int i=0; i<dataIn.Length; i++)
  160. Assertion.AssertEquals ("GetAddressBytes #1", dataIn[i], dataOut[i]);
  161. }
  162. [Test]
  163. public void GetAddressBytesV6 ()
  164. {
  165. if (!Socket.SupportsIPv6) {
  166. Assert.Ignore ("IPv6 must be enabled in machine.config");
  167. return;
  168. }
  169. byte[] dataIn = new byte[]{ 0x01, 0x23, 0x45, 0x67, 0x89, 0x98, 0x76, 0x54, 0x32, 0x10, 0x01, 0x23, 0x45, 0x67, 0x89, 0x98 };
  170. byte[] dataOut = IPAddress.Parse ("123:4567:8998:7654:3210:0123:4567:8998").GetAddressBytes ();
  171. for(int i=0; i<dataIn.Length; i++)
  172. Assertion.AssertEquals ("GetAddressBytes #2", dataIn[i], dataOut[i]);
  173. dataIn = new byte[]{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x01 };
  174. dataOut = IPAddress.Parse ("::FFFF:127.0.0.1").GetAddressBytes ();
  175. for(int i=0; i<dataIn.Length; i++)
  176. Assertion.AssertEquals ("GetAddressBytes #3", dataIn[i], dataOut[i]);
  177. }
  178. #endif
  179. [Test]
  180. public void Address ()
  181. {
  182. // hm, lame, anything is accepted by ms.net
  183. /*
  184. try {
  185. IPAddress ip1 = new IPAddress (0x0000000100000000);
  186. Assertion.Fail ("#1");
  187. } catch (ArgumentOutOfRangeException) {}
  188. IPAddress ip = IPAddress.Parse ("127.0.0.1");
  189. ip.Address = 0;
  190. ip.Address = 0xffffffff;
  191. try {
  192. ip.Address = -1;
  193. Assertion.Fail ("#2");
  194. } catch (ArgumentOutOfRangeException) {}
  195. try {
  196. ip.Address = 0x0000000100000000;
  197. Assertion.Fail ("#3");
  198. } catch (ArgumentOutOfRangeException) {}
  199. */
  200. }
  201. [Test]
  202. [Category ("NotDotNet")] // #5 fails
  203. public void ParseOkV4 ()
  204. {
  205. for(int i=0; i<ipv4ParseOk.Length / 2; i++) {
  206. IPAddress ip;
  207. try
  208. {
  209. ip = IPAddress.Parse (ipv4ParseOk [i*2]);
  210. Assertion.Assert ("ParseIPv4 #" + i, ip.ToString () == ipv4ParseOk [i*2+1]);
  211. }
  212. catch
  213. {
  214. Assertion.Fail ("Cannot parse test i=" + i + ": '" + ipv4ParseOk [i*2] + "'");
  215. }
  216. }
  217. }
  218. #if NET_1_1
  219. [Test]
  220. public void ParseOkV6 ()
  221. {
  222. if (!Socket.SupportsIPv6) {
  223. Assert.Ignore ("IPv6 must be enabled in machine.config");
  224. return;
  225. }
  226. for(int i=0; i<ipv6AddressList.Length / 2; i++) {
  227. string source = ipv6AddressList [i*2].ToLower();
  228. IPAddress ip = IPAddress.Parse (source);
  229. Assertion.Assert (string.Format("ParseIPv6 #{0}-1: {1} != {2}", i,
  230. ip.ToString ().ToLower (), source), ip.ToString ().ToLower () == source);
  231. ip = IPAddress.Parse (ipv6AddressList [i*2+1].ToLower ());
  232. Assertion.Assert (string.Format("ParseIPv6 #{0}-2: {1} != {2}", i,
  233. ip.ToString ().ToLower (), source), ip.ToString ().ToLower () == source);
  234. }
  235. }
  236. #endif
  237. [Test]
  238. public void ParseWrong ()
  239. {
  240. for(int i=0; i<ipv4ParseWrong.Length/2; i++) {
  241. Type exception = ipv4ParseWrong[i*2+1] as Type;
  242. string ipAddress = ipv4ParseWrong[i*2] as string;
  243. try {
  244. IPAddress ip = IPAddress.Parse (ipAddress);
  245. Assertion.Fail ("IPv4: Should raise a " + exception + " #" + i);
  246. }
  247. catch (Exception e) {
  248. if(!e.GetType ().Equals (exception))
  249. Assertion.Fail ("ParseWrongIPv4 #" + i + ": " + e.ToString());
  250. }
  251. }
  252. }
  253. [Test]
  254. public void NetworkHost ()
  255. {
  256. long [] tested = new long [] { 0, 1, 1, 1};
  257. long [] expectedLE = new long [] {0, 256, 16777216, 72057594037927936 };
  258. long [] expected;
  259. expected = BitConverter.IsLittleEndian ? expectedLE : tested;
  260. short short0 = IPAddress.NetworkToHostOrder ((short) tested [0]);
  261. Assertion.AssertEquals ("NetworkToHostOrder #1", short0, (short) expected [0]);
  262. short0 = IPAddress.HostToNetworkOrder (short0);
  263. Assertion.AssertEquals ("HostToNetworkOrder #1", short0, (short) tested [0]);
  264. int int0 = IPAddress.NetworkToHostOrder ((int) tested [0]);
  265. Assertion.AssertEquals ("NetworkToHostOrder #2", int0, (int) expected [0]);
  266. int0 = IPAddress.HostToNetworkOrder (int0);
  267. Assertion.AssertEquals ("HostToNetworkOrder #2", int0, (int) tested [0]);
  268. long long0 = IPAddress.NetworkToHostOrder (tested [0]);
  269. Assertion.AssertEquals ("NetworkToHostOrder #3", long0, expected [0]);
  270. long0 = IPAddress.HostToNetworkOrder (long0);
  271. Assertion.AssertEquals ("HostToNetworkOrder #3", long0, tested [0]);
  272. short0 = IPAddress.NetworkToHostOrder ((short) tested [1]);
  273. Assertion.AssertEquals ("NetworkToHostOrder #4", short0, (short) expected [1]);
  274. short0 = IPAddress.HostToNetworkOrder (short0);
  275. Assertion.AssertEquals ("HostToNetworkOrder #4", short0, (short) tested [1]);
  276. int0 = IPAddress.NetworkToHostOrder ((int) tested [2]);
  277. Assertion.AssertEquals ("NetworkToHostOrder #5", int0, (int) expected [2]);
  278. int0 = IPAddress.HostToNetworkOrder (int0);
  279. Assertion.AssertEquals ("HostToNetworkOrder #5", int0, (int) tested [2]);
  280. long0 = IPAddress.NetworkToHostOrder (tested [3]);
  281. Assertion.AssertEquals ("NetworkToHostOrder #6", long0, expected [3]);
  282. long0 = IPAddress.HostToNetworkOrder (long0);
  283. Assertion.AssertEquals ("HostToNetworkOrder #6", long0, tested [3]);
  284. }
  285. [Test]
  286. public void LoopbackIPv6 ()
  287. {
  288. Assertion.AssertEquals ("#01", true, new Uri("http://[0:0:0:0::127.0.0.1]/").IsLoopback);
  289. Assertion.AssertEquals ("#02", false, new Uri("http://[0:0:0:0::127.1.2.3]/").IsLoopback);
  290. Assertion.AssertEquals ("#03", true, new Uri("http://[0:0:0:0::0.0.0.1]/").IsLoopback);
  291. }
  292. [Test] // bug #76792
  293. public void Constructor0_Address_4Byte ()
  294. {
  295. byte[] bytes = new byte[4] { 192, 202, 112, 37 };
  296. #if NET_2_0
  297. IPAddress i = new IPAddress (bytes);
  298. Assert.AreEqual (bytes, i.GetAddressBytes (), "#1");
  299. Assert.AreEqual ("192.202.112.37", i.ToString (), "#2");
  300. #else
  301. try {
  302. new IPAddress (bytes);
  303. Assert.Fail ("#1");
  304. } catch (ArgumentException ex) {
  305. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  306. Assert.IsNotNull (ex.Message, "#3");
  307. Assert.AreEqual ("address", ex.Message, "#4");
  308. Assert.IsNull (ex.ParamName, "#5");
  309. Assert.IsNull (ex.InnerException, "#6");
  310. }
  311. #endif
  312. }
  313. [Test]
  314. #if TARGET_JVM
  315. [Ignore ("TD BUG ID: 7213")]
  316. #endif
  317. public void Constructor0_Address_Invalid ()
  318. {
  319. try {
  320. new IPAddress (new byte [0]);
  321. Assert.Fail ("#A1");
  322. } catch (ArgumentException ex) {
  323. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  324. Assert.IsNull (ex.InnerException, "#A3");
  325. Assert.IsNotNull (ex.Message, "#A4");
  326. #if NET_2_0
  327. Assert.IsFalse (ex.Message == "address", ex.Message, "#A5");
  328. Assert.IsNotNull (ex.ParamName, "#A6");
  329. Assert.AreEqual ("address", ex.ParamName, "#A7");
  330. #else
  331. Assert.AreEqual ("address", ex.Message, "#A5");
  332. Assert.IsNull (ex.ParamName, "#A6");
  333. #endif
  334. }
  335. try {
  336. new IPAddress (new byte [3] { 192, 202, 112 });
  337. Assert.Fail ("#B1");
  338. } catch (ArgumentException ex) {
  339. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
  340. Assert.IsNull (ex.InnerException, "#B3");
  341. Assert.IsNotNull (ex.Message, "#B4");
  342. #if NET_2_0
  343. Assert.IsFalse (ex.Message == "address", ex.Message, "#B5");
  344. Assert.IsNotNull (ex.ParamName, "#B6");
  345. Assert.AreEqual ("address", ex.ParamName, "#B7");
  346. #else
  347. Assert.AreEqual ("address", ex.Message, "#B5");
  348. Assert.IsNull (ex.ParamName, "#B6");
  349. #endif
  350. }
  351. try {
  352. new IPAddress (new byte [5] { 192, 202, 112, 142, 25 });
  353. Assert.Fail ("#C1");
  354. } catch (ArgumentException ex) {
  355. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
  356. Assert.IsNull (ex.InnerException, "#C3");
  357. Assert.IsNotNull (ex.Message, "#C4");
  358. #if NET_2_0
  359. Assert.IsFalse (ex.Message == "address", "#C5");
  360. Assert.IsNotNull (ex.ParamName, "#C6");
  361. Assert.AreEqual ("address", ex.ParamName, "#C7");
  362. #else
  363. Assert.AreEqual ("address", ex.Message, "#C5");
  364. Assert.IsNull (ex.ParamName, "#C6");
  365. #endif
  366. }
  367. }
  368. [Test]
  369. [ExpectedException (typeof (ArgumentNullException))]
  370. public void Constructor0_Address_Null ()
  371. {
  372. new IPAddress ((byte []) null);
  373. }
  374. [Test]
  375. #if TARGET_JVM
  376. [Ignore ("TD BUG ID: 7213")]
  377. #endif
  378. public void Constructor1_Address_4Byte ()
  379. {
  380. byte [] bytes = new byte [4] { 192, 202, 112, 37 };
  381. try {
  382. new IPAddress (bytes, 0);
  383. Assert.Fail ("#1");
  384. } catch (ArgumentException ex) {
  385. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  386. Assert.IsNull (ex.InnerException, "#3");
  387. Assert.IsNotNull (ex.Message, "#4");
  388. #if NET_2_0
  389. Assert.IsFalse (ex.Message == "address", "#5");
  390. Assert.IsNotNull (ex.ParamName, "#6");
  391. Assert.AreEqual ("address", ex.ParamName, "#7");
  392. #else
  393. Assert.AreEqual ("address", ex.Message, "#5");
  394. Assert.IsNull (ex.ParamName, "#6");
  395. #endif
  396. }
  397. }
  398. [Test]
  399. [ExpectedException (typeof (ArgumentNullException))]
  400. public void Constructor1_Address_Null ()
  401. {
  402. new IPAddress ((byte []) null, 5);
  403. }
  404. #if NET_2_0
  405. [Test]
  406. [ExpectedException (typeof (ArgumentNullException))]
  407. public void TryParseArgumentNull ()
  408. {
  409. IPAddress i;
  410. IPAddress.TryParse (null, out i);
  411. }
  412. [Test]
  413. public void TryParse ()
  414. {
  415. IPAddress i;
  416. Assert.IsTrue (IPAddress.TryParse ("0.0.0.0", out i), "#1");
  417. Assert.IsTrue (IPAddress.TryParse ("127.0.0.1", out i), "#2");
  418. Assert.IsFalse (IPAddress.TryParse ("www.mono-project.com", out i), "#3");
  419. Assert.IsTrue (IPAddress.TryParse ("0001:0002:0003:0004:0005:0006:0007:0008", out i), "#4");
  420. Assert.IsTrue (IPAddress.TryParse ("1:2:3:4:5:6:7:8", out i), "#5");
  421. Assert.IsTrue (IPAddress.TryParse ("1::8", out i), "#6");
  422. Assert.IsTrue (IPAddress.TryParse ("1::3:4:5:6:7:8", out i), "#7");
  423. Assert.IsFalse (IPAddress.TryParse ("1::2:3:4:5::6:7:8", out i), "#8"); // :: ::
  424. Assert.IsFalse (IPAddress.TryParse ("1::2:3:4:5:6:7:8", out i), "#9");
  425. Assert.IsFalse (IPAddress.TryParse ("1;2:3:4:5:6:7:8", out i), "#10"); // ;
  426. // FIXME:
  427. // Assert.IsFalse (IPAddress.TryParse ("1:2:3:4:5:6:7:8/10", out i), "#11"); // subnet
  428. }
  429. [Test]
  430. public void IsIPv6LinkLocal ()
  431. {
  432. Assert.IsTrue (IPAddress.Parse ("FE80::1").IsIPv6LinkLocal, "#1");
  433. Assert.IsTrue (IPAddress.Parse ("FE81::1").IsIPv6LinkLocal, "#2");
  434. Assert.IsFalse (IPAddress.Parse ("FD81::1").IsIPv6LinkLocal, "#3");
  435. Assert.IsFalse (IPAddress.Parse ("FF80::1").IsIPv6LinkLocal, "#4");
  436. Assert.IsTrue (IPAddress.Parse ("FE91::1").IsIPv6LinkLocal, "#5");
  437. Assert.IsTrue (IPAddress.Parse ("FEA0::1").IsIPv6LinkLocal, "#6");
  438. Assert.IsFalse (IPAddress.Parse ("FEC0::1").IsIPv6LinkLocal, "#7");
  439. }
  440. [Test]
  441. public void IsIPv6SiteLocal ()
  442. {
  443. Assert.IsTrue (IPAddress.Parse ("FEC0::1").IsIPv6SiteLocal, "#1");
  444. Assert.IsTrue (IPAddress.Parse ("FEC1::1").IsIPv6SiteLocal, "#2");
  445. Assert.IsFalse (IPAddress.Parse ("FE81::1").IsIPv6SiteLocal, "#3");
  446. Assert.IsFalse (IPAddress.Parse ("FFC0::1").IsIPv6SiteLocal, "#4");
  447. Assert.IsTrue (IPAddress.Parse ("FED1::1").IsIPv6SiteLocal, "#5");
  448. Assert.IsTrue (IPAddress.Parse ("FEE1::1").IsIPv6SiteLocal, "#6");
  449. }
  450. [Test]
  451. public void IsIPv6Multicast ()
  452. {
  453. Assert.IsTrue (IPAddress.Parse ("FF00::1").IsIPv6Multicast, "#1");
  454. Assert.IsTrue (IPAddress.Parse ("FF01::1").IsIPv6Multicast, "#2");
  455. Assert.IsFalse (IPAddress.Parse ("FE00::1").IsIPv6Multicast, "#3");
  456. }
  457. #endif
  458. }
  459. }