/* 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 import androidx.test.core.app.ApplicationProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.webextension.DisabledFlags import mozilla.components.concept.engine.webextension.Metadata import mozilla.components.concept.engine.webextension.WebExtension import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker import mozilla.components.service.glean.testing.GleanTestRule import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.Addons import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.PerfStartup import org.mozilla.fenix.GleanMetrics.Preferences import org.mozilla.fenix.GleanMetrics.SearchDefaultEngine import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.BrowsersCache import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class FenixApplicationTest { @get:Rule val gleanTestRule = GleanTestRule(ApplicationProvider.getApplicationContext()) private lateinit var application: FenixApplication private lateinit var browsersCache: BrowsersCache private lateinit var mozillaProductDetector: MozillaProductDetector private lateinit var browserStore: BrowserStore @Before fun setUp() { application = ApplicationProvider.getApplicationContext() browsersCache = mockk(relaxed = true) mozillaProductDetector = mockk(relaxed = true) browserStore = BrowserStore() } @Ignore("See https://github.com/mozilla-mobile/fenix/issues/18102") @Test fun `GIVEN onCreate is called THEN the duration is measured`() { // application.onCreate is called before the test as part of test set up: // https://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html assertTrue(PerfStartup.applicationOnCreate.testHasValue()) } @Test fun `GIVEN there are unsupported addons installed WHEN subscribing for new add-ons checks THEN register for checks`() { val checker = mockk(relaxed = true) val unSupportedExtension: WebExtension = mockk() val metadata: Metadata = mockk() every { unSupportedExtension.getMetadata() } returns metadata every { metadata.disabledFlags } returns DisabledFlags.select(DisabledFlags.APP_SUPPORT) application.subscribeForNewAddonsIfNeeded(checker, listOf(unSupportedExtension)) verify { checker.registerForChecks() } } @Test fun `GIVEN there are no unsupported addons installed WHEN subscribing for new add-ons checks THEN unregister for checks`() { val checker = mockk(relaxed = true) val unSupportedExtension: WebExtension = mockk() val metadata: Metadata = mockk() every { unSupportedExtension.getMetadata() } returns metadata every { metadata.disabledFlags } returns DisabledFlags.select(DisabledFlags.USER) application.subscribeForNewAddonsIfNeeded(checker, listOf(unSupportedExtension)) verify { checker.unregisterForChecks() } } @Test fun `WHEN setStartupMetrics is called THEN sets some base metrics`() { val expectedAppName = "org.mozilla.fenix" val settings: Settings = mockk() every { browsersCache.all(any()).isDefaultBrowser } returns true every { mozillaProductDetector.getMozillaBrowserDefault(any()) } returns expectedAppName every { mozillaProductDetector.getInstalledMozillaProducts(any()) } returns listOf(expectedAppName) every { settings.adjustCampaignId } returns "ID" every { settings.adjustAdGroup } returns "group" every { settings.adjustCreative } returns "creative" every { settings.adjustNetwork } returns "network" every { settings.searchWidgetInstalled } returns true every { settings.openTabsCount } returns 1 every { settings.topSitesSize } returns 2 every { settings.installedAddonsCount } returns 3 every { settings.installedAddonsList } returns "test1,test2,test3" every { settings.enabledAddonsCount } returns 2 every { settings.enabledAddonsList } returns "test1,test2" every { settings.desktopBookmarksSize } returns 4 every { settings.mobileBookmarksSize } returns 5 every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.getTabViewPingString() } returns "test" every { settings.getTabTimeoutPingString() } returns "test" every { settings.shouldShowSearchSuggestions } returns true every { settings.shouldUseTrackingProtection } returns true every { settings.isRemoteDebuggingEnabled } returns true every { settings.isTelemetryEnabled } returns true every { settings.shouldShowHistorySuggestions } returns true every { settings.shouldShowBookmarkSuggestions } returns true every { settings.shouldShowClipboardSuggestions } returns true every { settings.shouldShowSearchShortcuts } returns true every { settings.openLinksInAPrivateTab } returns true every { settings.shouldShowSearchSuggestionsInPrivate } returns true every { settings.shouldShowVoiceSearch } returns true every { settings.openLinksInExternalApp } returns true every { settings.shouldUseFixedTopToolbar } returns true every { settings.useStandardTrackingProtection } returns true every { settings.switchServiceIsEnabled } returns true every { settings.touchExplorationIsEnabled } returns true every { settings.shouldUseLightTheme } returns true every { settings.signedInFxaAccount } returns true application.setStartupMetrics(browserStore, settings, browsersCache, mozillaProductDetector) // Verify that browser defaults metrics are set. assertEquals("Mozilla", Metrics.distributionId.testGetValue()) assertEquals(true, Metrics.defaultBrowser.testGetValue()) assertEquals(expectedAppName, Metrics.defaultMozBrowser.testGetValue()) assertEquals(listOf(expectedAppName), Metrics.mozillaProducts.testGetValue()) assertEquals("ID", Metrics.adjustCampaign.testGetValue()) assertEquals("group", Metrics.adjustAdGroup.testGetValue()) assertEquals("creative", Metrics.adjustCreative.testGetValue()) assertEquals("network", Metrics.adjustNetwork.testGetValue()) assertEquals(true, Metrics.searchWidgetInstalled.testGetValue()) assertEquals(true, Metrics.hasOpenTabs.testGetValue()) assertEquals(1, Metrics.tabsOpenCount.testGetValue()) assertEquals(true, Metrics.hasTopSites.testGetValue()) assertEquals(2, Metrics.topSitesCount.testGetValue()) assertEquals(true, Addons.hasInstalledAddons.testGetValue()) assertEquals(listOf("test1", "test2", "test3"), Addons.installedAddons.testGetValue()) assertEquals(true, Addons.hasEnabledAddons.testGetValue()) assertEquals(listOf("test1", "test2"), Addons.enabledAddons.testGetValue()) assertEquals(true, Preferences.searchSuggestionsEnabled.testGetValue()) assertEquals(true, Preferences.remoteDebuggingEnabled.testGetValue()) assertEquals(true, Preferences.telemetryEnabled.testGetValue()) assertEquals(true, Preferences.browsingHistorySuggestion.testGetValue()) assertEquals(true, Preferences.bookmarksSuggestion.testGetValue()) assertEquals(true, Preferences.clipboardSuggestionsEnabled.testGetValue()) assertEquals(true, Preferences.searchShortcutsEnabled.testGetValue()) assertEquals(true, Preferences.voiceSearchEnabled.testGetValue()) assertEquals(true, Preferences.openLinksInAppEnabled.testGetValue()) assertEquals(true, Preferences.signedInSync.testGetValue()) assertEquals(emptyList(), Preferences.syncItems.testGetValue()) assertEquals("fixed_top", Preferences.toolbarPositionSetting.testGetValue()) assertEquals("standard", Preferences.enhancedTrackingProtection.testGetValue()) assertEquals(listOf("switch", "touch exploration"), Preferences.accessibilityServices.testGetValue()) assertEquals("light", Preferences.userTheme.testGetValue()) // Verify that search engine defaults are NOT set. This test does // not mock most of the objects telemetry is collected from. assertFalse(SearchDefaultEngine.code.testHasValue()) assertFalse(SearchDefaultEngine.name.testHasValue()) assertFalse(SearchDefaultEngine.submissionUrl.testHasValue()) } }