| Index: base/android/javatests/src/org/chromium/base/ApiCompatibilityUtilsTest.java
 | 
| diff --git a/base/android/javatests/src/org/chromium/base/ApiCompatibilityUtilsTest.java b/base/android/javatests/src/org/chromium/base/ApiCompatibilityUtilsTest.java
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..45b3e21150c34b15fd925904c70d96437f418f65
 | 
| --- /dev/null
 | 
| +++ b/base/android/javatests/src/org/chromium/base/ApiCompatibilityUtilsTest.java
 | 
| @@ -0,0 +1,71 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +package org.chromium.base;
 | 
| +
 | 
| +import android.annotation.TargetApi;
 | 
| +import android.app.Activity;
 | 
| +import android.os.Build;
 | 
| +import android.os.SystemClock;
 | 
| +import android.test.InstrumentationTestCase;
 | 
| +import android.test.suitebuilder.annotation.SmallTest;
 | 
| +
 | 
| +/**
 | 
| + * Test of ApiCompatibilityUtils
 | 
| + */
 | 
| +public class ApiCompatibilityUtilsTest extends InstrumentationTestCase {
 | 
| +    private static final long WAIT_TIMEOUT_IN_MS = 5000;
 | 
| +    private static final long SLEEP_INTERVAL_IN_MS = 50;
 | 
| +
 | 
| +    static class MockActivity extends Activity {
 | 
| +        int mFinishAndRemoveTaskCallbackCount;
 | 
| +        int mFinishCallbackCount;
 | 
| +        boolean mIsFinishing;
 | 
| +
 | 
| +        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
 | 
| +        @Override
 | 
| +        public void finishAndRemoveTask() {
 | 
| +            mFinishAndRemoveTaskCallbackCount++;
 | 
| +            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) mIsFinishing = true;
 | 
| +        }
 | 
| +
 | 
| +        @Override
 | 
| +        public void finish() {
 | 
| +            mFinishCallbackCount++;
 | 
| +            mIsFinishing = true;
 | 
| +        }
 | 
| +
 | 
| +        @Override
 | 
| +        public boolean isFinishing() {
 | 
| +            return mIsFinishing;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    @SmallTest
 | 
| +    public void testFinishAndRemoveTask() throws InterruptedException {
 | 
| +        MockActivity activity = new MockActivity();
 | 
| +        ApiCompatibilityUtils.finishAndRemoveTask(activity);
 | 
| +
 | 
| +        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
 | 
| +            assertEquals(1, activity.mFinishAndRemoveTaskCallbackCount);
 | 
| +            assertEquals(0, activity.mFinishCallbackCount);
 | 
| +        } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
 | 
| +            long startTime = SystemClock.uptimeMillis();
 | 
| +            while (activity.mFinishCallbackCount == 0
 | 
| +                    && SystemClock.uptimeMillis() - startTime < WAIT_TIMEOUT_IN_MS) {
 | 
| +                Thread.sleep(SLEEP_INTERVAL_IN_MS);
 | 
| +            }
 | 
| +
 | 
| +            // MockActivity#finishAndRemoveTask() never sets isFinishing() to true for LOLLIPOP to
 | 
| +            // simulate an exceptional case. In that case, MockActivity#finish() should be called
 | 
| +            // after 3 tries.
 | 
| +            assertEquals(3, activity.mFinishAndRemoveTaskCallbackCount);
 | 
| +            assertEquals(1, activity.mFinishCallbackCount);
 | 
| +        } else {
 | 
| +            assertEquals(0, activity.mFinishAndRemoveTaskCallbackCount);
 | 
| +            assertEquals(1, activity.mFinishCallbackCount);
 | 
| +        }
 | 
| +        assertTrue(activity.mIsFinishing);
 | 
| +    }
 | 
| +}
 | 
| 
 |