Commit b9495c0a authored by Hazem Ashmawy's avatar Hazem Ashmawy Committed by Commit Bot

[AW][Dev-ui] test crashUi buttons actions

Add espresso tests for button actions available in crash UI:
- Report an uploaded crash.
- Force upload a skipped or a pending crash.
- Refresh the crash list.

This adds a delegate class to mock network checks and upload job.

Fixed: 1106313
Test: run_webview_instrumentation_test_apk -f "*android_webview.devui*"
Change-Id: Ic513f8cd9194ab1873849076549a2ad959a8f9c9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2392254
Commit-Queue: Hazem Ashmawy <hazems@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#806753}
parent 5cc75193
...@@ -11,6 +11,7 @@ import android.net.ConnectivityManager; ...@@ -11,6 +11,7 @@ import android.net.ConnectivityManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.annotation.VisibleForTesting;
import org.chromium.android_webview.common.services.ServiceNames; import org.chromium.android_webview.common.services.ServiceNames;
import org.chromium.base.Log; import org.chromium.base.Log;
...@@ -27,13 +28,44 @@ import java.io.File; ...@@ -27,13 +28,44 @@ import java.io.File;
public final class CrashUploadUtil { public final class CrashUploadUtil {
private static final String TAG = "CrashUploadUtil"; private static final String TAG = "CrashUploadUtil";
/**
* Delegate interface to mock network status check and scheduling upload jobs for testing.
*/
@VisibleForTesting
public static interface CrashUploadDelegate {
/**
* Schedule a MinidumpUploadJobService to attempt uploading all ready crash minidumps.
*/
void scheduleNewJob(@NonNull Context context);
/**
* Check if network is unmetered or not.
*/
boolean isNetworkUnmetered(@NonNull Context context);
}
private static CrashUploadDelegate sDelegate = new CrashUploadDelegate() {
@Override
public void scheduleNewJob(@NonNull Context context) {
JobInfo.Builder builder = new JobInfo.Builder(TaskIds.WEBVIEW_MINIDUMP_UPLOADING_JOB_ID,
new ComponentName(context, ServiceNames.AW_MINIDUMP_UPLOAD_JOB_SERVICE));
MinidumpUploadJobService.scheduleUpload(builder);
}
@Override
public boolean isNetworkUnmetered(@NonNull Context context) {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
return NetworkPermissionUtil.isNetworkUnmetered(connectivityManager);
}
};
/** /**
* Schedule a MinidumpUploadJobService to attempt uploading all ready crash minidumps. * Schedule a MinidumpUploadJobService to attempt uploading all ready crash minidumps.
*/ */
public static void scheduleNewJob(@NonNull Context context) { public static void scheduleNewJob(@NonNull Context context) {
JobInfo.Builder builder = new JobInfo.Builder(TaskIds.WEBVIEW_MINIDUMP_UPLOADING_JOB_ID, sDelegate.scheduleNewJob(context);
new ComponentName(context, ServiceNames.AW_MINIDUMP_UPLOAD_JOB_SERVICE));
MinidumpUploadJobService.scheduleUpload(builder);
} }
/** /**
...@@ -66,10 +98,12 @@ public final class CrashUploadUtil { ...@@ -66,10 +98,12 @@ public final class CrashUploadUtil {
} }
public static boolean isNetworkUnmetered(@NonNull Context context) { public static boolean isNetworkUnmetered(@NonNull Context context) {
ConnectivityManager connectivityManager = return sDelegate.isNetworkUnmetered(context);
(ConnectivityManager) context.getApplicationContext().getSystemService( }
Context.CONNECTIVITY_SERVICE);
return NetworkPermissionUtil.isNetworkUnmetered(connectivityManager); @VisibleForTesting
public static void setCrashUploadDelegateForTesting(CrashUploadDelegate delegate) {
sDelegate = delegate;
} }
// Do not instantiate this class. // Do not instantiate this class.
......
...@@ -6,6 +6,7 @@ package org.chromium.android_webview.test.devui; ...@@ -6,6 +6,7 @@ package org.chromium.android_webview.test.devui;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
...@@ -63,6 +64,17 @@ public class DeveloperUiTestUtils { ...@@ -63,6 +64,17 @@ public class DeveloperUiTestUtils {
}); });
} }
public static void setClipBoardTextOnUiThread(Context context, String key, String value)
throws ExecutionException {
// ClipManager service has to be called on the UI main thread.
TestThreadUtils.runOnUiThreadBlocking(() -> {
ClipboardManager clipboardManager =
(ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(key, value);
clipboardManager.setPrimaryClip(clip);
});
}
// Don't instantiate this class. // Don't instantiate this class.
private DeveloperUiTestUtils() {} private DeveloperUiTestUtils() {}
} }
...@@ -62,6 +62,13 @@ import java.util.Locale; ...@@ -62,6 +62,13 @@ import java.util.Locale;
public class CrashesListFragment extends DevUiBaseFragment { public class CrashesListFragment extends DevUiBaseFragment {
private static final String TAG = "WebViewDevTools"; private static final String TAG = "WebViewDevTools";
public static final String CRASH_BUG_DIALOG_MESSAGE =
"This crash has already been reported to our crash system. "
+ "Do you want to share more information, such as steps to reproduce the crash?";
public static final String NO_WIFI_DIALOG_MESSAGE =
"You are connected to a metered network or cellular data."
+ " Do you want to proceed?";
// Max number of crashes to show in the crashes list. // Max number of crashes to show in the crashes list.
public static final int MAX_CRASHES_NUMBER = 20; public static final int MAX_CRASHES_NUMBER = 20;
...@@ -273,9 +280,7 @@ public class CrashesListFragment extends DevUiBaseFragment { ...@@ -273,9 +280,7 @@ public class CrashesListFragment extends DevUiBaseFragment {
if (!CrashUploadUtil.isNetworkUnmetered(mContext)) { if (!CrashUploadUtil.isNetworkUnmetered(mContext)) {
new AlertDialog.Builder(mContext) new AlertDialog.Builder(mContext)
.setTitle("Network Warning") .setTitle("Network Warning")
.setMessage( .setMessage(NO_WIFI_DIALOG_MESSAGE)
"You are connected to a metered network or cellular data."
+ " Do you want to proceed?")
.setPositiveButton("Upload", .setPositiveButton("Upload",
(dialog, id) -> { (dialog, id) -> {
logCrashInteraction( logCrashInteraction(
...@@ -503,9 +508,7 @@ public class CrashesListFragment extends DevUiBaseFragment { ...@@ -503,9 +508,7 @@ public class CrashesListFragment extends DevUiBaseFragment {
private AlertDialog buildCrashBugDialog(CrashInfo crashInfo) { private AlertDialog buildCrashBugDialog(CrashInfo crashInfo) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext); AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
dialogBuilder.setMessage( dialogBuilder.setMessage(CRASH_BUG_DIALOG_MESSAGE);
"This crash has already been reported to our crash system. Do you want to share "
+ "more information, such as steps to reproduce the crash?");
dialogBuilder.setPositiveButton("Provide more info", (dialog, id) -> { dialogBuilder.setPositiveButton("Provide more info", (dialog, id) -> {
logCrashInteraction(CrashInteraction.FILE_BUG_REPORT_DIALOG_PROCEED); logCrashInteraction(CrashInteraction.FILE_BUG_REPORT_DIALOG_PROCEED);
startActivity(new CrashBugUrlFactory(crashInfo).getReportIntent()); startActivity(new CrashBugUrlFactory(crashInfo).getReportIntent());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment