| Index: components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java | 
| diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java | 
| index d9cc5578e7169c741dd1b7ec1095a251996df6bc..93d7e474711354dfb20cd89e38b78d9e2a6f47f4 100644 | 
| --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java | 
| +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java | 
| @@ -18,6 +18,9 @@ import org.chromium.net.TestUrlRequestListener.ResponseStep; | 
| import java.io.BufferedReader; | 
| import java.io.File; | 
| import java.io.FileReader; | 
| +import java.util.LinkedList; | 
| +import java.util.NoSuchElementException; | 
| +import java.util.concurrent.Executor; | 
|  | 
| /** | 
| * Test CronetUrlRequestContext. | 
| @@ -79,6 +82,46 @@ public class CronetUrlRequestContextTest extends CronetTestBase { | 
| } | 
| } | 
|  | 
| +    static class TestExecutor implements Executor { | 
| +        private final LinkedList<Runnable> mTaskQueue = new LinkedList<Runnable>(); | 
| + | 
| +        @Override | 
| +        public void execute(Runnable task) { | 
| +            mTaskQueue.add(task); | 
| +        } | 
| + | 
| +        public void runAllTasks() { | 
| +            try { | 
| +                while (mTaskQueue.size() > 0) { | 
| +                    mTaskQueue.remove().run(); | 
| +                } | 
| +            } catch (NoSuchElementException e) { | 
| +            } | 
| +        } | 
| +    } | 
| + | 
| +    static class TestNetworkQualityListener | 
| +            implements NetworkQualityRttListener, NetworkQualityThroughputListener { | 
| +        int mRttObservationCount; | 
| +        int mThroughputObservationCount; | 
| + | 
| +        public void onRttObservation(int rttMs, long when, int source) { | 
| +            mRttObservationCount++; | 
| +        } | 
| + | 
| +        public void onThroughputObservation(int throughputKbps, long when, int source) { | 
| +            mThroughputObservationCount++; | 
| +        } | 
| + | 
| +        public int rttObservationCount() { | 
| +            return mRttObservationCount; | 
| +        } | 
| + | 
| +        public int throughputObservationCount() { | 
| +            return mThroughputObservationCount; | 
| +        } | 
| +    } | 
| + | 
| @SmallTest | 
| @Feature({"Cronet"}) | 
| public void testConfigUserAgent() throws Exception { | 
| @@ -154,6 +197,65 @@ public class CronetUrlRequestContextTest extends CronetTestBase { | 
|  | 
| @SmallTest | 
| @Feature({"Cronet"}) | 
| +    public void testRealTimeNetworkQualityObservationsNotEnabled() throws Exception { | 
| +        mActivity = launchCronetTestApp(); | 
| +        TestNetworkQualityListener networkQualityListener = new TestNetworkQualityListener(); | 
| +        mActivity.mUrlRequestContext.addRttListener(networkQualityListener); | 
| +        mActivity.mUrlRequestContext.addThroughputListener(networkQualityListener); | 
| +        TestUrlRequestListener listener = new TestUrlRequestListener(); | 
| +        UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( | 
| +                TEST_URL, listener, listener.getExecutor()); | 
| +        urlRequest.start(); | 
| +        listener.blockForDone(); | 
| +        assertEquals(0, networkQualityListener.rttObservationCount()); | 
| +        assertEquals(0, networkQualityListener.throughputObservationCount()); | 
| +        mActivity.mUrlRequestContext.shutdown(); | 
| +    } | 
| + | 
| +    @SmallTest | 
| +    @Feature({"Cronet"}) | 
| +    public void testRealTimeNetworkQualityObservationsListenerRemoved() throws Exception { | 
| +        mActivity = launchCronetTestApp(); | 
| +        TestExecutor testExecutor = new TestExecutor(); | 
| +        TestNetworkQualityListener networkQualityListener = new TestNetworkQualityListener(); | 
| +        mActivity.mUrlRequestContext.enableNetworkQualityEstimator(true, true, testExecutor); | 
| +        mActivity.mUrlRequestContext.addRttListener(networkQualityListener); | 
| +        mActivity.mUrlRequestContext.addThroughputListener(networkQualityListener); | 
| +        mActivity.mUrlRequestContext.removeRttListener(networkQualityListener); | 
| +        mActivity.mUrlRequestContext.removeThroughputListener(networkQualityListener); | 
| +        TestUrlRequestListener listener = new TestUrlRequestListener(); | 
| +        UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( | 
| +                TEST_URL, listener, listener.getExecutor()); | 
| +        urlRequest.start(); | 
| +        listener.blockForDone(); | 
| +        testExecutor.runAllTasks(); | 
| +        assertEquals(0, networkQualityListener.rttObservationCount()); | 
| +        assertEquals(0, networkQualityListener.throughputObservationCount()); | 
| +        mActivity.mUrlRequestContext.shutdown(); | 
| +    } | 
| + | 
| +    @SmallTest | 
| +    @Feature({"Cronet"}) | 
| +    public void testRealTimeNetworkQualityObservations() throws Exception { | 
| +        mActivity = launchCronetTestApp(); | 
| +        TestExecutor testExecutor = new TestExecutor(); | 
| +        TestNetworkQualityListener networkQualityListener = new TestNetworkQualityListener(); | 
| +        mActivity.mUrlRequestContext.enableNetworkQualityEstimator(true, true, testExecutor); | 
| +        mActivity.mUrlRequestContext.addRttListener(networkQualityListener); | 
| +        mActivity.mUrlRequestContext.addThroughputListener(networkQualityListener); | 
| +        TestUrlRequestListener listener = new TestUrlRequestListener(); | 
| +        UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( | 
| +                TEST_URL, listener, listener.getExecutor()); | 
| +        urlRequest.start(); | 
| +        listener.blockForDone(); | 
| +        testExecutor.runAllTasks(); | 
| +        assertTrue(networkQualityListener.rttObservationCount() > 0); | 
| +        assertTrue(networkQualityListener.throughputObservationCount() > 0); | 
| +        mActivity.mUrlRequestContext.shutdown(); | 
| +    } | 
| + | 
| +    @SmallTest | 
| +    @Feature({"Cronet"}) | 
| public void testShutdown() throws Exception { | 
| mActivity = launchCronetTestApp(); | 
| TestUrlRequestListener listener = new ShutdownTestUrlRequestListener(); | 
|  |