Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1840)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/crash/MinidumpUploaderTest.java

Issue 2655023008: [Android WebView] Ensure Android Checkbox is on when uploading minidumps (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/javatests/src/org/chromium/android_webview/test/crash/MinidumpUploaderTest.java
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/crash/MinidumpUploaderTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/crash/MinidumpUploaderTest.java
index 0f39c4c4fe377d4cc63311ed13a89026b4cbd9bc..1ff8dc96dd7392e79809448409e17a11f0418809 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/crash/MinidumpUploaderTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/crash/MinidumpUploaderTest.java
@@ -9,11 +9,14 @@ import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
import android.content.Context;
import android.os.ParcelFileDescriptor;
import android.test.suitebuilder.annotation.MediumTest;
+import android.webkit.ValueCallback;
+import org.chromium.android_webview.PlatformServiceBridge;
import org.chromium.android_webview.crash.CrashReceiverService;
import org.chromium.android_webview.crash.MinidumpUploader;
import org.chromium.android_webview.crash.MinidumpUploaderImpl;
import org.chromium.base.FileUtils;
+import org.chromium.base.ThreadUtils;
import org.chromium.components.minidump_uploader.CrashFileManager;
import org.chromium.components.minidump_uploader.CrashTestCase;
import org.chromium.components.minidump_uploader.MinidumpUploadCallable;
@@ -47,6 +50,51 @@ public class MinidumpUploaderTest extends CrashTestCase {
return CrashReceiverService.createWebViewCrashDir(getInstrumentation().getTargetContext());
}
+ private static class TestPlatformServiceBridge extends PlatformServiceBridge {
+ boolean mCanUseGms;
+ boolean mUserPermitted;
+
+ public TestPlatformServiceBridge(boolean canUseGms, boolean userPermitted) {
+ mCanUseGms = canUseGms;
+ mUserPermitted = userPermitted;
+ }
+
+ @Override
+ public boolean canUseGms() {
+ return mCanUseGms;
+ }
+
+ @Override
+ public void queryMetricsSetting(ValueCallback<Boolean> callback) {
+ ThreadUtils.assertOnUiThread();
+ callback.onReceiveValue(mUserPermitted);
+ }
+ }
+
+ private static class TestMinidumpUploaderImpl extends MinidumpUploaderImpl {
+ private CrashReportingPermissionManager mPermissionManager;
+
+ TestMinidumpUploaderImpl(Context context, CrashReportingPermissionManager permissionManager,
+ boolean cleanOutMinidumps) {
+ super(context, cleanOutMinidumps);
+ mPermissionManager = permissionManager;
+ }
+
+ @Override
+ public MinidumpUploadCallable createMinidumpUploadCallable(
+ File minidumpFile, File logfile) {
+ return new MinidumpUploadCallable(minidumpFile, logfile,
+ new MinidumpUploadCallableTest.TestHttpURLConnectionFactory(),
+ mPermissionManager);
+ }
+
+ @Override
+ public PlatformServiceBridge createPlatformServiceBridge() {
+ return new TestPlatformServiceBridge(true /* canUseGms */,
+ mPermissionManager.isUsageAndCrashReportingPermittedByUser());
+ }
+ }
+
/**
* Test to ensure the minidump uploading mechanism behaves as expected when we fail to upload
* minidumps.
@@ -64,15 +112,9 @@ public class MinidumpUploaderTest extends CrashTestCase {
mIsEnabledForTests = false;
}
};
- MinidumpUploader minidumpUploader = new MinidumpUploaderImpl(
- getInstrumentation().getTargetContext(), false /* cleanOutMinidumps */) {
- @Override
- public MinidumpUploadCallable createMinidumpUploadCallable(
- File minidumpFile, File logfile) {
- return new MinidumpUploadCallable(minidumpFile, logfile,
- new MinidumpUploadCallableTest.TestHttpURLConnectionFactory(), permManager);
- }
- };
+ MinidumpUploader minidumpUploader =
+ new TestMinidumpUploaderImpl(getInstrumentation().getTargetContext(), permManager,
+ false /* cleanOutMinidumps */);
File firstFile = createMinidumpFileInCrashDir("1_abc.dmp0");
File secondFile = createMinidumpFileInCrashDir("12_abc.dmp0");
@@ -98,16 +140,31 @@ public class MinidumpUploaderTest extends CrashTestCase {
assertTrue(maxTriesFile.exists());
}
- private static void uploadMinidumpsSync(
- MinidumpUploader minidumpUploader, final boolean expectReschedule) {
- final CountDownLatch uploadsFinishedLatch = new CountDownLatch(1);
- minidumpUploader.uploadAllMinidumps(new MinidumpUploader.UploadsFinishedCallback() {
+ /**
+ * Utility method for running {@param minidumpUploader}.uploadAllMinidumps on the UI thread to
+ * avoid breaking any assertions about running on the UI thread.
+ */
+ private static void uploadAllMinidumpsOnUiThread(final MinidumpUploader minidumpUploader,
+ final MinidumpUploader.UploadsFinishedCallback uploadsFinishedCallback) {
+ ThreadUtils.runOnUiThread(new Runnable() {
@Override
- public void uploadsFinished(boolean reschedule) {
- assertEquals(expectReschedule, reschedule);
- uploadsFinishedLatch.countDown();
+ public void run() {
+ minidumpUploader.uploadAllMinidumps(uploadsFinishedCallback);
}
});
+ }
+
+ private static void uploadMinidumpsSync(
+ MinidumpUploader minidumpUploader, final boolean expectReschedule) {
+ final CountDownLatch uploadsFinishedLatch = new CountDownLatch(1);
+ uploadAllMinidumpsOnUiThread(
+ minidumpUploader, new MinidumpUploader.UploadsFinishedCallback() {
+ @Override
+ public void uploadsFinished(boolean reschedule) {
+ assertEquals(expectReschedule, reschedule);
+ uploadsFinishedLatch.countDown();
+ }
+ });
try {
assertTrue(uploadsFinishedLatch.await(
scaleTimeout(TIME_OUT_MILLIS), TimeUnit.MILLISECONDS));
@@ -131,15 +188,9 @@ public class MinidumpUploaderTest extends CrashTestCase {
new MockCrashReportingPermissionManager() {
{ mIsEnabledForTests = true; }
};
- MinidumpUploader minidumpUploader = new MinidumpUploaderImpl(
- getInstrumentation().getTargetContext(), false /* cleanOutMinidumps */) {
- @Override
- public MinidumpUploadCallable createMinidumpUploadCallable(
- File minidumpFile, File logfile) {
- return new MinidumpUploadCallable(minidumpFile, logfile,
- new MinidumpUploadCallableTest.TestHttpURLConnectionFactory(), permManager);
- }
- };
+ MinidumpUploader minidumpUploader =
+ new TestMinidumpUploaderImpl(getInstrumentation().getTargetContext(), permManager,
+ false /* cleanOutMinidumps */);
File firstFile = createMinidumpFileInCrashDir("1_abc.dmp0");
File secondFile = createMinidumpFileInCrashDir("12_abcd.dmp0");
@@ -160,8 +211,8 @@ public class MinidumpUploaderTest extends CrashTestCase {
MinidumpUploadCallable createCallable(File minidumpFile, File logfile);
}
- private static MinidumpUploaderImpl createCallableListMinidumpUploader(
- Context context, final List<MinidumpUploadCallableCreator> callables) {
+ private static MinidumpUploaderImpl createCallableListMinidumpUploader(Context context,
+ final List<MinidumpUploadCallableCreator> callables, final boolean userPermitted) {
return new MinidumpUploaderImpl(context, false /* cleanOutMinidumps */) {
private int mIndex = 0;
@@ -173,6 +224,10 @@ public class MinidumpUploaderTest extends CrashTestCase {
}
return callables.get(mIndex++).createCallable(minidumpFile, logfile);
}
+ @Override
+ public PlatformServiceBridge createPlatformServiceBridge() {
+ return new TestPlatformServiceBridge(true /* canUseGms*/, userPermitted);
+ }
};
}
@@ -197,8 +252,9 @@ public class MinidumpUploaderTest extends CrashTestCase {
new MinidumpUploadCallableTest.TestHttpURLConnectionFactory(), permManager);
}
});
- MinidumpUploader minidumpUploader = createCallableListMinidumpUploader(
- getInstrumentation().getTargetContext(), callables);
+ MinidumpUploader minidumpUploader =
+ createCallableListMinidumpUploader(getInstrumentation().getTargetContext(),
+ callables, permManager.isUsageAndCrashReportingPermittedByUser());
File firstFile = createMinidumpFileInCrashDir("firstFile.dmp0");
File secondFile = createMinidumpFileInCrashDir("secondFile.dmp0");
@@ -276,18 +332,25 @@ public class MinidumpUploaderTest extends CrashTestCase {
return new MinidumpUploadCallable(
minidumpFile, logfile, new StallingHttpUrlConnectionFactory(), permManager);
}
+ @Override
+ public PlatformServiceBridge createPlatformServiceBridge() {
+ return new TestPlatformServiceBridge(
+ true /* canUseGms*/, permManager.isUsageAndCrashReportingPermittedByUser());
+ }
};
File firstFile = createMinidumpFileInCrashDir("123_abc.dmp0");
File nonExpectedFirstUploadFile = new File(mCrashDir, firstFile.getName() + ".up");
File nonExpectedFirstRetryFile = new File(mCrashDir, firstFile.getName() + ".try1");
- minidumpUploader.uploadAllMinidumps(new MinidumpUploader.UploadsFinishedCallback() {
- @Override
- public void uploadsFinished(boolean reschedule) {
- fail("This method shouldn't be called when we interrupt uploads.");
- }
- });
+ // This is run on the UI thread to avoid failing any assertOnUiThread assertions.
+ uploadAllMinidumpsOnUiThread(
+ minidumpUploader, new MinidumpUploader.UploadsFinishedCallback() {
+ @Override
+ public void uploadsFinished(boolean reschedule) {
+ fail("This method shouldn't be called when we interrupt uploads.");
+ }
+ });
minidumpUploader.cancelUploads();
assertTrue(firstFile.exists());
@@ -326,6 +389,91 @@ public class MinidumpUploaderTest extends CrashTestCase {
assertEquals(0, webviewTmpDir.listFiles().length);
}
+ /**
+ * Ensure that when PlatformServiceBridge returns true we do upload minidumps.
+ */
+ @MediumTest
+ public void testPlatformServicesBridgeIsUsedUserConsent() throws IOException {
+ testPlatformServicesBridgeIsUsed(true);
+ }
+
+ /**
+ * Ensure that when PlatformServiceBridge returns false we do not upload minidumps.
+ */
+ @MediumTest
+ public void testPlatformServicesBridgeIsUsedNoUserConsent() throws IOException {
+ testPlatformServicesBridgeIsUsed(false);
+ }
+
+ /**
+ * MinidumpUploaderImpl sub-class that uses MinidumpUploaderImpl's implementation of
+ * CrashReportingPermissionManager.isUsageAndCrashReportingPermittedByUser().
+ */
+ private static class WebViewUserConsentMinidumpUploaderImpl extends MinidumpUploaderImpl {
+ boolean mUserConsent;
+ WebViewUserConsentMinidumpUploaderImpl(
+ Context context, boolean cleanOutMinidumps, boolean userConsent) {
+ super(context, cleanOutMinidumps);
+ mUserConsent = userConsent;
+ }
+ @Override
+ public PlatformServiceBridge createPlatformServiceBridge() {
+ return new TestPlatformServiceBridge(true /* canUseGms */, mUserConsent);
+ }
+ @Override
+ public MinidumpUploadCallable createMinidumpUploadCallable(
+ File minidumpFile, File logfile) {
+ return new MinidumpUploadCallable(minidumpFile, logfile,
+ new MinidumpUploadCallableTest.TestHttpURLConnectionFactory(),
+ createWebViewCrashReportingManager());
+ }
+ @Override
+ protected CrashReportingPermissionManager createWebViewCrashReportingManager() {
+ final CrashReportingPermissionManager realPermissionManager =
+ super.createWebViewCrashReportingManager();
+ return new MockCrashReportingPermissionManager() {
+ {
+ // This setup ensures we depend on
+ // isUsageAndCrashReportingPermittedByUser().
+ mIsInSample = true;
+ mIsPermitted = true;
+ mIsCommandLineDisabled = false;
+ mIsNetworkAvailable = true;
+ mIsEnabledForTests = false;
+ }
+ @Override
+ public boolean isUsageAndCrashReportingPermittedByUser() {
+ // Ensure that we use the real implementation of
+ // isUsageAndCrashReportingPermittedByUser.
+ boolean userPermitted =
+ realPermissionManager.isUsageAndCrashReportingPermittedByUser();
+ assertEquals(mUserConsent, userPermitted);
+ return userPermitted;
+ }
+ };
+ }
+ }
+
+ private void testPlatformServicesBridgeIsUsed(final boolean userConsent) throws IOException {
+ MinidumpUploader minidumpUploader =
+ new WebViewUserConsentMinidumpUploaderImpl(getInstrumentation().getTargetContext(),
+ false /* cleanOutMinidumps */, userConsent);
+
+ File firstFile = createMinidumpFileInCrashDir("1_abc.dmp0");
+ File secondFile = createMinidumpFileInCrashDir("12_abcd.dmp0");
+ File expectedFirstFile = new File(
+ mCrashDir, firstFile.getName().replace(".dmp", userConsent ? ".up" : ".skipped"));
+ File expectedSecondFile = new File(
+ mCrashDir, secondFile.getName().replace(".dmp", userConsent ? ".up" : ".skipped"));
+
+ uploadMinidumpsSync(minidumpUploader, false /* expectReschedule */);
+
+ assertFalse(firstFile.exists());
+ assertTrue(expectedFirstFile.exists());
+ assertFalse(secondFile.exists());
+ assertTrue(expectedSecondFile.exists());
+ }
+
private static String readEntireFile(File file) throws IOException {
FileInputStream fileInputStream = new FileInputStream(file);
try {
@@ -450,15 +598,9 @@ public class MinidumpUploaderTest extends CrashTestCase {
new MockCrashReportingPermissionManager() {
{ mIsEnabledForTests = true; }
};
- MinidumpUploader minidumpUploader = new MinidumpUploaderImpl(
- getInstrumentation().getTargetContext(), false /* cleanOutMinidumps */) {
- @Override
- public MinidumpUploadCallable createMinidumpUploadCallable(
- File minidumpFile, File logfile) {
- return new MinidumpUploadCallable(minidumpFile, logfile,
- new MinidumpUploadCallableTest.TestHttpURLConnectionFactory(), permManager);
- }
- };
+ MinidumpUploader minidumpUploader =
+ new TestMinidumpUploaderImpl(getInstrumentation().getTargetContext(), permManager,
+ false /* cleanOutMinidumps */);
uploadMinidumpsSync(minidumpUploader, false /* expectReschedule */);
// Ensure there are no minidumps left to upload.
« no previous file with comments | « android_webview/java/src/org/chromium/android_webview/crash/MinidumpUploaderImpl.java ('k') | android_webview/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698