1 // DnsTest.cs - NUnit Test Cases for the System.Net.Dns class
\r
4 // Mads Pultz (mpultz@diku.dk)
\r
5 // Martin Willemoes Hansen (mwh@sysrq.dk)
\r
7 // (C) 2001 Mads Pultz
\r
8 // (C) 2003 Martin Willemoes Hansen
\r
14 using System.Net.Sockets;
\r
15 using System.Threading;
\r
17 using NUnit.Framework;
\r
19 namespace MonoTests.System.Net
\r
22 public class DnsTest
\r
24 private String site1Name = "google-public-dns-a.google.com",
\r
25 site1Dot = "8.8.8.8",
\r
26 site2Name = "google-public-dns-b.google.com",
\r
27 site2Dot = "8.8.4.4",
\r
28 noneExistingSite = "unlikely.xamarin.com";
\r
29 private uint site1IP = 134744072, site2IP = 134743044; // Big-Endian
\r
32 #if FEATURE_NO_BSD_SOCKETS
\r
33 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
35 public void AsyncGetHostByName ()
\r
37 IAsyncResult async = Dns.BeginGetHostByName (site1Name, null, null);
\r
38 IPHostEntry entry = Dns.EndGetHostByName (async);
\r
39 SubTestValidIPHostEntry (entry);
\r
40 Assert.AreEqual ("google-public-dns-a.google.com", entry.HostName, "#1");
\r
44 #if FEATURE_NO_BSD_SOCKETS
\r
45 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
47 public void AsyncGetHostByNameCallback ()
\r
49 var evt = new ManualResetEvent (false);
\r
50 Exception ex = null;
\r
51 Dns.BeginGetHostByName (site1Name, new AsyncCallback ((IAsyncResult ar) =>
\r
55 h = Dns.EndGetHostByName (ar);
\r
56 SubTestValidIPHostEntry (h);
\r
57 } catch (Exception e) {
\r
64 Assert.IsTrue (evt.WaitOne (TimeSpan.FromSeconds (60)), "Wait");
\r
65 Assert.IsNull (ex, "Exception");
\r
69 #if FEATURE_NO_BSD_SOCKETS
\r
70 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
72 public void AsyncResolve ()
\r
74 IAsyncResult async = Dns.BeginResolve (site1Dot, null, null);
\r
75 IPHostEntry entry = Dns.EndResolve (async);
\r
76 SubTestValidIPHostEntry (entry);
\r
77 var ip = GetIPv4Address (entry);
\r
78 Assert.AreEqual (site1Dot, ip.ToString ());
\r
82 #if FEATURE_NO_BSD_SOCKETS
\r
83 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
85 public void AsyncResolveCallback ()
\r
87 var evt = new ManualResetEvent (false);
\r
88 Exception ex = null;
\r
89 Dns.BeginResolve (site1Name, new AsyncCallback ((IAsyncResult ar) =>
\r
92 IPHostEntry h = Dns.EndResolve (ar);
\r
93 SubTestValidIPHostEntry (h);
\r
94 } catch (Exception e) {
\r
101 Assert.IsTrue (evt.WaitOne (TimeSpan.FromSeconds (60)), "Wait");
\r
102 Assert.IsNull (ex, "Exception");
\r
106 public void BeginGetHostAddresses_HostNameOrAddress_Null ()
\r
109 Dns.BeginGetHostAddresses (
\r
111 new AsyncCallback (ShouldntBeCalled),
\r
113 Assert.Fail ("#1");
\r
114 } catch (ArgumentNullException ex) {
\r
115 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
116 Assert.IsNull (ex.InnerException, "#3");
\r
117 Assert.IsNotNull (ex.Message, "#4");
\r
118 Assert.AreEqual ("hostName", ex.ParamName, "#5");
\r
123 public void BeginGetHostAddresses_HostNameOrAddress_UnspecifiedAddress ()
\r
127 Dns.BeginGetHostAddresses (
\r
129 new AsyncCallback (ShouldntBeCalled),
\r
131 Assert.Fail ("#A1");
\r
132 } catch (ArgumentException ex) {
\r
133 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
134 // unspecified addresses that cannot be used as
\r
135 // a target address
\r
136 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
\r
137 Assert.IsNull (ex.InnerException, "#A3");
\r
138 Assert.IsNotNull (ex.Message, "#A4");
\r
139 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#A5");
\r
144 Dns.BeginGetHostAddresses (
\r
146 new AsyncCallback (ShouldntBeCalled),
\r
148 Assert.Fail ("#B1");
\r
149 } catch (ArgumentException ex) {
\r
150 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
151 // unspecified addresses that cannot be used as
\r
152 // a target address
\r
153 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
\r
154 Assert.IsNull (ex.InnerException, "#B3");
\r
155 Assert.IsNotNull (ex.Message, "#B4");
\r
156 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#B5");
\r
160 void ShouldntBeCalled (IAsyncResult ar)
\r
162 Assert.Fail ("Should not be called");
\r
166 public void GetHostAddresses_HostNameOrAddress_Null ()
\r
169 Dns.GetHostAddresses ((string) null);
\r
170 Assert.Fail ("#1");
\r
171 } catch (ArgumentNullException ex) {
\r
172 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
173 Assert.IsNull (ex.InnerException, "#3");
\r
174 Assert.IsNotNull (ex.Message, "#4");
\r
175 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#5");
\r
180 public void GetHostAddresses_HostNameOrAddress_UnspecifiedAddress ()
\r
184 Dns.GetHostAddresses ("0.0.0.0");
\r
185 Assert.Fail ("#A1");
\r
186 } catch (ArgumentException ex) {
\r
187 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
188 // unspecified addresses that cannot be used as
\r
189 // a target address
\r
190 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
\r
191 Assert.IsNull (ex.InnerException, "#A3");
\r
192 Assert.IsNotNull (ex.Message, "#A4");
\r
193 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#A5");
\r
198 Dns.GetHostAddresses ("::0");
\r
199 Assert.Fail ("#B1");
\r
200 } catch (ArgumentException ex) {
\r
201 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
202 // unspecified addresses that cannot be used as
\r
203 // a target address
\r
204 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
\r
205 Assert.IsNull (ex.InnerException, "#B3");
\r
206 Assert.IsNotNull (ex.Message, "#B4");
\r
207 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#B5");
\r
212 public void GetHostName ()
\r
214 string hostName = Dns.GetHostName ();
\r
215 Assert.IsNotNull (hostName);
\r
219 #if FEATURE_NO_BSD_SOCKETS
\r
220 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
222 [NUnit.Framework.Category ("AndroidNotWorking")] //Some Android devices like to return catch-all IPs for invalid host names.
\r
223 public void GetHostByName ()
\r
225 SubTestGetHostByName (site1Name, site1Dot);
\r
226 SubTestGetHostByName (site2Name, site2Dot);
\r
228 var entry = Dns.GetHostByName (noneExistingSite);
\r
229 Assert.Fail ("Should raise a SocketException (assuming that '" + noneExistingSite + "' does not exist)");
\r
230 } catch (SocketException) {
\r
234 static IPAddress GetIPv4Address (IPHostEntry h)
\r
236 var al = h.AddressList.FirstOrDefault (x => x.AddressFamily == AddressFamily.InterNetwork);
\r
238 Assert.Ignore ("Could not resolve an IPv4 address as required by this test case, e.g. running on an IPv6 only network");
\r
242 void SubTestGetHostByName (string siteName, string siteDot)
\r
244 IPHostEntry h = Dns.GetHostByName (siteName);
\r
245 SubTestValidIPHostEntry (h);
\r
246 Assert.AreEqual (siteName, h.HostName, "siteName");
\r
247 var ip = GetIPv4Address (h);
\r
248 Assert.AreEqual (siteDot, ip.ToString (), "siteDot");
\r
252 public void GetHostByName_HostName_Null ()
\r
255 Dns.GetHostByName ((string) null);
\r
256 Assert.Fail ("#1");
\r
257 } catch (ArgumentNullException ex) {
\r
258 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
259 Assert.IsNull (ex.InnerException, "#3");
\r
260 Assert.IsNotNull (ex.Message, "#4");
\r
261 Assert.AreEqual ("hostName", ex.ParamName, "#5");
\r
266 public void GetHostByAddressString_Address_Null ()
\r
269 Dns.GetHostByAddress ((string) null);
\r
270 Assert.Fail ("#1");
\r
271 } catch (ArgumentNullException ex) {
\r
272 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
273 Assert.IsNull (ex.InnerException, "#3");
\r
274 Assert.IsNotNull (ex.Message, "#4");
\r
275 Assert.AreEqual ("address", ex.ParamName, "#5");
\r
280 [ExpectedException (typeof (SocketException))]
\r
281 public void GetHostByAddressString2 ()
\r
283 Dns.GetHostByAddress ("123.255.23");
\r
287 [ExpectedException (typeof (FormatException))]
\r
288 public void GetHostByAddressString3 ()
\r
290 Dns.GetHostByAddress ("123.256.34.10");
\r
293 [Test, ExpectedException (typeof (FormatException))]
\r
294 public void GetHostByAddressString4 ()
\r
296 Dns.GetHostByAddress ("not an IP address");
\r
300 public void GetHostByAddressString5 ()
\r
302 Dns.GetHostByAddress (site1Dot);
\r
306 public void GetHostByAddressIPAddress_Address_Null ()
\r
309 Dns.GetHostByAddress ((IPAddress) null);
\r
310 Assert.Fail ("#1");
\r
311 } catch (ArgumentNullException ex) {
\r
312 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
313 Assert.IsNull (ex.InnerException, "#3");
\r
314 Assert.IsNotNull (ex.Message, "#4");
\r
315 Assert.AreEqual ("address", ex.ParamName, "#5");
\r
320 public void GetHostByAddressIPAddress2 ()
\r
322 IPAddress addr = new IPAddress (IPAddress.NetworkToHostOrder ((int) site1IP));
\r
323 IPHostEntry h = Dns.GetHostByAddress (addr);
\r
324 SubTestValidIPHostEntry (h);
\r
325 var ip = GetIPv4Address (h);
\r
326 Assert.AreEqual (addr.ToString (), ip.ToString ());
\r
330 public void GetHostByAddressIPAddress3 ()
\r
332 IPAddress addr = new IPAddress (IPAddress.NetworkToHostOrder ((int) site2IP));
\r
333 IPHostEntry h = Dns.GetHostByAddress (addr);
\r
334 SubTestValidIPHostEntry (h);
\r
335 var ip = GetIPv4Address (h);
\r
336 Assert.AreEqual (addr.ToString (), ip.ToString ());
\r
340 #if FEATURE_NO_BSD_SOCKETS
\r
341 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
343 public void BeginResolve_HostName_Null ()
\r
346 Dns.BeginResolve ((string) null,
\r
347 new AsyncCallback (ShouldntBeCalled),
\r
349 Assert.Fail ("#1");
\r
350 } catch (ArgumentNullException ex) {
\r
351 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
352 Assert.IsNull (ex.InnerException, "#3");
\r
353 Assert.IsNotNull (ex.Message, "#4");
\r
354 Assert.AreEqual ("hostName", ex.ParamName, "#5");
\r
359 #if FEATURE_NO_BSD_SOCKETS
\r
360 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
362 public void Resolve ()
\r
364 SubTestResolve (site1Name);
\r
365 SubTestResolve (site2Name);
\r
366 SubTestResolve (site1Dot);
\r
367 SubTestResolve (site2Dot);
\r
370 void SubTestResolve (string addr)
\r
372 IPHostEntry h = Dns.Resolve (addr);
\r
373 SubTestValidIPHostEntry (h);
\r
377 #if FEATURE_NO_BSD_SOCKETS
\r
378 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
380 public void Resolve_HostName_Null ()
\r
383 Dns.Resolve ((string) null);
\r
384 Assert.Fail ("#1");
\r
385 } catch (ArgumentNullException ex) {
\r
386 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
387 Assert.IsNull (ex.InnerException, "#3");
\r
388 Assert.IsNotNull (ex.Message, "#4");
\r
389 Assert.AreEqual ("hostName", ex.ParamName, "#5");
\r
393 [Test] // BeginGetHostEntry (IPAddress, AsyncCallback, Object)
\r
394 #if FEATURE_NO_BSD_SOCKETS
\r
395 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
397 public void BeginGetHostEntry1_Address_Null ()
\r
400 Dns.BeginGetHostEntry (
\r
402 new AsyncCallback (ShouldntBeCalled),
\r
404 Assert.Fail ("#1");
\r
405 } catch (ArgumentNullException ex) {
\r
406 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
407 Assert.IsNull (ex.InnerException, "#3");
\r
408 Assert.IsNotNull (ex.Message, "#4");
\r
409 Assert.AreEqual ("address", ex.ParamName, "#5");
\r
413 [Test] // BeginGetHostEntry (String, AsyncCallback, Object)
\r
414 #if FEATURE_NO_BSD_SOCKETS
\r
415 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
417 public void BeginGetHostEntry2_HostNameOrAddress_Null ()
\r
420 Dns.BeginGetHostEntry (
\r
422 new AsyncCallback (ShouldntBeCalled),
\r
424 Assert.Fail ("#1");
\r
425 } catch (ArgumentNullException ex) {
\r
426 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
427 Assert.IsNull (ex.InnerException, "#3");
\r
428 Assert.IsNotNull (ex.Message, "#4");
\r
429 Assert.AreEqual ("hostName", ex.ParamName, "#5");
\r
433 [Test] // BeginGetHostEntry (String, AsyncCallback, Object)
\r
434 #if FEATURE_NO_BSD_SOCKETS
\r
435 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
437 public void BeginGetHostEntry2_HostNameOrAddress_UnspecifiedAddress ()
\r
441 Dns.BeginGetHostEntry (
\r
443 new AsyncCallback (GetHostEntryCallback),
\r
445 Assert.Fail ("#1");
\r
446 } catch (ArgumentException ex) {
\r
447 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
448 // unspecified addresses that cannot be used as
\r
449 // a target address
\r
450 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
\r
451 Assert.IsNull (ex.InnerException, "#3");
\r
452 Assert.IsNotNull (ex.Message, "#4");
\r
453 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#5");
\r
458 Dns.BeginGetHostEntry (
\r
460 new AsyncCallback (GetHostEntryCallback),
\r
462 Assert.Fail ("#1");
\r
463 } catch (ArgumentException ex) {
\r
464 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
465 // unspecified addresses that cannot be used as
\r
466 // a target address
\r
467 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
\r
468 Assert.IsNull (ex.InnerException, "#3");
\r
469 Assert.IsNotNull (ex.Message, "#4");
\r
470 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#5");
\r
474 void GetHostEntryCallback (IAsyncResult ar)
\r
476 IPHostEntry hostEntry = Dns.EndGetHostEntry (ar);
\r
477 Assert.IsNotNull (hostEntry);
\r
480 [Test] // GetHostEntry (IPAddress)
\r
481 public void GetHostEntry1_Address_Null ()
\r
484 Dns.GetHostEntry ((IPAddress) null);
\r
485 Assert.Fail ("#1");
\r
486 } catch (ArgumentNullException ex) {
\r
487 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
488 Assert.IsNull (ex.InnerException, "#3");
\r
489 Assert.IsNotNull (ex.Message, "#4");
\r
490 Assert.AreEqual ("address", ex.ParamName, "#5");
\r
494 [Test] // GetHostEntry (String)
\r
495 #if FEATURE_NO_BSD_SOCKETS
\r
496 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
498 public void GetHostEntry2 ()
\r
500 Dns.GetHostEntry (site1Name); // hostname
\r
501 Dns.GetHostEntry (site1Dot); // IP address
\r
504 [Test] // GetHostEntry (String)
\r
505 public void GetHostEntry2_HostNameOrAddress_Null ()
\r
508 Dns.GetHostEntry ((string) null);
\r
509 Assert.Fail ("#1");
\r
510 } catch (ArgumentNullException ex) {
\r
511 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
512 Assert.IsNull (ex.InnerException, "#3");
\r
513 Assert.IsNotNull (ex.Message, "#4");
\r
514 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#5");
\r
518 [Test] // GetHostEntry (String)
\r
519 public void GetHostEntry2_HostNameOrAddress_UnspecifiedAddress ()
\r
523 Dns.GetHostEntry ("0.0.0.0");
\r
524 Assert.Fail ("#A1");
\r
525 } catch (ArgumentException ex) {
\r
526 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
527 // unspecified addresses that cannot be used as
\r
528 // a target address
\r
529 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
\r
530 Assert.IsNull (ex.InnerException, "#A3");
\r
531 Assert.IsNotNull (ex.Message, "#A4");
\r
532 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#A5");
\r
537 Dns.GetHostEntry ("::0");
\r
538 Assert.Fail ("#B1");
\r
539 } catch (ArgumentException ex) {
\r
540 // IPv4 address 0.0.0.0 and IPv6 address ::0 are
\r
541 // unspecified addresses that cannot be used as
\r
542 // a target address
\r
543 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
\r
544 Assert.IsNull (ex.InnerException, "#B3");
\r
545 Assert.IsNotNull (ex.Message, "#B4");
\r
546 Assert.AreEqual ("hostNameOrAddress", ex.ParamName, "#B5");
\r
550 void SubTestValidIPHostEntry (IPHostEntry h)
\r
552 Assert.IsNotNull (h.HostName, "HostName not null");
\r
553 Assert.IsNotNull (h.AddressList, "AddressList not null");
\r
554 Assert.IsTrue (h.AddressList.Length > 0, "AddressList.Length");
\r
558 public void GetHostEntry_StringEmpty ()
\r
560 Dns.GetHostEntry (string.Empty);
\r
563 /* This isn't used anymore, but could be useful for debugging
\r
564 static void printIPHostEntry(IPHostEntry h)
\r
566 Console.WriteLine("----------------------------------------------------");
\r
567 Console.WriteLine("Host name:");
\r
568 Console.WriteLine(h.HostName);
\r
569 Console.WriteLine("IP addresses:");
\r
570 IPAddress[] list = h.AddressList;
\r
571 for(int i = 0; i < list.Length; ++i)
\r
572 Console.WriteLine(list[i]);
\r
573 Console.WriteLine("Aliases:");
\r
574 string[] aliases = h.Aliases;
\r
575 for(int i = 0; i < aliases.Length; ++i)
\r
576 Console.WriteLine(aliases[i]);
\r
577 Console.WriteLine("----------------------------------------------------");
\r