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.junit.Assert.fail; 10 11 import android.os.Build; 12 13 import androidx.test.ext.junit.runners.AndroidJUnit4; 14 import androidx.test.filters.SmallTest; 15 16 import org.junit.After; 17 import org.junit.Before; 18 import org.junit.Rule; 19 import org.junit.Test; 20 import org.junit.rules.TestName; 21 import org.junit.runner.RunWith; 22 23 import org.chromium.base.test.util.Batch; 24 import org.chromium.net.CronetTestRule.CronetImplementation; 25 import org.chromium.net.CronetTestRule.IgnoreFor; 26 import org.chromium.net.CronetTestRule.RequiresMinAndroidApi; 27 import org.chromium.net.CronetTestRule.RequiresMinApi; 28 import org.chromium.net.impl.CronetUrlRequestContext; 29 import org.chromium.net.impl.JavaCronetEngine; 30 31 /** Tests features of CronetTestRule. */ 32 @RunWith(AndroidJUnit4.class) 33 @Batch(Batch.UNIT_TESTS) 34 public class CronetTestRuleTest { 35 @Rule public final CronetTestRule mTestRule = CronetTestRule.withAutomaticEngineStartup(); 36 @Rule public final TestName mTestName = new TestName(); 37 38 /** 39 * For any test whose name contains "MustRun", it's enforced that the test must run and set 40 * {@code mTestWasRun} to {@code true}. 41 */ 42 private boolean mTestWasRun; 43 44 /** 45 * This is used by testAllImplsMustRun. That test relies on the fact that reruns for multiple 46 * implementations do not re-instantiate the test class (instead, only setUp is run again). This 47 * means that "modifications" applied to a class variable will be visible to reruns of the same 48 * test that target a different Cronet implementation. 49 */ 50 private int mNumberOfReruns; 51 52 private boolean mFallbackImplWasRun; 53 private boolean mNativeImplWasRun; 54 private boolean mPlatformImplWasRun; 55 56 @Before setUp()57 public void setUp() throws Exception { 58 mTestWasRun = false; 59 } 60 61 @After tearDown()62 public void tearDown() throws Exception { 63 if (mTestName.getMethodName().contains("MustRun") && !mTestWasRun) { 64 fail(mTestName.getMethodName() + " should have run but didn't."); 65 } 66 } 67 68 @Test 69 @SmallTest 70 @RequiresMinApi(999999999) testRequiresMinApiDisable()71 public void testRequiresMinApiDisable() { 72 fail("RequiresMinApi failed to disable."); 73 } 74 75 @Test 76 @SmallTest 77 @RequiresMinApi(-999999999) testRequiresMinApiMustRun()78 public void testRequiresMinApiMustRun() { 79 mTestWasRun = true; 80 } 81 82 /** 83 * This test relies on seeing reruns side-effects through {@code mNumberOfReruns}. More info in 84 * {@code mNumberOfReruns}'s Javadoc. 85 */ 86 @Test 87 @SmallTest testAllImplsMustRun()88 public void testAllImplsMustRun() { 89 assertThat(mTestWasRun).isFalse(); 90 mTestWasRun = true; 91 mNumberOfReruns++; 92 assertThat(mNumberOfReruns).isLessThan(4); 93 switch (mTestRule.implementationUnderTest()) { 94 case STATICALLY_LINKED: 95 assertThat(mNativeImplWasRun).isFalse(); 96 mNativeImplWasRun = true; 97 break; 98 case FALLBACK: 99 assertThat(mFallbackImplWasRun).isFalse(); 100 mFallbackImplWasRun = true; 101 break; 102 case AOSP_PLATFORM: 103 assertThat(mPlatformImplWasRun).isFalse(); 104 mPlatformImplWasRun = true; 105 break; 106 } 107 if (mNumberOfReruns == 3) { 108 assertThat(mFallbackImplWasRun).isTrue(); 109 assertThat(mPlatformImplWasRun).isTrue(); 110 assertThat(mNativeImplWasRun).isTrue(); 111 } 112 } 113 114 @Test 115 @SmallTest 116 @IgnoreFor( 117 implementations = {CronetImplementation.FALLBACK, CronetImplementation.AOSP_PLATFORM}, 118 reason = "Testing the rule") testRunOnlyNativeMustRun()119 public void testRunOnlyNativeMustRun() { 120 assertThat(mTestRule.testingJavaImpl()).isFalse(); 121 assertThat(mTestRule.implementationUnderTest()) 122 .isEqualTo(CronetImplementation.STATICALLY_LINKED); 123 assertThat(mTestWasRun).isFalse(); 124 mTestWasRun = true; 125 assertThat(mTestRule.getTestFramework().getEngine()) 126 .isInstanceOf(CronetUrlRequestContext.class); 127 } 128 129 @Test 130 @SmallTest 131 @IgnoreFor( 132 implementations = { 133 CronetImplementation.STATICALLY_LINKED, 134 CronetImplementation.AOSP_PLATFORM 135 }, 136 reason = "Testing the rule") testRunOnlyJavaMustRun()137 public void testRunOnlyJavaMustRun() { 138 assertThat(mTestRule.testingJavaImpl()).isTrue(); 139 assertThat(mTestRule.implementationUnderTest()).isEqualTo(CronetImplementation.FALLBACK); 140 assertThat(mTestWasRun).isFalse(); 141 mTestWasRun = true; 142 assertThat(mTestRule.getTestFramework().getEngine()).isInstanceOf(JavaCronetEngine.class); 143 } 144 145 @Test 146 @SmallTest 147 @IgnoreFor( 148 implementations = { 149 CronetImplementation.STATICALLY_LINKED, 150 CronetImplementation.FALLBACK 151 }, 152 reason = "Testing the rule") 153 @RequiresMinAndroidApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) testRunOnlyAospPlatformMustRun()154 public void testRunOnlyAospPlatformMustRun() { 155 assertThat(mTestRule.testingJavaImpl()).isFalse(); 156 assertThat(mTestRule.implementationUnderTest()) 157 .isEqualTo(CronetImplementation.AOSP_PLATFORM); 158 assertThat(mTestWasRun).isFalse(); 159 mTestWasRun = true; 160 assertThat(mTestRule.getTestFramework().getEngine()) 161 .isNotInstanceOf(JavaCronetEngine.class); 162 assertThat(mTestRule.getTestFramework().getEngine()) 163 .isNotInstanceOf(CronetUrlRequestContext.class); 164 } 165 } 166