blob: de0858a58a4ab6bd032f21294b03b61794298d92 [file] [log] [blame]
// 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);
}
});
}
}