2626 */
2727package org .apache .hc .client5 .http ;
2828
29+ import static org .junit .jupiter .api .Assertions .assertArrayEquals ;
2930import static org .junit .jupiter .api .Assertions .assertEquals ;
3031import static org .junit .jupiter .api .Assertions .assertInstanceOf ;
31- import static org .junit .jupiter .api .Assertions .assertNotEquals ;
3232import static org .mockito .Mockito .when ;
3333
3434import java .net .Inet4Address ;
@@ -103,71 +103,59 @@ void ipv4Only_emptyWhenNoIPv4Candidates() throws Exception {
103103 }
104104
105105 @ Test
106- void preferIpv6_groupsAllV6First_preservingRelativeOrder () throws Exception {
107- final InetAddress v4a = InetAddress .getByName ("192.0.2.1" );
106+ void interleave_isDefault_and_hasNoFamilyBias () throws Exception {
108107 final InetAddress v6a = InetAddress .getByName ("2001:db8::1" );
109- final InetAddress v4b = InetAddress .getByName ("203.0.113.10" );
110108 final InetAddress v6b = InetAddress .getByName ("2001:db8::2" );
109+ final InetAddress v4a = InetAddress .getByName ("192.0.2.1" );
110+ final InetAddress v4b = InetAddress .getByName ("203.0.113.10" );
111111
112- when (delegate .resolve ("dual.example" )).thenReturn (new InetAddress []{v4a , v6a , v4b , v6b });
113-
114- final Rfc6724AddressSelectingDnsResolver r =
115- new Rfc6724AddressSelectingDnsResolver (delegate , ProtocolFamilyPreference .PREFER_IPV6 );
112+ when (delegate .resolve ("dual.example" )).thenReturn (new InetAddress []{v6a , v6b , v4a , v4b });
116113
117- final InetAddress [] out = r .resolve ("dual.example" );
114+ final Rfc6724AddressSelectingDnsResolver rDefault = new Rfc6724AddressSelectingDnsResolver (delegate );
115+ final Rfc6724AddressSelectingDnsResolver rInterleave =
116+ new Rfc6724AddressSelectingDnsResolver (delegate , ProtocolFamilyPreference .INTERLEAVE );
118117
119- // all v6 first, in original relative order
120- final List <InetAddress > v6Seen = new ArrayList <>();
121- final List <InetAddress > v4Seen = new ArrayList <>();
122- Assertions .assertNotNull (out );
123- for (final InetAddress a : out ) {
124- if (a instanceof Inet6Address ) {
125- v6Seen .add (a );
126- } else {
127- v4Seen .add (a );
128- }
129- }
130- assertEquals (Arrays .asList (v6a , v6b ), v6Seen );
131- assertEquals (Arrays .asList (v4a , v4b ), v4Seen );
118+ final InetAddress [] outDefault = rDefault .resolve ("dual.example" );
119+ final InetAddress [] outInterleave = rInterleave .resolve ("dual.example" );
132120
133- // ensure first element is IPv6 (grouping actually happened)
134- assertInstanceOf (Inet6Address .class , out [0 ]);
121+ assertArrayEquals (outDefault , outInterleave );
122+ Assertions .assertNotNull (outInterleave );
123+ assertEquals (4 , outInterleave .length );
135124 }
136125
137126 @ Test
138- void interleave_alternatesFamilies_and_preservesRelativeOrder () throws Exception {
139- final InetAddress v6a = InetAddress .getByName ("2001:db8::1" );
140- final InetAddress v6b = InetAddress .getByName ("2001:db8::2" );
127+ void preferIpv6_groupsAllV6First_preservingRelativeOrder () throws Exception {
141128 final InetAddress v4a = InetAddress .getByName ("192.0.2.1" );
129+ final InetAddress v6a = InetAddress .getByName ("2001:db8::1" );
142130 final InetAddress v4b = InetAddress .getByName ("203.0.113.10" );
131+ final InetAddress v6b = InetAddress .getByName ("2001:db8::2" );
143132
144- when (delegate .resolve ("dual.example" )).thenReturn (new InetAddress []{v6a , v6b , v4a , v4b });
133+ when (delegate .resolve ("dual.example" )).thenReturn (new InetAddress []{v4a , v6a , v4b , v6b });
145134
146- final Rfc6724AddressSelectingDnsResolver r =
135+ final Rfc6724AddressSelectingDnsResolver baseline =
147136 new Rfc6724AddressSelectingDnsResolver (delegate , ProtocolFamilyPreference .INTERLEAVE );
137+ final InetAddress [] baseOut = baseline .resolve ("dual.example" );
148138
149- final InetAddress [] out = r .resolve ("dual.example" );
139+ final Rfc6724AddressSelectingDnsResolver preferV6 =
140+ new Rfc6724AddressSelectingDnsResolver (delegate , ProtocolFamilyPreference .PREFER_IPV6 );
141+ final InetAddress [] out = preferV6 .resolve ("dual.example" );
150142
151- // Preserve per-family relative order
152- final List <InetAddress > v6Seen = new ArrayList <>();
153- final List <InetAddress > v4Seen = new ArrayList <>();
154- Assertions .assertNotNull (out );
155- for (final InetAddress a : out ) {
143+ // Expected: stable partition of the RFC-sorted baseline.
144+ final List <InetAddress > baseV6 = new ArrayList <>();
145+ final List <InetAddress > baseV4 = new ArrayList <>();
146+ for (final InetAddress a : baseOut ) {
156147 if (a instanceof Inet6Address ) {
157- v6Seen .add (a );
148+ baseV6 .add (a );
158149 } else {
159- v4Seen .add (a );
150+ baseV4 .add (a );
160151 }
161152 }
162- assertEquals (Arrays .asList (v6a , v6b ), v6Seen );
163- assertEquals (Arrays .asList (v4a , v4b ), v4Seen );
164-
165- // Alternation (as far as both families have remaining items)
166- final int pairs = Math .min (v6Seen .size (), v4Seen .size ());
167- for (int i = 1 ; i < pairs * 2 ; i ++) {
168- assertNotEquals (out [i - 1 ] instanceof Inet6Address , out [i ] instanceof Inet6Address ,
169- "adjacent entries should alternate family under INTERLEAVE" );
170- }
153+ final List <InetAddress > expected = new ArrayList <>(baseOut .length );
154+ expected .addAll (baseV6 );
155+ expected .addAll (baseV4 );
156+
157+ assertEquals (expected , Arrays .asList (out ));
158+ assertInstanceOf (Inet6Address .class , out [0 ]);
171159 }
172160
173161 @ Test
@@ -178,4 +166,5 @@ void canonicalHostname_delegates() throws Exception {
178166 assertEquals ("canon.example.org" , r .resolveCanonicalHostname ("example.org" ));
179167 Mockito .verify (delegate ).resolveCanonicalHostname ("example.org" );
180168 }
169+
181170}
0 commit comments