| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.net; | 5 package org.chromium.net; |
| 6 | 6 |
| 7 import android.test.suitebuilder.annotation.SmallTest; | 7 import android.test.suitebuilder.annotation.SmallTest; |
| 8 | 8 |
| 9 import org.chromium.base.test.util.Feature; | 9 import org.chromium.base.test.util.Feature; |
| 10 | 10 |
| 11 import java.util.Arrays; | 11 import java.util.Arrays; |
| 12 import java.util.List; | 12 import java.util.List; |
| 13 import java.util.concurrent.ExecutorService; | 13 import java.util.concurrent.ExecutorService; |
| 14 import java.util.concurrent.Executors; | 14 import java.util.concurrent.Executors; |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * Tests that directly drive {@code CronetUploadDataStream} and | 17 * Tests that directly drive {@code CronetUploadDataStream} and |
| 18 * {@code UploadDataProvider} to simulate different ordering of reset, init, | 18 * {@code UploadDataProvider} to simulate different ordering of reset, init, |
| 19 * read, and rewind calls. | 19 * read, and rewind calls. |
| 20 */ | 20 */ |
| 21 public class CronetUploadTest extends CronetTestBase { | 21 public class CronetUploadTest extends CronetTestBase { |
| 22 private TestDrivenDataProvider mDataProvider; | 22 private TestDrivenDataProvider mDataProvider; |
| 23 private CronetUploadDataStream mUploadDataStream; | 23 private CronetUploadDataStream mUploadDataStream; |
| 24 private TestUploadDataStreamHandler mHandler; | 24 private TestUploadDataStreamHandler mHandler; |
| 25 // Address of native CronetUploadDataStreamAdapter object. | |
| 26 private long mAdapter = 0; | |
| 27 | 25 |
| 28 @Override | 26 @Override |
| 29 protected void setUp() throws Exception { | 27 protected void setUp() throws Exception { |
| 30 super.setUp(); | 28 super.setUp(); |
| 31 launchCronetTestApp(); | 29 launchCronetTestApp(); |
| 32 ExecutorService executor = Executors.newSingleThreadExecutor(); | 30 ExecutorService executor = Executors.newSingleThreadExecutor(); |
| 33 List<byte[]> reads = Arrays.asList("hello".getBytes()); | 31 List<byte[]> reads = Arrays.asList("hello".getBytes()); |
| 34 mDataProvider = new TestDrivenDataProvider(executor, reads); | 32 mDataProvider = new TestDrivenDataProvider(executor, reads); |
| 35 mUploadDataStream = new CronetUploadDataStream(mDataProvider, executor); | 33 mUploadDataStream = new CronetUploadDataStream(mDataProvider, executor); |
| 36 mAdapter = mUploadDataStream.createAdapterForTesting(); | 34 mHandler = new TestUploadDataStreamHandler( |
| 37 mHandler = new TestUploadDataStreamHandler(mAdapter); | 35 mUploadDataStream.createAdapterForTesting()); |
| 38 } | 36 } |
| 39 | 37 |
| 40 @Override | 38 @Override |
| 41 protected void tearDown() throws Exception { | 39 protected void tearDown() throws Exception { |
| 42 // Destroy handler's native objects. | 40 // Destroy handler's native objects. |
| 43 mHandler.destroyNativeObjects(); | 41 mHandler.destroyNativeObjects(); |
| 44 super.tearDown(); | 42 super.tearDown(); |
| 45 } | 43 } |
| 46 | 44 |
| 47 /** | 45 /** |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 @SmallTest | 232 @SmallTest |
| 235 @Feature({"Cronet"}) | 233 @Feature({"Cronet"}) |
| 236 public void testDestroyAdapterBeforeReadComplete() | 234 public void testDestroyAdapterBeforeReadComplete() |
| 237 throws Exception { | 235 throws Exception { |
| 238 // Start a read and wait for it to be pending. | 236 // Start a read and wait for it to be pending. |
| 239 assertTrue(mHandler.init()); | 237 assertTrue(mHandler.init()); |
| 240 mHandler.read(); | 238 mHandler.read(); |
| 241 mDataProvider.waitForReadRequest(); | 239 mDataProvider.waitForReadRequest(); |
| 242 mHandler.checkReadCallbackNotInvoked(); | 240 mHandler.checkReadCallbackNotInvoked(); |
| 243 | 241 |
| 244 // Destroy the C++ object, which should trigger the Java | 242 // Destroy the C++ TestUploadDataStreamHandler. The handler owns the |
| 245 // onAdapterDestroyed() which should block until the read completes. | 243 // CronetUploadDataStreamAdapter, which this will cause it to destroy on |
| 246 mAdapter = 0; | 244 // the network thread. Destroying the adapter will result in calling |
| 245 // the CronetUploadDataSteam's onAdapterDestroyed() method on its |
| 246 // executor thread, which will then destroy the |
| 247 // CronetUploadDataStreamDelegate. |
| 248 mHandler.destroyNativeObjects(); |
| 247 | 249 |
| 248 // Make the read complete should not encounter a crash. | 250 // Make the read complete should not encounter a crash. |
| 249 mDataProvider.onReadSucceeded(mUploadDataStream); | 251 mDataProvider.onReadSucceeded(mUploadDataStream); |
| 250 | 252 |
| 251 assertEquals(0, mDataProvider.getNumRewindCalls()); | 253 assertEquals(0, mDataProvider.getNumRewindCalls()); |
| 252 assertEquals(1, mDataProvider.getNumReadCalls()); | 254 assertEquals(1, mDataProvider.getNumReadCalls()); |
| 253 } | 255 } |
| 254 | 256 |
| 255 /** | 257 /** |
| 256 * Tests that there is no crash when native CronetUploadDataStreamAdapter is | 258 * Tests that there is no crash when native CronetUploadDataStreamAdapter is |
| (...skipping 18 matching lines...) Expand all Loading... |
| 275 assertEquals(1, mDataProvider.getNumReadCalls()); | 277 assertEquals(1, mDataProvider.getNumReadCalls()); |
| 276 assertEquals("hello", mHandler.getData()); | 278 assertEquals("hello", mHandler.getData()); |
| 277 | 279 |
| 278 // Reset and then init, which should trigger a rewind. | 280 // Reset and then init, which should trigger a rewind. |
| 279 mHandler.reset(); | 281 mHandler.reset(); |
| 280 assertEquals("", mHandler.getData()); | 282 assertEquals("", mHandler.getData()); |
| 281 assertFalse(mHandler.init()); | 283 assertFalse(mHandler.init()); |
| 282 mDataProvider.waitForRewindRequest(); | 284 mDataProvider.waitForRewindRequest(); |
| 283 mHandler.checkInitCallbackNotInvoked(); | 285 mHandler.checkInitCallbackNotInvoked(); |
| 284 | 286 |
| 285 // Destroy the C++ object, which should trigger the Java | 287 // Destroy the C++ TestUploadDataStreamHandler. The handler owns the |
| 286 // onAdapterDestroyed(). | 288 // CronetUploadDataStreamAdapter, which this will cause it to destroy on |
| 287 mAdapter = 0; | 289 // the network thread. Destroying the adapter will result in calling |
| 290 // the CronetUploadDataSteam's onAdapterDestroyed() method on its |
| 291 // executor thread, which will then destroy the |
| 292 // CronetUploadDataStreamDelegate. |
| 293 mHandler.destroyNativeObjects(); |
| 288 | 294 |
| 289 // Signal rewind completes, and wait for init to complete. | 295 // Signal rewind completes, and wait for init to complete. |
| 290 mHandler.checkInitCallbackNotInvoked(); | |
| 291 mDataProvider.onRewindSucceeded(mUploadDataStream); | 296 mDataProvider.onRewindSucceeded(mUploadDataStream); |
| 292 mHandler.waitForInitComplete(); | |
| 293 mDataProvider.assertRewindNotPending(); | |
| 294 | 297 |
| 295 assertEquals(1, mDataProvider.getNumRewindCalls()); | 298 assertEquals(1, mDataProvider.getNumRewindCalls()); |
| 296 assertEquals(1, mDataProvider.getNumReadCalls()); | 299 assertEquals(1, mDataProvider.getNumReadCalls()); |
| 297 } | 300 } |
| 298 } | 301 } |
| OLD | NEW |