Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
a8f750f
(wip) first version of login detection
cmonfortep May 21, 2020
7425d90
(wip) intercept post request to detect logins
cmonfortep May 21, 2020
e845cb8
(wip) POC for different approaches
cmonfortep May 25, 2020
c30a74a
login detection toggle added in settings (no design)
cmonfortep May 26, 2020
372a4ca
Adding to settings data store login detection
cmonfortep May 26, 2020
da9806b
update logindetection toggle from viewmodel
cmonfortep May 26, 2020
dbd1479
update list only if items changed: avoid flickering on header items
cmonfortep May 27, 2020
4bb394c
improve consistency when accessing class members
cmonfortep May 27, 2020
fc61bed
ensure password field has text to prompt users
cmonfortep May 27, 2020
a7c150c
create fireproofWebsiteRepository to replace dao objects inside viewm…
cmonfortep May 27, 2020
06780f8
Read javascript from assets folder
cmonfortep May 28, 2020
6303085
update javascriptinterface creation and injection
cmonfortep May 28, 2020
c644bcf
tidy up code for login detector, removing explicit dependencies
cmonfortep May 28, 2020
6a248b0
Remove unused delegate class to check navigation
cmonfortep Jun 2, 2020
d6feed2
Swipe order between feature description and toggle
cmonfortep Jun 2, 2020
92a2dbf
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 2, 2020
e743674
include divider into fireproof website settings
cmonfortep Jun 2, 2020
df59720
simplifying logic inside fireproof adapter items
cmonfortep Jun 3, 2020
cf61e09
Align fireproof website adapter elements with figma design
cmonfortep Jun 3, 2020
caba8ed
member class renamed
cmonfortep Jun 3, 2020
6a6cab5
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 3, 2020
9085ac2
move switch extension function into its own class
cmonfortep Jun 3, 2020
a2bab36
change js interface method name
cmonfortep Jun 3, 2020
e8b2d23
move into const post value and method renaming
cmonfortep Jun 3, 2020
1637e73
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 3, 2020
f48c8cf
showing dialog as designed and with real copies
cmonfortep Jun 4, 2020
371d2ba
renamed style
cmonfortep Jun 4, 2020
b056a04
capitalize fireproof word
cmonfortep Jun 5, 2020
1d59628
Add pixel when user enable/disables login detection
cmonfortep Jun 5, 2020
a538486
pixel login detected fireproof dialog actions
cmonfortep Jun 5, 2020
a335b54
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 5, 2020
d5720a5
new line end of file
cmonfortep Jun 5, 2020
635c362
remove commented code
cmonfortep Jun 5, 2020
4e21b5d
use domain instead of uri?.host?
cmonfortep Jun 5, 2020
f2a969b
fix compiling issues on test files
cmonfortep Jun 5, 2020
84e5ecb
BrowserWebViewClient login detection logic tested
cmonfortep Jun 5, 2020
197168b
test JSLoginDetector
cmonfortep Jun 6, 2020
5768900
test LoginDetectionInterface
cmonfortep Jun 6, 2020
ba057f6
Add test for login detection logic and fireproof login dialog in Brow…
cmonfortep Jun 7, 2020
ba7063f
Add test cases for Fireproof Website Repository
cmonfortep Jun 7, 2020
e735b7a
add new line at end of file
cmonfortep Jun 7, 2020
9552120
clear experimental warnings
cmonfortep Jun 7, 2020
d8f4dbb
fix typo on test name
cmonfortep Jun 8, 2020
0a987d6
fix test case name
cmonfortep Jun 8, 2020
7583b83
improve test case name
cmonfortep Jun 8, 2020
58efc3b
improve test case name and asserts
cmonfortep Jun 8, 2020
e6570e0
add test cases for fireproof settings login detection toggle
cmonfortep Jun 8, 2020
6ff4dd1
remove unnecessary id from layout
cmonfortep Jun 8, 2020
eae5059
update js accordingly to interface method
cmonfortep Jun 8, 2020
59fd2f4
simplify code with let instead of using null check
cmonfortep Jun 8, 2020
69fbb9f
introduce extra check to ensure only domains are fireproofed
cmonfortep Jun 8, 2020
331fd75
fix not detecting logins in api 21 for some websites
cmonfortep Jun 8, 2020
3fc2090
unused import
cmonfortep Jun 8, 2020
a56b5b4
add missing pixel
cmonfortep Jun 8, 2020
b75d80b
Javascript interface renamed following suggestion
cmonfortep Jun 10, 2020
f8a8651
replace .let for early return
cmonfortep Jun 10, 2020
2f21f8b
early return check
cmonfortep Jun 10, 2020
7fa3cdb
removing runBlocking from onPageStarted, code can be executed in main…
cmonfortep Jun 10, 2020
6c97eab
rename to LoginDetectionJavascriptInterface
cmonfortep Jun 11, 2020
317e9df
move constant into companion object
cmonfortep Jun 11, 2020
361bb20
moving companion object to EOF
cmonfortep Jun 11, 2020
67f04c7
remove true/false words from pixelNames
cmonfortep Jun 11, 2020
c922311
add verb to pixelName
cmonfortep Jun 11, 2020
5744216
Rename viewmodel method to handle user fireproofing from login dialog…
cmonfortep Jun 11, 2020
185b6d4
Use camelcase for class name and improve method names
cmonfortep Jun 11, 2020
84278f7
Rename string name and introduce new one to Remove Fireproof
cmonfortep Jun 11, 2020
70d759d
Introduce the option to remove fireproof into overflow menu
cmonfortep Jun 11, 2020
461885c
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 11, 2020
17f81e9
add test cases for removing fireproof from overflow menu
cmonfortep Jun 11, 2020
2639811
wrap javascript into anonymous function when injected
cmonfortep Jun 11, 2020
a0674bd
Update with suggested copy from internal review
cmonfortep Jun 12, 2020
5cc8dee
introduce checkbox inside overflow menu to fireproof websites
cmonfortep Jun 12, 2020
30a10db
Improve comment to correctly explain why javascript code is not wrapp…
cmonfortep Jun 12, 2020
32d05f4
(wip) ask to fireproof the website the user is forwarded to
cmonfortep Jun 24, 2020
f6b09be
rename login events livedata
cmonfortep Jun 24, 2020
968a2bf
Cover with tests new logic for detecting logins
cmonfortep Jun 24, 2020
682f237
Rename LoginDetector classes to be more concrete on their responsabil…
cmonfortep Jun 24, 2020
16cbb4a
Refactor tests according to new class names
cmonfortep Jun 24, 2020
33fd8c6
another try to improve naming on loginDetectors
cmonfortep Jun 24, 2020
84e0e30
Refactor login inside test for BrowserTabViewModel
cmonfortep Jun 24, 2020
4f76e8e
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 24, 2020
8931311
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 25, 2020
7a5fb43
Update copies after product review feedback
cmonfortep Jun 28, 2020
e5d5331
remove section title from fireproof settings (sign in toggle)
cmonfortep Jun 29, 2020
31266f1
Merge branch 'develop' into feature/cristian/fireproof/login_detectio…
cmonfortep Jun 29, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.DownloadFile
import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.OpenInNewTab
import com.duckduckgo.app.browser.addtohome.AddToHomeCapabilityDetector
import com.duckduckgo.app.browser.favicon.FaviconDownloader
import com.duckduckgo.app.browser.logindetection.LoginDetected
import com.duckduckgo.app.browser.logindetection.NavigationAwareLoginDetector
import com.duckduckgo.app.browser.logindetection.NavigationEvent.LoginAttempt
import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials
import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
import com.duckduckgo.app.browser.model.LongPressTarget
Expand All @@ -49,13 +52,10 @@ import com.duckduckgo.app.browser.session.WebViewSessionStorage
import com.duckduckgo.app.cta.db.DismissedCtaDao
import com.duckduckgo.app.cta.model.CtaId
import com.duckduckgo.app.cta.model.DismissedCta
import com.duckduckgo.app.cta.ui.*
import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteDao
import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity
import com.duckduckgo.app.cta.ui.Cta
import com.duckduckgo.app.cta.ui.CtaViewModel
import com.duckduckgo.app.cta.ui.DaxBubbleCta
import com.duckduckgo.app.cta.ui.DaxDialogCta
import com.duckduckgo.app.cta.ui.HomePanelCta
import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteRepository
import com.duckduckgo.app.global.db.AppDatabase
import com.duckduckgo.app.global.install.AppInstallStore
import com.duckduckgo.app.global.model.SiteFactory
Expand Down Expand Up @@ -83,14 +83,7 @@ import com.duckduckgo.app.trackerdetection.EntityLookup
import com.duckduckgo.app.trackerdetection.model.TrackingEvent
import com.duckduckgo.app.usage.search.SearchCountDao
import com.duckduckgo.app.widget.ui.WidgetCapabilities
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.anyOrNull
import com.nhaarman.mockitokotlin2.atLeastOnce
import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.firstValue
import com.nhaarman.mockitokotlin2.lastValue
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import com.nhaarman.mockitokotlin2.*
import io.reactivex.Observable
import io.reactivex.Single
import kotlinx.coroutines.ExperimentalCoroutinesApi
Expand All @@ -101,14 +94,10 @@ import org.junit.Assert.*
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.*
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import java.util.concurrent.TimeUnit

@ExperimentalCoroutinesApi
Expand Down Expand Up @@ -196,6 +185,9 @@ class BrowserTabViewModelTest {
@Mock
private lateinit var mockUserWhitelistDao: UserWhitelistDao

@Mock
private lateinit var mockNavigationAwareLoginDetector: NavigationAwareLoginDetector

private lateinit var mockAutoCompleteApi: AutoCompleteApi

private lateinit var ctaViewModel: CtaViewModel
Expand All @@ -211,6 +203,8 @@ class BrowserTabViewModelTest {

private val selectedTabLiveData = MutableLiveData<TabEntity>()

private val loginEventLiveData = MutableLiveData<LoginDetected>()

@Before
fun before() {
MockitoAnnotations.initMocks(this)
Expand Down Expand Up @@ -241,6 +235,7 @@ class BrowserTabViewModelTest {
whenever(mockOmnibarConverter.convertQueryToUrl(any(), any())).thenReturn("duckduckgo.com")
whenever(mockVariantManager.getVariant()).thenReturn(DEFAULT_VARIANT)
whenever(mockTabsRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
whenever(mockNavigationAwareLoginDetector.loginEventLiveData).thenReturn(loginEventLiveData)
whenever(mockTabsRepository.retrieveSiteData(any())).thenReturn(MutableLiveData())
whenever(mockPrivacyPractices.privacyPracticesFor(any())).thenReturn(PrivacyPractices.UNKNOWN)
whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
Expand All @@ -266,7 +261,8 @@ class BrowserTabViewModelTest {
searchCountDao = mockSearchCountDao,
pixel = mockPixel,
dispatchers = coroutineRule.testDispatcherProvider,
fireproofWebsiteDao = fireproofWebsiteDao,
fireproofWebsiteRepository = FireproofWebsiteRepository(fireproofWebsiteDao, coroutineRule.testDispatcherProvider),
navigationAwareLoginDetector = mockNavigationAwareLoginDetector,
variantManager = mockVariantManager
)

Expand Down Expand Up @@ -1768,23 +1764,25 @@ class BrowserTabViewModelTest {
}

@Test
fun whenUserLoadsNotFireproofWebsiteThenFireproofWebsiteOptionMenuEnabled() {
fun whenUserLoadsNotFireproofWebsiteThenFireproofWebsiteBrowserStateUpdated() {
loadUrl("http://www.example.com/path", isBrowserShowing = true)
assertTrue(browserViewState().canFireproofSite)
assertFalse(browserViewState().isFireproofWebsite)
}

@Test
fun whenUserLoadsFireproofWebsiteThenFireproofWebsiteOptionMenuDisabled() {
fun whenUserLoadsFireproofWebsiteThenFireproofWebsiteBrowserStateUpdated() {
givenFireproofWebsiteDomain("www.example.com")
loadUrl("http://www.example.com/path", isBrowserShowing = true)
assertFalse(browserViewState().canFireproofSite)
assertTrue(browserViewState().isFireproofWebsite)
}

@Test
fun whenUserLoadsFireproofWebsiteSubDomainThenFireproofWebsiteOptionMenuEnabled() {
fun whenUserLoadsFireproofWebsiteSubDomainThenFireproofWebsiteBrowserStateUpdated() {
givenFireproofWebsiteDomain("example.com")
loadUrl("http://mobile.example.com/path", isBrowserShowing = true)
assertTrue(browserViewState().canFireproofSite)
assertFalse(browserViewState().isFireproofWebsite)
}

@Test
Expand All @@ -1796,64 +1794,127 @@ class BrowserTabViewModelTest {
}

@Test
fun whenUrlIsUpdatedWithNonFireproofWebsiteThenFireproofWebsiteOptionMenuEnabled() {
fun whenUrlIsUpdatedWithNonFireproofWebsiteThenFireproofWebsiteBrowserStateUpdated() {
givenFireproofWebsiteDomain("www.example.com")
loadUrl("http://www.example.com/", isBrowserShowing = true)
updateUrl("http://www.example.com/", "http://twitter.com/explore", true)
assertTrue(browserViewState().canFireproofSite)
assertFalse(browserViewState().isFireproofWebsite)
}

@Test
fun whenUrlIsUpdatedWithFireproofWebsiteThenFireproofWebsiteOptionMenuDisabled() {
fun whenUrlIsUpdatedWithFireproofWebsiteThenFireproofWebsiteBrowserStateUpdated() {
givenFireproofWebsiteDomain("twitter.com")
loadUrl("http://example.com/", isBrowserShowing = true)
updateUrl("http://example.com/", "http://twitter.com/explore", true)
assertFalse(browserViewState().canFireproofSite)
assertTrue(browserViewState().isFireproofWebsite)
}

@Test
fun whenUserClicksFireproofWebsiteOptionMenuThenShowConfirmationIsIssued() {
loadUrl("http://mobile.example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteClicked()
testee.onFireproofWebsiteMenuClicked()
assertCommandIssued<Command.ShowFireproofWebSiteConfirmation> {
assertEquals("mobile.example.com", this.fireproofWebsiteEntity.domain)
}
}

@Test
fun whenUserClicksFireproofWebsiteOptionMenuThenFireproofWebsiteOptionMenuDisabled() {
fun whenUserClicksFireproofWebsiteOptionMenuThenFireproofWebsiteBrowserStateUpdated() {
loadUrl("http://example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteClicked()
assertFalse(browserViewState().canFireproofSite)
testee.onFireproofWebsiteMenuClicked()
assertTrue(browserViewState().isFireproofWebsite)
}

@Test
fun whenFireproofWebsiteAddedThenPixelSent() {
loadUrl("http://example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteClicked()
testee.onFireproofWebsiteMenuClicked()
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_ADDED)
}

@Test
fun whenUserRemovesFireproofWebsiteFromOptionMenuThenFireproofWebsiteBrowserStateUpdated() {
givenFireproofWebsiteDomain("mobile.example.com")
loadUrl("http://mobile.example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteMenuClicked()
assertFalse(browserViewState().isFireproofWebsite)
}

@Test
fun whenUserRemovesFireproofWebsiteFromOptionMenuThenPixelSent() {
givenFireproofWebsiteDomain("mobile.example.com")
loadUrl("http://mobile.example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteMenuClicked()
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_REMOVE)
}

@Test
fun whenUserClicksOnFireproofWebsiteSnackbarUndoActionThenFireproofWebsiteIsRemoved() {
loadUrl("http://example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteClicked()
testee.onFireproofWebsiteMenuClicked()
assertCommandIssued<Command.ShowFireproofWebSiteConfirmation> {
testee.onFireproofWebsiteSnackbarUndoClicked(this.fireproofWebsiteEntity)
}
assertTrue(browserViewState().canFireproofSite)
assertFalse(browserViewState().isFireproofWebsite)
}

@Test
fun whenUserClicksOnFireproofWebsiteSnackbarUndoActionThenPixelSent() {
loadUrl("http://example.com/", isBrowserShowing = true)
testee.onFireproofWebsiteClicked()
testee.onFireproofWebsiteMenuClicked()
assertCommandIssued<Command.ShowFireproofWebSiteConfirmation> {
testee.onFireproofWebsiteSnackbarUndoClicked(this.fireproofWebsiteEntity)
}
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_UNDO)
}

@Test
fun whenUserFireproofsWebsiteFromLoginDialogThenShowConfirmationIsIssuedWithExpectedDomain() {
loadUrl("http://mobile.example.com/", isBrowserShowing = true)
testee.onUserConfirmedFireproofDialog("login.example.com")
assertCommandIssued<Command.ShowFireproofWebSiteConfirmation> {
assertEquals("login.example.com", this.fireproofWebsiteEntity.domain)
}
}

@Test
fun whenUserFireproofsWebsiteFromLoginDialogThenPixelSent() {
testee.onUserConfirmedFireproofDialog("login.example.com")
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_LOGIN_ADDED)
}

@Test
fun whenUserDismissesFireproofWebsiteLoginDialogThenPixelSent() {
testee.onUserDismissedFireproofLoginDialog()
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_LOGIN_DISMISS)
}

@Test
fun whenLoginAttempDetectedThenNotifyNavigationAwareLoginDetector() {
loadUrl("http://example.com/", isBrowserShowing = true)

testee.loginDetected()

verify(mockNavigationAwareLoginDetector).onEvent(LoginAttempt("http://example.com/"))
}

@Test
fun whenLoginDetectedOnAFireproofedWebsiteThenDoNotAskToFireproofWebsite() {
givenFireproofWebsiteDomain("example.com")
loginEventLiveData.value = givenLoginDetected("example.com")
assertCommandNotIssued<Command.AskToFireproofWebsite>()
}

@Test
fun whenLoginDetectedThenAskToFireproofWebsite() {
loginEventLiveData.value = givenLoginDetected("example.com")
assertCommandIssued<Command.AskToFireproofWebsite> {
assertEquals(FireproofWebsiteEntity("example.com"), this.fireproofWebsite)
}
}

@Test
fun whenUserBrowsingPressesBackThenCannotAddBookmark() {
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
Expand Down Expand Up @@ -2041,6 +2102,8 @@ class BrowserTabViewModelTest {
}
}

private fun givenLoginDetected(domain: String) = LoginDetected(authLoginDomain = "", forwardedToDomain = domain)

private fun setBrowserShowing(isBrowsing: Boolean) {
testee.browserViewState.value = browserViewState().copy(browserShowing = isBrowsing)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,29 @@ package com.duckduckgo.app.browser

import android.content.Context
import android.os.Build
import android.webkit.CookieManager
import android.webkit.HttpAuthHandler
import android.webkit.RenderProcessGoneDetail
import android.webkit.WebView
import android.webkit.*
import androidx.test.annotation.UiThreadTest
import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.duckduckgo.app.CoroutineTestRule
import com.duckduckgo.app.browser.logindetection.DOMLoginDetector
import com.duckduckgo.app.browser.logindetection.WebNavigationEvent
import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
import com.duckduckgo.app.global.exception.UncaughtExceptionRepository
import com.duckduckgo.app.runBlocking
import com.duckduckgo.app.statistics.store.OfflinePixelCountDataStore
import com.nhaarman.mockitokotlin2.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.junit.Before
import org.junit.Rule
import org.junit.Test

@ExperimentalCoroutinesApi
class BrowserWebViewClientTest {

@get:Rule
var coroutinesTestRule = CoroutineTestRule()

private lateinit var testee: BrowserWebViewClient
private lateinit var webView: WebView

Expand All @@ -42,6 +49,7 @@ class BrowserWebViewClientTest {
private val requestInterceptor: RequestInterceptor = mock()
private val listener: WebViewClientListener = mock()
private val cookieManager: CookieManager = mock()
private val loginDetector: DOMLoginDetector = mock()
private val offlinePixelCountDataStore: OfflinePixelCountDataStore = mock()
private val uncaughtExceptionRepository: UncaughtExceptionRepository = mock()

Expand All @@ -55,7 +63,8 @@ class BrowserWebViewClientTest {
requestInterceptor,
offlinePixelCountDataStore,
uncaughtExceptionRepository,
cookieManager
cookieManager,
loginDetector
)
testee.webViewClientListener = listener
}
Expand Down Expand Up @@ -83,6 +92,13 @@ class BrowserWebViewClientTest {
verify(listener, never()).pageRefreshed(any())
}

@UiThreadTest
@Test
fun whenOnPageStartedCalledThenEventSentToLoginDetector() = coroutinesTestRule.runBlocking {
testee.onPageStarted(webView, EXAMPLE_URL, null)
verify(loginDetector).onEvent(WebNavigationEvent.OnPageStarted(webView))
}

@UiThreadTest
@Test
fun whenOnPageFinishedCalledThenListenerInstructedToUpdateNavigationState() {
Expand All @@ -99,6 +115,14 @@ class BrowserWebViewClientTest {
verify(listener).requiresAuthentication(authenticationRequest)
}

@UiThreadTest
@Test
fun whenShouldInterceptRequestThenEventSentToLoginDetector() = coroutinesTestRule.runBlocking {
val webResourceRequest = mock<WebResourceRequest>()
testee.shouldInterceptRequest(webView, webResourceRequest)
verify(loginDetector).onEvent(WebNavigationEvent.ShouldInterceptRequest(webView, webResourceRequest))
}

@Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
fun whenRenderProcessGoneDueToCrashThenCrashDataStoreEntryIsIncremented() {
Expand Down
Loading