| // Copyright 2016 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.components.minidump_uploader; |
| |
| import android.support.test.InstrumentationRegistry; |
| |
| import org.junit.rules.TestRule; |
| import org.junit.runner.Description; |
| import org.junit.runners.model.Statement; |
| |
| import org.chromium.base.ContextUtils; |
| import org.chromium.base.Log; |
| import org.chromium.base.library_loader.LibraryLoader; |
| import org.chromium.base.library_loader.LibraryProcessType; |
| import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager; |
| |
| import java.io.File; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| |
| /** |
| * TestRule for Crash upload related tests. |
| */ |
| public class CrashTestRule implements TestRule { |
| private static final String TAG = "CrashTestRule"; |
| |
| private File mCrashDir; |
| private File mCacheDir; |
| |
| @Override |
| public Statement apply(final Statement base, final Description desc) { |
| return new Statement() { |
| @Override |
| public void evaluate() throws Throwable { |
| setUp(); |
| base.evaluate(); |
| tearDown(); |
| } |
| }; |
| } |
| |
| public File getCrashDir() { |
| return mCrashDir; |
| } |
| |
| public File getCacheDir() { |
| return mCacheDir; |
| } |
| |
| private void setUp() throws Exception { |
| ContextUtils.initApplicationContextForTests( |
| InstrumentationRegistry.getTargetContext().getApplicationContext()); |
| LibraryLoader.getInstance().ensureInitialized(LibraryProcessType.PROCESS_BROWSER); |
| if (mCacheDir == null) { |
| mCacheDir = getExistingCacheDir(); |
| } |
| if (mCrashDir == null) { |
| mCrashDir = new File(mCacheDir, CrashFileManager.CRASH_DUMP_DIR); |
| } |
| if (!mCrashDir.isDirectory() && !mCrashDir.mkdir()) { |
| throw new Exception("Unable to create directory: " + mCrashDir.getAbsolutePath()); |
| } |
| } |
| |
| /** |
| * Returns the cache directory where we should store minidumps. |
| * Can be overriden by sub-classes to allow for use with different cache directories. |
| */ |
| public File getExistingCacheDir() { |
| return ContextUtils.getApplicationContext().getCacheDir(); |
| } |
| |
| private void tearDown() throws Exception { |
| File[] crashFiles = mCrashDir.listFiles(); |
| if (crashFiles == null) { |
| return; |
| } |
| |
| for (File crashFile : crashFiles) { |
| if (!crashFile.delete()) { |
| Log.e(TAG, "Unable to delete: " + crashFile.getAbsolutePath()); |
| } |
| } |
| if (!mCrashDir.delete()) { |
| Log.e(TAG, "Unable to delete: " + mCrashDir.getAbsolutePath()); |
| } |
| } |
| |
| public static void setUpMinidumpFile(File file, String boundary) throws IOException { |
| setUpMinidumpFile(file, boundary, null); |
| } |
| |
| public static void setUpMinidumpFile(File file, String boundary, String processType) |
| throws IOException { |
| PrintWriter minidumpWriter = null; |
| try { |
| minidumpWriter = new PrintWriter(new FileWriter(file)); |
| minidumpWriter.println("--" + boundary); |
| minidumpWriter.println("Content-Disposition: form-data; name=\"prod\""); |
| minidumpWriter.println(); |
| minidumpWriter.println("Chrome_Android"); |
| minidumpWriter.println("--" + boundary); |
| minidumpWriter.println("Content-Disposition: form-data; name=\"ver\""); |
| minidumpWriter.println(); |
| minidumpWriter.println("1"); |
| if (processType != null) { |
| minidumpWriter.println("Content-Disposition: form-data; name=\"ptype\""); |
| minidumpWriter.println(); |
| minidumpWriter.println(processType); |
| } |
| minidumpWriter.println(boundary + "--"); |
| minidumpWriter.flush(); |
| } finally { |
| if (minidumpWriter != null) { |
| minidumpWriter.close(); |
| } |
| } |
| } |
| |
| /** |
| * A utility instantiation of CrashReportingPermissionManager providing a compact way of |
| * overriding different permission settings. |
| */ |
| public static class MockCrashReportingPermissionManager |
| implements CrashReportingPermissionManager { |
| protected boolean mIsInSample; |
| protected boolean mIsUserPermitted; |
| protected boolean mIsNetworkAvailable; |
| protected boolean mIsEnabledForTests; |
| |
| public MockCrashReportingPermissionManager() {} |
| |
| @Override |
| public boolean isClientInMetricsSample() { |
| return mIsInSample; |
| } |
| |
| @Override |
| public boolean isNetworkAvailableForCrashUploads() { |
| return mIsNetworkAvailable; |
| } |
| |
| @Override |
| public boolean isUsageAndCrashReportingPermittedByUser() { |
| return mIsUserPermitted; |
| } |
| |
| @Override |
| public boolean isUploadEnabledForTests() { |
| return mIsEnabledForTests; |
| } |
| } |
| } |