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