1 // Copyright 2019 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.test; 6 7 import static com.google.common.truth.Truth.assertThat; 8 9 import static org.junit.Assert.assertThrows; 10 11 import android.content.Context; 12 13 import androidx.test.core.app.ApplicationProvider; 14 import androidx.test.ext.junit.runners.AndroidJUnit4; 15 import androidx.test.filters.SmallTest; 16 17 import com.google.common.collect.Range; 18 19 import org.junit.Before; 20 import org.junit.Test; 21 import org.junit.runner.RunWith; 22 23 import org.chromium.net.CronetEngine; 24 import org.chromium.net.impl.JavaCronetEngineBuilderImpl; 25 26 import java.util.AbstractMap; 27 import java.util.List; 28 import java.util.Map; 29 30 /** Test functionality of {@link FakeCronetController}. */ 31 @RunWith(AndroidJUnit4.class) 32 public class FakeCronetControllerTest { 33 Context mContext; 34 FakeCronetController mFakeCronetController; 35 36 @Before setUp()37 public void setUp() { 38 mContext = ApplicationProvider.getApplicationContext(); 39 mFakeCronetController = new FakeCronetController(); 40 } 41 42 @Test 43 @SmallTest testGetFakeCronetEnginesStartsEmpty()44 public void testGetFakeCronetEnginesStartsEmpty() { 45 List<CronetEngine> engines = FakeCronetController.getFakeCronetEngines(); 46 assertThat(engines).isEmpty(); 47 } 48 49 @Test 50 @SmallTest testGetFakeCronetEnginesIncludesCreatedEngineInOrder()51 public void testGetFakeCronetEnginesIncludesCreatedEngineInOrder() { 52 // Create an instance with the controller. 53 CronetEngine engine = mFakeCronetController.newFakeCronetEngineBuilder(mContext).build(); 54 // Create an instance with the provider. 55 FakeCronetProvider provider = new FakeCronetProvider(mContext); 56 CronetEngine providerEngine = provider.createBuilder().build(); 57 List<CronetEngine> engines = FakeCronetController.getFakeCronetEngines(); 58 59 assertThat(engines).containsExactly(engine, providerEngine).inOrder(); 60 } 61 62 @Test 63 @SmallTest testGetControllerGetsCorrectController()64 public void testGetControllerGetsCorrectController() { 65 // Create an instance with the controller. 66 CronetEngine engine = mFakeCronetController.newFakeCronetEngineBuilder(mContext).build(); 67 CronetEngine engine2 = mFakeCronetController.newFakeCronetEngineBuilder(mContext).build(); 68 69 // Create two engines with a second controller. 70 FakeCronetController newController = new FakeCronetController(); 71 CronetEngine newControllerEngine = 72 newController.newFakeCronetEngineBuilder(mContext).build(); 73 CronetEngine newControllerEngine2 = 74 newController.newFakeCronetEngineBuilder(mContext).build(); 75 76 // Create an instance with the provider. 77 FakeCronetProvider provider = new FakeCronetProvider(mContext); 78 CronetEngine providerEngine = provider.createBuilder().build(); 79 80 assertThat(FakeCronetController.getControllerForFakeEngine(engine)) 81 .isEqualTo(mFakeCronetController); 82 assertThat(FakeCronetController.getControllerForFakeEngine(engine2)) 83 .isEqualTo(mFakeCronetController); 84 assertThat(FakeCronetController.getControllerForFakeEngine(newControllerEngine)) 85 .isEqualTo(newController); 86 assertThat(FakeCronetController.getControllerForFakeEngine(newControllerEngine2)) 87 .isEqualTo(newController); 88 89 // TODO(kirchman): Test which controller the provider-created engine uses once the fake 90 // UrlRequest class has been implemented. 91 assertThat(FakeCronetController.getControllerForFakeEngine(providerEngine)) 92 .isNotEqualTo(mFakeCronetController); 93 assertThat(FakeCronetController.getControllerForFakeEngine(providerEngine)) 94 .isNotEqualTo(newController); 95 assertThat(FakeCronetController.getControllerForFakeEngine(providerEngine)).isNotNull(); 96 } 97 98 @Test 99 @SmallTest testAddNonFakeCronetEngineNotAllowed()100 public void testAddNonFakeCronetEngineNotAllowed() { 101 CronetEngine javaEngine = new JavaCronetEngineBuilderImpl(mContext).build(); 102 103 IllegalArgumentException e = 104 assertThrows( 105 IllegalArgumentException.class, 106 () -> FakeCronetController.getControllerForFakeEngine(javaEngine)); 107 assertThat(e) 108 .hasMessageThat() 109 .isEqualTo("Provided CronetEngine is not a fake CronetEngine"); 110 } 111 112 @Test 113 @SmallTest testShutdownRemovesCronetEngine()114 public void testShutdownRemovesCronetEngine() { 115 CronetEngine engine = mFakeCronetController.newFakeCronetEngineBuilder(mContext).build(); 116 CronetEngine engine2 = mFakeCronetController.newFakeCronetEngineBuilder(mContext).build(); 117 List<CronetEngine> engines = FakeCronetController.getFakeCronetEngines(); 118 assertThat(engines).containsExactly(engine, engine2); 119 120 engine.shutdown(); 121 engines = FakeCronetController.getFakeCronetEngines(); 122 123 assertThat(engines).containsExactly(engine2); 124 } 125 126 @Test 127 @SmallTest testResponseMatchersConsultedInOrderOfAddition()128 public void testResponseMatchersConsultedInOrderOfAddition() { 129 String url = "url"; 130 FakeUrlResponse response = 131 new FakeUrlResponse.Builder().setResponseBody("body text".getBytes()).build(); 132 ResponseMatcher matcher = new UrlResponseMatcher(url, response); 133 mFakeCronetController.addResponseMatcher(matcher); 134 mFakeCronetController.addSuccessResponse(url, "different text".getBytes()); 135 136 FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null); 137 138 assertThat(foundResponse).isEqualTo(response); 139 } 140 141 @Test 142 @SmallTest testRemoveResponseMatcher()143 public void testRemoveResponseMatcher() { 144 String url = "url"; 145 FakeUrlResponse response = 146 new FakeUrlResponse.Builder().setResponseBody("body text".getBytes()).build(); 147 ResponseMatcher matcher = new UrlResponseMatcher(url, response); 148 mFakeCronetController.addResponseMatcher(matcher); 149 mFakeCronetController.removeResponseMatcher(matcher); 150 151 FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null); 152 153 assertThat(foundResponse.getHttpStatusCode()).isEqualTo(404); 154 assertThat(foundResponse).isNotEqualTo(response); 155 } 156 157 @Test 158 @SmallTest testClearResponseMatchers()159 public void testClearResponseMatchers() { 160 String url = "url"; 161 FakeUrlResponse response = 162 new FakeUrlResponse.Builder().setResponseBody("body text".getBytes()).build(); 163 ResponseMatcher matcher = new UrlResponseMatcher(url, response); 164 mFakeCronetController.addResponseMatcher(matcher); 165 mFakeCronetController.clearResponseMatchers(); 166 167 FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null); 168 169 assertThat(foundResponse.getHttpStatusCode()).isEqualTo(404); 170 assertThat(foundResponse).isNotEqualTo(response); 171 } 172 173 @Test 174 @SmallTest testAddUrlResponseMatcher()175 public void testAddUrlResponseMatcher() { 176 String url = "url"; 177 FakeUrlResponse response = 178 new FakeUrlResponse.Builder().setResponseBody("body text".getBytes()).build(); 179 mFakeCronetController.addResponseForUrl(response, url); 180 181 FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null); 182 183 assertThat(foundResponse).isEqualTo(response); 184 } 185 186 @Test 187 @SmallTest testDefaultResponseIs404()188 public void testDefaultResponseIs404() { 189 FakeUrlResponse foundResponse = mFakeCronetController.getResponse("url", null, null, null); 190 191 assertThat(foundResponse.getHttpStatusCode()).isEqualTo(404); 192 } 193 194 @Test 195 @SmallTest testAddRedirectResponse()196 public void testAddRedirectResponse() { 197 String url = "url"; 198 String location = "/TEST_REDIRECT_LOCATION"; 199 mFakeCronetController.addRedirectResponse(location, url); 200 201 FakeUrlResponse foundResponse = mFakeCronetController.getResponse("url", null, null, null); 202 Map.Entry<String, String> headerEntry = new AbstractMap.SimpleEntry<>("location", location); 203 204 assertThat(foundResponse.getAllHeadersList()).contains(headerEntry); 205 assertThat(foundResponse.getHttpStatusCode()).isIn(Range.closedOpen(300, 400)); 206 } 207 208 @Test 209 @SmallTest testAddErrorResponse()210 public void testAddErrorResponse() { 211 String url = "url"; 212 int httpStatusCode = 400; 213 mFakeCronetController.addHttpErrorResponse(httpStatusCode, url); 214 215 FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null); 216 217 assertThat(foundResponse.getHttpStatusCode()).isEqualTo(httpStatusCode); 218 } 219 220 @Test 221 @SmallTest testAddErrorResponseWithNonErrorCodeThrowsException()222 public void testAddErrorResponseWithNonErrorCodeThrowsException() { 223 int nonErrorCode = 200; 224 IllegalArgumentException e = 225 assertThrows( 226 IllegalArgumentException.class, 227 () -> mFakeCronetController.addHttpErrorResponse(nonErrorCode, "url")); 228 assertThat(e) 229 .hasMessageThat() 230 .isEqualTo("Expected HTTP error code (code >= 400), but was: " + nonErrorCode); 231 } 232 233 @Test 234 @SmallTest testAddSuccessResponse()235 public void testAddSuccessResponse() { 236 String url = "url"; 237 String body = "TEST_BODY"; 238 mFakeCronetController.addSuccessResponse(url, body.getBytes()); 239 240 FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null); 241 242 assertThat(foundResponse.getHttpStatusCode()).isIn(Range.closedOpen(200, 300)); 243 assertThat(new String(foundResponse.getResponseBody())).isEqualTo(body); 244 } 245 } 246