| // Copyright 2017 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.support.test.InstrumentationRegistry; |
| import android.support.test.filters.SmallTest; |
| |
| import org.junit.Assert; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import org.chromium.base.test.BaseJUnit4ClassRunner; |
| |
| /** |
| * Test of ApiCompatibilityUtils |
| */ |
| @RunWith(BaseJUnit4ClassRunner.class) |
| public class ApiCompatibilityUtilsTest { |
| 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; |
| } |
| } |
| |
| @Test |
| @SmallTest |
| public void testFinishAndRemoveTask() { |
| InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { |
| @Override |
| public void run() { |
| MockActivity activity = new MockActivity(); |
| ApiCompatibilityUtils.finishAndRemoveTask(activity); |
| |
| if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { |
| Assert.assertEquals(1, activity.mFinishAndRemoveTaskCallbackCount); |
| Assert.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) { |
| try { |
| Thread.sleep(SLEEP_INTERVAL_IN_MS); |
| } catch (InterruptedException e) { |
| throw new RuntimeException("Interrupted thread sleep", e); |
| } |
| } |
| |
| // 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. |
| Assert.assertEquals(3, activity.mFinishAndRemoveTaskCallbackCount); |
| Assert.assertEquals(1, activity.mFinishCallbackCount); |
| } else { |
| Assert.assertEquals(0, activity.mFinishAndRemoveTaskCallbackCount); |
| Assert.assertEquals(1, activity.mFinishCallbackCount); |
| } |
| Assert.assertTrue(activity.mIsFinishing); |
| } |
| }); |
| } |
| } |