Merge "Removing debug requests from non-debug test info handlers" into ub-launcher3-rvc-dev am: 84aaecca64

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/11827372

Change-Id: Iee1cd7c886309c32d6811ac949239350ea72d82e
This commit is contained in:
Vadim Tryshev 2020-06-19 16:51:52 +00:00 committed by Automerger Merge Worker
commit eee5fbe313
8 changed files with 178 additions and 149 deletions

View File

@ -67,7 +67,10 @@ LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
$(call all-java-files-under, src_shortcuts_overrides) \
$(call all-java-files-under, src_ui_overrides)
$(call all-java-files-under, src_ui_overrides) \
$(call all-java-files-under, ext_tests/src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/ext_tests/res
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
# Proguard is disable for testing. Derivarive prjects to keep proguard enabled

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="test_information_handler_class" translatable="false">com.android.launcher3.testing.DebugTestInformationHandler</string>
</resources>

View File

@ -0,0 +1,141 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.launcher3.testing;
import static android.graphics.Bitmap.Config.ARGB_8888;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Debug;
import android.system.Os;
import android.view.View;
import androidx.annotation.Keep;
import java.util.LinkedList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Class to handle requests from tests, including debug ones.
*/
public class DebugTestInformationHandler extends TestInformationHandler {
private static LinkedList sLeaks;
public DebugTestInformationHandler(Context context) {
init(context);
}
private static void runGcAndFinalizersSync() {
Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();
final CountDownLatch fence = new CountDownLatch(1);
createFinalizationObserver(fence);
try {
do {
Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();
} while (!fence.await(100, TimeUnit.MILLISECONDS));
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}
// Create the observer in the scope of a method to minimize the chance that
// it remains live in a DEX/machine register at the point of the fence guard.
// This must be kept to avoid R8 inlining it.
@Keep
private static void createFinalizationObserver(CountDownLatch fence) {
new Object() {
@Override
protected void finalize() throws Throwable {
try {
fence.countDown();
} finally {
super.finalize();
}
}
};
}
@Override
public Bundle call(String method) {
final Bundle response = new Bundle();
switch (method) {
case TestProtocol.REQUEST_APP_LIST_FREEZE_FLAGS: {
return getLauncherUIProperty(Bundle::putInt,
l -> l.getAppsView().getAppsStore().getDeferUpdatesFlags());
}
case TestProtocol.REQUEST_ENABLE_DEBUG_TRACING:
TestProtocol.sDebugTracing = true;
return response;
case TestProtocol.REQUEST_DISABLE_DEBUG_TRACING:
TestProtocol.sDebugTracing = false;
return response;
case TestProtocol.REQUEST_PID: {
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, Os.getpid());
return response;
}
case TestProtocol.REQUEST_TOTAL_PSS_KB: {
runGcAndFinalizersSync();
Debug.MemoryInfo mem = new Debug.MemoryInfo();
Debug.getMemoryInfo(mem);
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, mem.getTotalPss());
return response;
}
case TestProtocol.REQUEST_JAVA_LEAK: {
if (sLeaks == null) sLeaks = new LinkedList();
// Allocate and dirty the memory.
final int leakSize = 1024 * 1024;
final byte[] bytes = new byte[leakSize];
for (int i = 0; i < leakSize; i += 239) {
bytes[i] = (byte) (i % 256);
}
sLeaks.add(bytes);
return response;
}
case TestProtocol.REQUEST_NATIVE_LEAK: {
if (sLeaks == null) sLeaks = new LinkedList();
// Allocate and dirty a bitmap.
final Bitmap bitmap = Bitmap.createBitmap(512, 512, ARGB_8888);
bitmap.eraseColor(Color.RED);
sLeaks.add(bitmap);
return response;
}
case TestProtocol.REQUEST_VIEW_LEAK: {
if (sLeaks == null) sLeaks = new LinkedList();
sLeaks.add(new View(mContext));
return response;
}
default:
return super.call(method);
}
}
}

View File

@ -4,21 +4,18 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import com.android.launcher3.LauncherState;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.testing.TestInformationHandler;
import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.uioverrides.touchcontrollers.PortraitStatesTouchController;
import com.android.quickstep.util.LayoutUtils;
import com.android.systemui.shared.recents.model.Task;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class QuickstepTestInformationHandler extends TestInformationHandler {
private final Context mContext;
protected final Context mContext;
public QuickstepTestInformationHandler(Context context) {
mContext = context;
}
@ -27,6 +24,15 @@ public class QuickstepTestInformationHandler extends TestInformationHandler {
public Bundle call(String method) {
final Bundle response = new Bundle();
switch (method) {
case TestProtocol.REQUEST_ALL_APPS_TO_OVERVIEW_SWIPE_HEIGHT: {
return getLauncherUIProperty(Bundle::putInt, l -> {
final float progress = LauncherState.OVERVIEW.getVerticalProgress(l)
- LauncherState.ALL_APPS.getVerticalProgress(l);
final float distance = l.getAllAppsController().getShiftRange() * progress;
return (int) distance;
});
}
case TestProtocol.REQUEST_HOME_TO_OVERVIEW_SWIPE_HEIGHT: {
final float swipeHeight =
LayoutUtils.getDefaultSwipeHeight(mContext, mDeviceProfile);
@ -47,26 +53,6 @@ public class QuickstepTestInformationHandler extends TestInformationHandler {
Bundle::putInt, PortraitStatesTouchController::getHotseatTop);
}
case TestProtocol.REQUEST_RECENT_TASKS_LIST: {
ArrayList<String> taskBaseIntentComponents = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(1);
RecentsModel.INSTANCE.get(mContext).getTasks((tasks) -> {
for (Task t : tasks) {
taskBaseIntentComponents.add(
t.key.baseIntent.getComponent().flattenToString());
}
latch.countDown();
});
try {
latch.await(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
response.putStringArrayList(TestProtocol.TEST_INFO_RESPONSE_FIELD,
taskBaseIntentComponents);
return response;
}
case TestProtocol.REQUEST_OVERVIEW_ACTIONS_ENABLED: {
response.putBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD,
FeatureFlags.ENABLE_OVERVIEW_ACTIONS.get());

View File

@ -15,27 +15,17 @@
*/
package com.android.launcher3.testing;
import static android.graphics.Bitmap.Config.ARGB_8888;
import static com.android.launcher3.allapps.AllAppsStore.DEFER_UPDATES_TEST;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Insets;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.system.Os;
import android.util.Log;
import android.view.View;
import android.view.WindowInsets;
import androidx.annotation.Keep;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.Launcher;
@ -44,10 +34,7 @@ import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.util.ResourceBasedOverride;
import java.util.LinkedList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Supplier;
@ -65,7 +52,6 @@ public class TestInformationHandler implements ResourceBasedOverride {
protected Context mContext;
protected DeviceProfile mDeviceProfile;
protected LauncherAppState mLauncherAppState;
private static LinkedList mLeaks;
public void init(Context context) {
mContext = context;
@ -77,15 +63,6 @@ public class TestInformationHandler implements ResourceBasedOverride {
public Bundle call(String method) {
final Bundle response = new Bundle();
switch (method) {
case TestProtocol.REQUEST_ALL_APPS_TO_OVERVIEW_SWIPE_HEIGHT: {
return getLauncherUIProperty(Bundle::putInt, l -> {
final float progress = LauncherState.OVERVIEW.getVerticalProgress(l)
- LauncherState.ALL_APPS.getVerticalProgress(l);
final float distance = l.getAllAppsController().getShiftRange() * progress;
return (int) distance;
});
}
case TestProtocol.REQUEST_HOME_TO_ALL_APPS_SWIPE_HEIGHT: {
return getLauncherUIProperty(Bundle::putInt, l -> {
final float progress = LauncherState.NORMAL.getVerticalProgress(l)
@ -99,14 +76,6 @@ public class TestInformationHandler implements ResourceBasedOverride {
return getUIProperty(Bundle::putBoolean, t -> isLauncherInitialized(), () -> true);
}
case TestProtocol.REQUEST_ENABLE_DEBUG_TRACING:
TestProtocol.sDebugTracing = true;
break;
case TestProtocol.REQUEST_DISABLE_DEBUG_TRACING:
TestProtocol.sDebugTracing = false;
break;
case TestProtocol.REQUEST_FREEZE_APP_LIST:
return getLauncherUIProperty(Bundle::putBoolean, l -> {
l.getAppsView().getAppsStore().enableDeferUpdates(DEFER_UPDATES_TEST);
@ -118,11 +87,6 @@ public class TestInformationHandler implements ResourceBasedOverride {
return true;
});
case TestProtocol.REQUEST_APP_LIST_FREEZE_FLAGS: {
return getLauncherUIProperty(Bundle::putInt,
l -> l.getAppsView().getAppsStore().getDeferUpdatesFlags());
}
case TestProtocol.REQUEST_APPS_LIST_SCROLL_Y: {
return getLauncherUIProperty(Bundle::putInt,
l -> l.getAppsView().getActiveRecyclerView().getCurrentScrollY());
@ -137,59 +101,19 @@ public class TestInformationHandler implements ResourceBasedOverride {
}, this::getCurrentActivity);
}
case TestProtocol.REQUEST_PID: {
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, Os.getpid());
break;
}
case TestProtocol.REQUEST_TOTAL_PSS_KB: {
runGcAndFinalizersSync();
Debug.MemoryInfo mem = new Debug.MemoryInfo();
Debug.getMemoryInfo(mem);
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, mem.getTotalPss());
break;
}
case TestProtocol.REQUEST_JAVA_LEAK: {
if (mLeaks == null) mLeaks = new LinkedList();
// Allocate and dirty the memory.
final int leakSize = 1024 * 1024;
final byte[] bytes = new byte[leakSize];
for (int i = 0; i < leakSize; i += 239) {
bytes[i] = (byte) (i % 256);
}
mLeaks.add(bytes);
break;
}
case TestProtocol.REQUEST_NATIVE_LEAK: {
if (mLeaks == null) mLeaks = new LinkedList();
// Allocate and dirty a bitmap.
final Bitmap bitmap = Bitmap.createBitmap(512, 512, ARGB_8888);
bitmap.eraseColor(Color.RED);
mLeaks.add(bitmap);
break;
}
case TestProtocol.REQUEST_VIEW_LEAK: {
if (mLeaks == null) mLeaks = new LinkedList();
mLeaks.add(new View(mContext));
break;
}
case TestProtocol.REQUEST_ICON_HEIGHT: {
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
mDeviceProfile.allAppsCellHeightPx);
break;
return response;
}
case TestProtocol.REQUEST_MOCK_SENSOR_ROTATION:
TestProtocol.sDisableSensorRotation = true;
break;
return response;
default:
return null;
}
return response;
}
protected boolean isLauncherInitialized() {
@ -201,22 +125,6 @@ public class TestInformationHandler implements ResourceBasedOverride {
return Launcher.ACTIVITY_TRACKER.getCreatedActivity();
}
private static void runGcAndFinalizersSync() {
Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();
final CountDownLatch fence = new CountDownLatch(1);
createFinalizationObserver(fence);
try {
do {
Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();
} while (!fence.await(100, TimeUnit.MILLISECONDS));
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}
/**
* Returns the result by getting a Launcher property on UI thread
*/
@ -257,21 +165,4 @@ public class TestInformationHandler implements ResourceBasedOverride {
*/
void set(Bundle b, String key, T value);
}
// Create the observer in the scope of a method to minimize the chance that
// it remains live in a DEX/machine register at the point of the fence guard.
// This must be kept to avoid R8 inlining it.
@Keep
private static void createFinalizationObserver(CountDownLatch fence) {
new Object() {
@Override
protected void finalize() throws Throwable {
try {
fence.countDown();
} finally {
super.finalize();
}
}
};
}
}

View File

@ -294,7 +294,8 @@ public abstract class AbstractLauncherUiTest {
// Limits UI tests affecting tests running after them.
mLauncher.waitForLauncherInitialized();
if (mLauncherPid != 0) {
assertEquals("Launcher crashed, pid mismatch:", mLauncherPid, mLauncher.getPid());
assertEquals("Launcher crashed, pid mismatch:",
mLauncherPid, mLauncher.getPid().intValue());
}
checkDetectedLeaks(mLauncher);
}

View File

@ -18,6 +18,7 @@ package com.android.launcher3.tapl;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.NonNull;
@ -244,8 +245,8 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer {
}
private void verifyNotFrozen(String message) {
mLauncher.assertEquals(message, 0, mLauncher.getTestInfo(
TestProtocol.REQUEST_APP_LIST_FREEZE_FLAGS).
getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD));
final Bundle testInfo = mLauncher.getTestInfo(TestProtocol.REQUEST_APP_LIST_FREEZE_FLAGS);
if (testInfo == null) return;
mLauncher.assertEquals(message, 0, testInfo.getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD));
}
}

View File

@ -1309,8 +1309,9 @@ public final class LauncherInstrumentation {
getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD);
}
public int getPid() {
return getTestInfo(TestProtocol.REQUEST_PID).getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD);
public Integer getPid() {
final Bundle testInfo = getTestInfo(TestProtocol.REQUEST_PID);
return testInfo != null ? testInfo.getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD) : null;
}
public void produceJavaLeak() {
@ -1338,13 +1339,13 @@ public final class LauncherInstrumentation {
public Closable eventsCheck() {
Assert.assertTrue("Nested event checking", !sCheckingEvents);
disableSensorRotation();
final int initialPid = getPid();
final Integer initialPid = getPid();
if (sEventChecker == null) sEventChecker = new LogEventChecker();
sEventChecker.start();
sCheckingEvents = true;
return () -> {
if (initialPid != getPid()) {
if (initialPid != null && initialPid.intValue() != getPid()) {
if (mOnLauncherCrashed != null) mOnLauncherCrashed.run();
checkForAnomaly();
Assert.fail(