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 3 // found in the LICENSE file. 4 5 package org.chromium.base; 6 7 import android.annotation.TargetApi; 8 import android.app.Activity; 9 import android.os.Build; 10 import android.os.SystemClock; 11 import android.test.InstrumentationTestCase; 12 import android.test.suitebuilder.annotation.SmallTest; 13 14 /** 15 * Test of ApiCompatibilityUtils 16 */ 17 public class ApiCompatibilityUtilsTest extends InstrumentationTestCase { 18 private static final long WAIT_TIMEOUT_IN_MS = 5000; 19 private static final long SLEEP_INTERVAL_IN_MS = 50; 20 21 static class MockActivity extends Activity { 22 int mFinishAndRemoveTaskCallbackCount; 23 int mFinishCallbackCount; 24 boolean mIsFinishing; 25 26 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 27 @Override finishAndRemoveTask()28 public void finishAndRemoveTask() { 29 mFinishAndRemoveTaskCallbackCount++; 30 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) mIsFinishing = true; 31 } 32 33 @Override finish()34 public void finish() { 35 mFinishCallbackCount++; 36 mIsFinishing = true; 37 } 38 39 @Override isFinishing()40 public boolean isFinishing() { 41 return mIsFinishing; 42 } 43 } 44 45 @SmallTest testFinishAndRemoveTask()46 public void testFinishAndRemoveTask() throws InterruptedException { 47 MockActivity activity = new MockActivity(); 48 ApiCompatibilityUtils.finishAndRemoveTask(activity); 49 50 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { 51 assertEquals(1, activity.mFinishAndRemoveTaskCallbackCount); 52 assertEquals(0, activity.mFinishCallbackCount); 53 } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) { 54 long startTime = SystemClock.uptimeMillis(); 55 while (activity.mFinishCallbackCount == 0 56 && SystemClock.uptimeMillis() - startTime < WAIT_TIMEOUT_IN_MS) { 57 Thread.sleep(SLEEP_INTERVAL_IN_MS); 58 } 59 60 // MockActivity#finishAndRemoveTask() never sets isFinishing() to true for LOLLIPOP to 61 // simulate an exceptional case. In that case, MockActivity#finish() should be called 62 // after 3 tries. 63 assertEquals(3, activity.mFinishAndRemoveTaskCallbackCount); 64 assertEquals(1, activity.mFinishCallbackCount); 65 } else { 66 assertEquals(0, activity.mFinishAndRemoveTaskCallbackCount); 67 assertEquals(1, activity.mFinishCallbackCount); 68 } 69 assertTrue(activity.mIsFinishing); 70 } 71 } 72