• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.net;
6 
7 import static com.google.common.truth.Truth.assertThat;
8 
9 import static org.chromium.net.truth.UrlResponseInfoSubject.assertThat;
10 
11 import androidx.test.ext.junit.runners.AndroidJUnit4;
12 import androidx.test.filters.LargeTest;
13 
14 import org.junit.After;
15 import org.junit.Before;
16 import org.junit.Rule;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 
20 import org.chromium.base.test.util.Batch;
21 import org.chromium.net.CronetTestRule.CronetImplementation;
22 import org.chromium.net.CronetTestRule.IgnoreFor;
23 import org.chromium.net.apihelpers.UploadDataProviders;
24 
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.Random;
28 import java.util.concurrent.ExecutorService;
29 import java.util.concurrent.Executors;
30 
31 /** Tests that making a large number of requests do not lead to crashes. */
32 @RunWith(AndroidJUnit4.class)
33 @Batch(Batch.UNIT_TESTS)
34 public class CronetStressTest {
35     @Rule public final CronetTestRule mTestRule = CronetTestRule.withAutomaticEngineStartup();
36 
37     @Before
setUp()38     public void setUp() throws Exception {
39         assertThat(
40                         NativeTestServer.startNativeTestServer(
41                                 mTestRule.getTestFramework().getContext()))
42                 .isTrue();
43     }
44 
45     @After
tearDown()46     public void tearDown() throws Exception {
47         NativeTestServer.shutdownNativeTestServer();
48     }
49 
50     @Test
51     @LargeTest
52     @IgnoreFor(
53             implementations = {CronetImplementation.FALLBACK},
54             reason = "This test crashes the fallback implementation.")
testLargeNumberOfUploads()55     public void testLargeNumberOfUploads() throws Exception {
56         Random random = new Random();
57         final int kNumRequest = 1000;
58         final int kNumRequestHeaders = 100;
59         final int kNumUploadBytes = 1000;
60         final byte[] b = new byte[kNumUploadBytes * kNumRequest];
61         random.nextBytes(b);
62         List<TestUrlRequestCallback> callbacks = new ArrayList<>(kNumRequest);
63 
64         ExecutorService callbackExecutor = Executors.newSingleThreadExecutor();
65         try {
66             for (int i = 0; i < kNumRequest; i++) {
67                 TestUrlRequestCallback callback = new TestUrlRequestCallback(callbackExecutor);
68                 UrlRequest.Builder builder =
69                         mTestRule
70                                 .getTestFramework()
71                                 .getEngine()
72                                 .newUrlRequestBuilder(
73                                         NativeTestServer.getEchoAllHeadersURL(),
74                                         callback,
75                                         callback.getExecutor());
76                 for (int j = 0; j < kNumRequestHeaders; j++) {
77                     builder.addHeader("header" + j, Integer.toString(j));
78                 }
79                 builder.addHeader("content-type", "useless/string");
80                 builder.setUploadDataProvider(
81                         UploadDataProviders.create(b, i * kNumUploadBytes, kNumUploadBytes),
82                         callback.getExecutor());
83                 UrlRequest request = builder.build();
84                 request.start();
85                 callbacks.add(callback);
86             }
87 
88             for (TestUrlRequestCallback callback : callbacks) {
89                 callback.blockForDone();
90                 assertThat(callback.getResponseInfoWithChecks())
91                         .hasHttpStatusCodeThat()
92                         .isEqualTo(200);
93             }
94         } finally {
95             callbackExecutor.shutdown();
96         }
97     }
98 }
99