2222import static org .assertj .core .api .Assertions .assertThatThrownBy ;
2323
2424import com .google .common .net .InetAddresses ;
25- import java .net .InetAddress ;
2625import java .net .UnknownHostException ;
2726import org .apache .bookkeeper .conf .ServerConfiguration ;
2827import org .apache .bookkeeper .net .BookieSocketAddress ;
28+ import org .apache .bookkeeper .net .DNS ;
2929import org .junit .Test ;
30+ import org .mockito .MockedStatic ;
31+ import org .mockito .Mockito ;
3032
3133public class BookieSocketAddressTest {
3234
35+ private MockedStatic <DNS > mockHostnameIPSetup (String mockHostAddress ) {
36+ MockedStatic <DNS > mockedDNS = Mockito .mockStatic (DNS .class );
37+ mockedDNS .when (() -> DNS .getDefaultIP ("default" )).thenReturn (mockHostAddress );
38+ return mockedDNS ;
39+ }
40+
3341 private void testAdvertisedWithLoopbackAddress (String address ) throws UnknownHostException {
3442 ServerConfiguration conf = new ServerConfiguration ();
3543 conf .setAdvertisedAddress (address );
@@ -49,29 +57,38 @@ public void testAdvertisedWithLoopbackAddress() throws UnknownHostException {
4957
5058 @ Test
5159 public void testAdvertisedWithNonLoopbackAddress () throws UnknownHostException {
52- String hostAddress = InetAddress .getLocalHost ().getHostAddress ();
53- if (hostAddress == null ) {
54- throw new UnknownHostException ("Host address is null" );
60+ // Mock to return a non-loopback address
61+ try (MockedStatic <DNS > mockedDNS = mockHostnameIPSetup ("192.168.1.100" )) {
62+ ServerConfiguration conf = new ServerConfiguration ();
63+ conf .setAllowLoopback (false );
64+ conf .setAdvertisedAddress ("192.168.1.100" );
65+ BookieSocketAddress bookieAddress = getBookieAddress (conf );
66+ assertThat (bookieAddress .getHostName ()).isEqualTo ("192.168.1.100" );
5567 }
56- ServerConfiguration conf = new ServerConfiguration ();
57- conf .setAllowLoopback (false );
58- conf .setAdvertisedAddress (hostAddress );
59- BookieSocketAddress bookieAddress = getBookieAddress (conf );
60- assertThat (bookieAddress .getHostName ()).isEqualTo (hostAddress );
6168 }
6269
6370 @ Test
6471 public void testBookieAddressIsIPAddressByDefault () throws UnknownHostException {
65- ServerConfiguration conf = new ServerConfiguration ();
66- BookieSocketAddress bookieAddress = getBookieAddress (conf );
67- assertThat (InetAddresses .isInetAddress (bookieAddress .getHostName ())).isTrue ();
72+ // Mock to return a non-loopback address
73+ try (MockedStatic <DNS > mockedDNS = mockHostnameIPSetup ("192.168.1.100" )) {
74+ ServerConfiguration conf = new ServerConfiguration ();
75+ // Do not allow loopback addresses
76+ conf .setAllowLoopback (false );
77+ BookieSocketAddress bookieAddress = getBookieAddress (conf );
78+ assertThat (InetAddresses .isInetAddress (bookieAddress .getHostName ())).isTrue ();
79+ }
6880 }
6981
7082 @ Test
7183 public void testBookieAddressIsHostname () throws UnknownHostException {
72- ServerConfiguration conf = new ServerConfiguration ();
73- conf .setUseHostNameAsBookieID (true );
74- BookieSocketAddress bookieAddress = getBookieAddress (conf );
75- assertThat (InetAddresses .isInetAddress (bookieAddress .getHostName ())).isFalse ();
84+ // Mock to return localhost address which can be resolved to a hostname
85+ try (MockedStatic <DNS > mockedDNS = mockHostnameIPSetup ("127.0.0.1" )) {
86+ ServerConfiguration conf = new ServerConfiguration ();
87+ conf .setUseHostNameAsBookieID (true );
88+ // Allow loopback addresses since we're testing hostname resolution
89+ conf .setAllowLoopback (true );
90+ BookieSocketAddress bookieAddress = getBookieAddress (conf );
91+ assertThat (InetAddresses .isInetAddress (bookieAddress .getHostName ())).isFalse ();
92+ }
7693 }
7794}
0 commit comments