From b3eca6561488c2d88903b6cdbd4d6369d9868cf0 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Tue, 3 Sep 2019 17:47:43 -0400 Subject: [PATCH] Closes #5091: Refactor Sentry BreadCrumbs to use lib-crash BreadCrumbs --- .../java/org/mozilla/fenix/HomeActivity.kt | 10 ++-- ...umbsRecorder.kt => BreadcrumbsRecorder.kt} | 27 ++++----- .../fenix/customtabs/CustomTabActivity.kt | 2 +- .../metrics/BreadcrumbRecorderTest.kt | 60 +++++++++++++++++++ 4 files changed, 77 insertions(+), 22 deletions(-) rename app/src/main/java/org/mozilla/fenix/components/metrics/{SentryBreadcrumbsRecorder.kt => BreadcrumbsRecorder.kt} (68%) create mode 100644 app/src/test/java/org/mozilla/fenix/components/metrics/BreadcrumbRecorderTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 2f5344e48..c6b7d89b0 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -35,9 +35,8 @@ import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.browser.browsingmode.DefaultBrowsingModeManager import org.mozilla.fenix.components.FenixSnackbar -import org.mozilla.fenix.components.isSentryEnabled import org.mozilla.fenix.components.metrics.Event -import org.mozilla.fenix.components.metrics.SentryBreadcrumbsRecorder +import org.mozilla.fenix.components.metrics.BreadcrumbsRecorder import org.mozilla.fenix.exceptions.ExceptionsFragmentDirections import org.mozilla.fenix.ext.alreadyOnDestination import org.mozilla.fenix.ext.components @@ -96,9 +95,8 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback setupToolbarAndNavigation() if (settings.isTelemetryEnabled) { - if (isSentryEnabled()) { - lifecycle.addObserver(SentryBreadcrumbsRecorder(navHost.navController, ::getSentryBreadcrumbMessage)) - } + lifecycle.addObserver(BreadcrumbsRecorder(components.analytics.crashReporter, + navHost.navController, ::getBreadcrumbMessage)) intent ?.toSafeIntent() @@ -157,7 +155,7 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback super.onBackPressed() } - protected open fun getSentryBreadcrumbMessage(destination: NavDestination): String { + protected open fun getBreadcrumbMessage(destination: NavDestination): String { val fragmentName = resources.getResourceEntryName(destination.id) return "Changing to fragment $fragmentName, isCustomTab: false" } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/SentryBreadcrumbsRecorder.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/BreadcrumbsRecorder.kt similarity index 68% rename from app/src/main/java/org/mozilla/fenix/components/metrics/SentryBreadcrumbsRecorder.kt rename to app/src/main/java/org/mozilla/fenix/components/metrics/BreadcrumbsRecorder.kt index 035c23d03..9f92a2005 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/SentryBreadcrumbsRecorder.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/BreadcrumbsRecorder.kt @@ -10,27 +10,24 @@ import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent import androidx.navigation.NavController import androidx.navigation.NavDestination -import io.sentry.Sentry -import io.sentry.event.Breadcrumb -import io.sentry.event.BreadcrumbBuilder -import org.mozilla.fenix.components.isSentryEnabled +import mozilla.components.lib.crash.Breadcrumb +import mozilla.components.lib.crash.CrashReporter /** - * Records breadcrumbs in Sentry when the fragment changes. + * Records breadcrumbs when the fragment changes. * * Should be registered as a [LifecycleObserver] on an activity if telemetry is enabled. * It will automatically be removed when the lifecycle owner is destroyed. */ -class SentryBreadcrumbsRecorder( +class BreadcrumbsRecorder( + private val crashReporter: CrashReporter, private val navController: NavController, private val getBreadcrumbMessage: (NavDestination) -> String ) : NavController.OnDestinationChangedListener, LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onCreate() { - if (isSentryEnabled()) { - navController.addOnDestinationChangedListener(this) - } + navController.addOnDestinationChangedListener(this) } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) @@ -46,12 +43,12 @@ class SentryBreadcrumbsRecorder( destination: NavDestination, arguments: Bundle? ) { - Sentry.getContext().recordBreadcrumb( - BreadcrumbBuilder() - .setCategory("DestinationChanged") - .setMessage(getBreadcrumbMessage(destination)) - .setLevel(Breadcrumb.Level.INFO) - .build() + crashReporter.recordCrashBreadcrumb( + Breadcrumb( + message = getBreadcrumbMessage(destination), + category = "DestinationChanged", + level = Breadcrumb.Level.INFO + ) ) } } diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabActivity.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabActivity.kt index 04203090a..cf3e162d0 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabActivity.kt @@ -18,7 +18,7 @@ import org.mozilla.fenix.theme.CustomTabThemeManager import java.security.InvalidParameterException open class CustomTabActivity : HomeActivity() { - final override fun getSentryBreadcrumbMessage(destination: NavDestination): String { + final override fun getBreadcrumbMessage(destination: NavDestination): String { val fragmentName = resources.getResourceEntryName(destination.id) return "Changing to fragment $fragmentName, isCustomTab: true" } diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/BreadcrumbRecorderTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/BreadcrumbRecorderTest.kt new file mode 100644 index 000000000..7ce99a1df --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/BreadcrumbRecorderTest.kt @@ -0,0 +1,60 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.metrics + +import androidx.navigation.NavController +import androidx.navigation.NavDestination +import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.ObsoleteCoroutinesApi +import mozilla.components.lib.crash.Breadcrumb +import mozilla.components.lib.crash.Crash +import mozilla.components.lib.crash.CrashReporter +import mozilla.components.lib.crash.service.CrashReporterService +import mozilla.components.support.test.mock +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import org.mozilla.fenix.TestApplication +import org.robolectric.annotation.Config + +@ObsoleteCoroutinesApi +@RunWith(AndroidJUnit4::class) +@Config(application = TestApplication::class) +internal class BreadcrumbRecorderTest { + @Test + fun `ensure crash reporter recordCrashBreadcrumb is called`() { + val service = object : CrashReporterService { + override fun report(crash: Crash.UncaughtExceptionCrash) { + } + + override fun report(crash: Crash.NativeCodeCrash) { + } + } + + val reporter = spy(CrashReporter( + services = listOf(service), + shouldPrompt = CrashReporter.Prompt.NEVER + )) + + fun getBreadcrumbMessage(@Suppress("UNUSED_PARAMETER") destination: NavDestination): String { + return "test" + } + + val navController: NavController = mock() + val navDestination: NavDestination = mock() + + val breadcrumb = Breadcrumb( + message = getBreadcrumbMessage(navDestination), + category = "DestinationChanged", + level = Breadcrumb.Level.INFO + ) + + val breadCrumbRecorder = BreadcrumbsRecorder(reporter, navController, ::getBreadcrumbMessage) + breadCrumbRecorder.onDestinationChanged(navController, navDestination, null) + + verify(reporter).recordCrashBreadcrumb(breadcrumb) + } +}