1313import java .io .ByteArrayOutputStream ;
1414import java .io .IOException ;
1515import java .nio .charset .StandardCharsets ;
16+ import java .util .ArrayList ;
17+ import java .util .Collection ;
18+ import java .util .List ;
1619import java .util .Map ;
1720import java .util .concurrent .TimeUnit ;
1821import java .util .stream .Collectors ;
3134import org .junit .Test ;
3235
3336import org .opensearch .action .index .IndexRequest ;
37+ import org .opensearch .common .collect .Tuple ;
38+ import org .opensearch .common .settings .Settings ;
39+ import org .opensearch .http .HttpTransportSettings ;
3440import org .opensearch .test .framework .AsyncActions ;
3541import org .opensearch .test .framework .TestSecurityConfig ;
3642import org .opensearch .test .framework .TestSecurityConfig .User ;
3743import org .opensearch .test .framework .cluster .ClusterManager ;
3844import org .opensearch .test .framework .cluster .LocalCluster ;
45+ import org .opensearch .test .framework .cluster .ReactorHttpClient ;
3946import org .opensearch .test .framework .cluster .TestRestClient ;
4047import org .opensearch .transport .client .Client ;
4148
49+ import io .netty .handler .codec .http .FullHttpResponse ;
50+ import io .netty .handler .codec .http .HttpResponseStatus ;
51+ import reactor .netty .http .HttpProtocol ;
52+
4253import static org .hamcrest .MatcherAssert .assertThat ;
4354import static org .hamcrest .Matchers .equalTo ;
4455import static org .opensearch .action .support .WriteRequest .RefreshPolicy .IMMEDIATE ;
@@ -64,11 +75,13 @@ public class ResourceFocusedTests {
6475 )
6576 .on ("*" )
6677 );
78+ private static Map <String , Object > NODE_SETTINGS = Map .of (HttpTransportSettings .SETTING_HTTP_HTTP3_ENABLED .getKey (), true );
6779
6880 @ ClassRule
6981 public static LocalCluster cluster = new LocalCluster .Builder ().clusterManager (ClusterManager .THREE_CLUSTER_MANAGERS )
7082 .authc (AUTHC_HTTPBASIC_INTERNAL )
7183 .users (ADMIN_USER , LIMITED_USER )
84+ .nodeSettings (NODE_SETTINGS )
7285 .anonymousAuth (false )
7386 .doNotFailOnForbidden (true )
7487 .build ();
@@ -86,38 +99,41 @@ public void testUnauthenticatedFewBig() {
8699 // Tweaks:
87100 final RequestBodySize size = RequestBodySize .XLarge ;
88101 final String requestPath = "/*/_search" ;
89- final int parrallelism = 5 ;
102+ final int parallelism = 5 ;
90103 final int totalNumberOfRequests = 100 ;
91104
92- runResourceTest (size , requestPath , parrallelism , totalNumberOfRequests );
105+ runResourceTest (size , requestPath , parallelism , totalNumberOfRequests );
106+ runResourceTestWithGenericClient (size , requestPath , parallelism , totalNumberOfRequests );
93107 }
94108
95109 @ Test
96110 public void testUnauthenticatedManyMedium () {
97111 // Tweaks:
98112 final RequestBodySize size = RequestBodySize .Medium ;
99113 final String requestPath = "/*/_search" ;
100- final int parrallelism = 20 ;
114+ final int parallelism = 20 ;
101115 final int totalNumberOfRequests = 10_000 ;
102116
103- runResourceTest (size , requestPath , parrallelism , totalNumberOfRequests );
117+ runResourceTest (size , requestPath , parallelism , totalNumberOfRequests );
118+ runResourceTestWithGenericClient (size , requestPath , parallelism , totalNumberOfRequests );
104119 }
105120
106121 @ Test
107122 public void testUnauthenticatedTonsSmall () {
108123 // Tweaks:
109124 final RequestBodySize size = RequestBodySize .Small ;
110125 final String requestPath = "/*/_search" ;
111- final int parrallelism = 100 ;
126+ final int parallelism = 100 ;
112127 final int totalNumberOfRequests = 15_000 ;
113128
114- runResourceTest (size , requestPath , parrallelism , totalNumberOfRequests );
129+ runResourceTest (size , requestPath , parallelism , totalNumberOfRequests );
130+ runResourceTestWithGenericClient (size , requestPath , parallelism , totalNumberOfRequests );
115131 }
116132
117133 private void runResourceTest (
118134 final RequestBodySize size ,
119135 final String requestPath ,
120- final int parrallelism ,
136+ final int parallelism ,
121137 final int totalNumberOfRequests
122138 ) {
123139 final byte [] compressedRequestBody = createCompressedRequestBody (size );
@@ -127,14 +143,40 @@ private void runResourceTest(
127143 post .setEntity (new ByteArrayEntity (compressedRequestBody , ContentType .APPLICATION_JSON ));
128144 TestRestClient .HttpResponse response = client .executeRequest (post );
129145 return response .getStatusCode ();
130- }, parrallelism , totalNumberOfRequests );
146+ }, parallelism , totalNumberOfRequests );
131147
132148 AsyncActions .getAll (requests , 2 , TimeUnit .MINUTES ).forEach ((responseCode ) -> {
133149 assertThat (responseCode , equalTo (HttpStatus .SC_UNAUTHORIZED ));
134150 });
135151 }
136152 }
137153
154+ private void runResourceTestWithGenericClient (
155+ final RequestBodySize size ,
156+ final String requestPath ,
157+ final int parallelism ,
158+ final int totalNumberOfRequests
159+ ) {
160+ final byte [] compressedRequestBody = createCompressedRequestBody (size );
161+ try (
162+ final ReactorHttpClient client = cluster .getGenericClient (
163+ HttpProtocol .HTTP3 ,
164+ true ,
165+ Settings .builder ().loadFromMap (NODE_SETTINGS ).build ()
166+ )
167+ ) {
168+ List <Tuple <String , byte []>> requestUris = new ArrayList <>();
169+ for (int i = 0 ; i < totalNumberOfRequests ; i ++) {
170+ requestUris .add (Tuple .tuple (requestPath , compressedRequestBody ));
171+ }
172+
173+ final Collection <FullHttpResponse > responses = client .post (requestUris , parallelism );
174+ responses .stream ()
175+ .map (FullHttpResponse ::status )
176+ .forEach (responseCode -> assertThat (responseCode , equalTo (HttpResponseStatus .UNAUTHORIZED )));
177+ }
178+ }
179+
138180 static enum RequestBodySize {
139181 Small (1 ),
140182 Medium (1_000 ),
0 commit comments