4040import static org .junit .jupiter .api .Assertions .assertNull ;
4141import static org .junit .jupiter .api .Assertions .assertThrows ;
4242import static org .junit .jupiter .api .Assertions .assertTrue ;
43+ import static org .mockito .ArgumentMatchers .any ;
44+ import static org .mockito .ArgumentMatchers .argThat ;
45+ import static org .mockito .Mockito .doReturn ;
46+ import static org .mockito .Mockito .when ;
4347
48+ import java .io .IOException ;
4449import java .net .InetAddress ;
4550import java .net .UnknownHostException ;
4651import org .junit .jupiter .api .Test ;
52+ import org .mockito .ArgumentMatchers ;
53+ import org .mockito .Mockito ;
4754
4855class AddressTest {
4956 @ Test
@@ -302,36 +309,105 @@ void addressLength() {
302309 }
303310
304311 @ Test
305- void getByName () throws UnknownHostException {
312+ void getByName () throws IOException {
306313 InetAddress out = Address .getByName ("128.145.198.231" );
307314 assertEquals ("128.145.198.231" , out .getHostAddress ());
308315
316+ Name aRootServer = Name .fromString ("a.root-servers.net." );
317+ Message aMessage = new Message ();
318+ aMessage .getHeader ().setRcode (Rcode .NOERROR );
319+ aMessage .addRecord (Record .newRecord (aRootServer , Type .A , DClass .IN ), Section .QUESTION );
320+ aMessage .addRecord (
321+ new ARecord (
322+ aRootServer ,
323+ DClass .IN ,
324+ 60 ,
325+ InetAddress .getByAddress (new byte [] {(byte ) 198 , 41 , 0 , 4 })),
326+ Section .ANSWER );
327+
328+ Resolver mockResolver = Mockito .mock (Resolver .class );
329+ when (mockResolver .send (ArgumentMatchers .any (Message .class ))).thenReturn (aMessage );
330+ Lookup .setDefaultResolver (mockResolver );
331+
309332 out = Address .getByName ("a.root-servers.net" );
310333 assertEquals ("198.41.0.4" , out .getHostAddress ());
334+
335+ // reset resolver
336+ Lookup .refreshDefault ();
311337 }
312338
313339 @ Test
314- void getByName_invalid () {
340+ void getByName_invalid () throws IOException {
341+ Message m = new Message ();
342+ m .getHeader ().setRcode (Rcode .NXDOMAIN );
343+ Resolver mockResolver = Mockito .mock (Resolver .class );
344+ when (mockResolver .send (ArgumentMatchers .any (Message .class ))).thenReturn (m );
345+ Lookup .setDefaultResolver (mockResolver );
315346 assertThrows (UnknownHostException .class , () -> Address .getByName ("example.invalid" ));
347+ // reset resolver
348+ Lookup .refreshDefault ();
349+
316350 assertThrows (UnknownHostException .class , () -> Address .getByName ("" ));
317351 }
318352
319353 @ Test
320- void getAllByName () throws UnknownHostException {
354+ void getAllByName () throws IOException {
321355 InetAddress [] out = Address .getAllByName ("128.145.198.231" );
322356 assertEquals (1 , out .length );
323357 assertEquals ("128.145.198.231" , out [0 ].getHostAddress ());
324358
359+ Name aRootServer = Name .fromString ("a.root-servers.net." );
360+ Message aMessage = new Message ();
361+ aMessage .getHeader ().setRcode (Rcode .NOERROR );
362+ aMessage .addRecord (Record .newRecord (aRootServer , Type .A , DClass .IN ), Section .QUESTION );
363+ aMessage .addRecord (
364+ new ARecord (
365+ aRootServer ,
366+ DClass .IN ,
367+ 60 ,
368+ InetAddress .getByAddress (new byte [] {(byte ) 198 , 41 , 0 , 4 })),
369+ Section .ANSWER );
370+ Message aaaaMessage = new Message ();
371+ aaaaMessage .getHeader ().setRcode (Rcode .NOERROR );
372+ aaaaMessage .addRecord (Record .newRecord (aRootServer , Type .AAAA , DClass .IN ), Section .QUESTION );
373+ aaaaMessage .addRecord (
374+ new AAAARecord (
375+ aRootServer ,
376+ DClass .IN ,
377+ 60 ,
378+ InetAddress .getByAddress (
379+ new byte [] {0x20 , 1 , 5 , 3 , (byte ) 0xba , 0x3e , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0x30 })),
380+ Section .ANSWER );
381+ Resolver mockResolver = Mockito .mock (Resolver .class );
382+ doReturn (aMessage )
383+ .when (mockResolver )
384+ .send (argThat (message -> message .getQuestion ().getType () == Type .A ));
385+ doReturn (aaaaMessage )
386+ .when (mockResolver )
387+ .send (argThat (message -> message .getQuestion ().getType () == Type .AAAA ));
388+ Lookup .setDefaultResolver (mockResolver );
389+
325390 out = Address .getAllByName ("a.root-servers.net" );
326391 assertEquals (2 , out .length );
327392 assertEquals ("198.41.0.4" , out [0 ].getHostAddress ());
328393 assertEquals ("2001:503:ba3e:0:0:0:2:30" , out [1 ].getHostAddress ());
329394
395+ // reset resolver
396+ Lookup .refreshDefault ();
330397 }
331398
332399 @ Test
333- void getAllByName_invalid () {
400+ void getAllByName_invalid () throws IOException {
401+ Message m = new Message ();
402+ m .getHeader ().setRcode (Rcode .NXDOMAIN );
403+ Resolver mockResolver = Mockito .mock (Resolver .class );
404+ when (mockResolver .send (ArgumentMatchers .any (Message .class ))).thenReturn (m );
405+ Lookup .setDefaultResolver (mockResolver );
334406 assertThrows (UnknownHostException .class , () -> Address .getAllByName ("example.invalid" ));
407+
408+ // reset resolver
409+ Lookup .refreshDefault ();
410+
335411 assertThrows (UnknownHostException .class , () -> Address .getAllByName ("" ));
336412 }
337413
@@ -343,12 +419,33 @@ void familyOf() throws UnknownHostException {
343419 }
344420
345421 @ Test
346- void getHostName () throws UnknownHostException {
422+ void getHostName () throws IOException {
423+ Name aRootServer = Name .fromString ("a.root-servers.net." );
424+ Name aRootServerPtr = Name .fromString ("4.0.41.198.in-addr.arpa." );
425+ Message ptrMessage = new Message ();
426+ ptrMessage .getHeader ().setRcode (Rcode .NOERROR );
427+ ptrMessage .addRecord (Record .newRecord (aRootServerPtr , Type .PTR , DClass .IN ), Section .QUESTION );
428+ ptrMessage .addRecord (new PTRRecord (aRootServerPtr , DClass .IN , 60 , aRootServer ), Section .ANSWER );
429+ Resolver mockResolver = Mockito .mock (Resolver .class );
430+ when (mockResolver .send (any (Message .class ))).thenReturn (ptrMessage );
431+ Lookup .setDefaultResolver (mockResolver );
432+
347433 String out = Address .getHostName (InetAddress .getByName ("198.41.0.4" ));
348434 assertEquals ("a.root-servers.net." , out );
349435
436+ Message ptrMessage2 = new Message ();
437+ ptrMessage .getHeader ().setRcode (Rcode .NXDOMAIN );
438+ ptrMessage .addRecord (
439+ Record .newRecord (Name .fromString ("1.1.168.192.in-addr.arpa." ), Type .PTR , DClass .IN ),
440+ Section .QUESTION );
441+ mockResolver = Mockito .mock (Resolver .class );
442+ when (mockResolver .send (any ())).thenReturn (ptrMessage2 );
443+ Lookup .setDefaultResolver (mockResolver );
350444 assertThrows (
351445 UnknownHostException .class ,
352446 () -> Address .getHostName (InetAddress .getByName ("192.168.1.1" )));
447+
448+ // reset resolver
449+ Lookup .refreshDefault ();
353450 }
354451}
0 commit comments