From e294521c923eb4398788d68bd6b21538770e7fa5 Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Thu, 18 Jul 2019 14:35:34 -0700 Subject: [PATCH] Fix search metrics (#4150) * For #4082 - Changes lifecycles for metrics * For #4082 - Replaces the SearchEngine name with the identifier for countLabel --- app/metrics.yaml | 8 +- .../components/metrics/GleanMetricsService.kt | 4 +- .../fenix/components/metrics/Metrics.kt | 2 +- .../components/metrics/PerformedSearchTest.kt | 210 ++++++++++++++++++ 4 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/components/metrics/PerformedSearchTest.kt diff --git a/app/metrics.yaml b/app/metrics.yaml index 42e450838..609d6db32 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -329,6 +329,7 @@ quick_action_sheet: metrics: default_browser: type: boolean + lifetime: application description: > Is Fenix the default browser? send_in_pings: @@ -361,6 +362,7 @@ metrics: expires: "2019-09-01" mozilla_products: type: string_list + lifetime: application description: > A list of all the Mozilla products installed on device. We currently scan for: Firefox, Firefox Beta, Firefox Aurora, Firefox Nightly, Firefox Fdroid, Firefox Lite, Reference Browser, Reference Browser Debug, @@ -376,8 +378,9 @@ metrics: expires: "2019-09-01" default_moz_browser: type: string + lifetime: application description: > - The name of the default browser on device if and only if it's a Mozilla owned product, otherwise empty string + The name of the default browser on device if and only if it's a Mozilla owned product send_in_pings: - metrics bugs: @@ -391,6 +394,7 @@ metrics: search.default_engine: code: type: string + lifetime: application description: > If the search engine is pre-loaded with Fenix this value will be the search engine identifier. If it's a custom search engine @@ -407,6 +411,7 @@ search.default_engine: expires: "2019-09-01" name: type: string + lifetime: application description: > If the search engine is pre-loaded with Fenix this value will be the search engine name. If it's a custom search engine @@ -423,6 +428,7 @@ search.default_engine: expires: "2019-09-01" submission_url: type: string + lifetime: application description: > If the search engine is pre-loaded with Fenix this value will be he base URL we use to build the search query for the search engine. diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt index fac8943c5..87c094d06 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -270,7 +270,9 @@ class GleanMetricsService(private val context: Context) : MetricsService { Metrics.apply { defaultBrowser.set(Browsers.all(context).isDefaultBrowser) - defaultMozBrowser.set(MozillaProductDetector.getMozillaBrowserDefault(context) ?: "") + MozillaProductDetector.getMozillaBrowserDefault(context)?.also { + defaultMozBrowser.set(it) + } mozillaProducts.set(MozillaProductDetector.getInstalledMozillaProducts(context)) } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt index e6ab15c47..7f9e594c4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt @@ -177,7 +177,7 @@ sealed class Event { } val countLabel: String - get() = "${source.searchEngine.name.toLowerCase(Locale.ROOT)}.$label" + get() = "${source.searchEngine.identifier.toLowerCase(Locale.ROOT)}.$label" val sourceLabel: String get() = "${source.descriptor}.$label" diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/PerformedSearchTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/PerformedSearchTest.kt new file mode 100644 index 000000000..b8220da98 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/PerformedSearchTest.kt @@ -0,0 +1,210 @@ +/* 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 mozilla.components.browser.search.SearchEngine +import mozilla.components.browser.search.SearchEngineManager +import mozilla.components.browser.search.provider.AssetsSearchEngineProvider +import mozilla.components.support.test.robolectric.testContext +import org.junit.Before +import org.mozilla.fenix.components.metrics.Event.PerformedSearch +import org.mozilla.fenix.components.metrics.Event.PerformedSearch.EngineSource +import org.mozilla.fenix.components.metrics.Event.PerformedSearch.EventSource +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.TestApplication +import org.mozilla.fenix.components.FenixLocaleSearchLocalizationProvider +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(application = TestApplication::class) +class PerformedSearchTest { + private lateinit var searchEngines: List + + // Match against the Regex defined at + // https://github.com/mozilla-mobile/android-components/blob/master/components/service/glean/src/main/java/mozilla/components/service/glean/private/LabeledMetricType.kt#L43 + // We're temporarily using it until better Glean testing APIs are available. + private val countLabelRegex = Regex("^[a-z_][a-z0-9_-]{0,29}(\\.[a-z0-9_-]{0,29})*$") + + @Before + fun setUp() { + searchEngines = SearchEngineManager(listOf(provider)).getSearchEngines(testContext) + } + + @Test + fun testThatCountLabelIsValid() { + val labels = searchEngines.map { + PerformedSearch(EventSource.Action(EngineSource.Shortcut(it))).eventSource.countLabel + } + + labels.forEach { + assertTrue("$it does not match!", it.matches(countLabelRegex)) + } + } + + private val provider = AssetsSearchEngineProvider( + localizationProvider = FenixLocaleSearchLocalizationProvider(), + additionalIdentifiers = listOf( + "amazon-au", + "amazon-br", + "amazon-ca", + "amazon-co-uk", + "amazon-de", + "amazon-fr", + "amazon-in", + "amazon-it", + "amazon-jp", + "amazon-mx", + "amazon-nl", + "amazondotcom", + "azerdict", + "azet-sk", + "baidu", + "bing", + "bolcom-fy-NL", + "bolcom-nl", + "ceneje", + "coccoc", + "danawa-kr", + "daum-kr", + "ddg", + "diec2", + "drae", + "duckduckgo", + "elebila", + "faclair-beag", + "google-2018", + "google-b-1-m", + "google-b-m", + "google", + "gulesider-mobile-NO", + "heureka-cz", + "hotline-ua", + "leit-is", + "leo_ende_de", + "list-am", + "mapy-cz", + "mercadolibre-ar", + "mercadolibre-cl", + "mercadolibre-mx", + "naver-kr", + "odpiralni", + "pazaruvaj", + "pledarigrond", + "prisjakt-sv-SE", + "qwant", + "rediff", + "reta-vortaro", + "salidzinilv", + "seznam-cz", + "skroutz", + "slovnik-sk", + "sslv", + "sztaki-en-hu", + "taobao", + "tearma", + "twitter-ja", + "twitter", + "vatera", + "wikipedia-NN", + "wikipedia-NO", + "wikipedia-an", + "wikipedia-ar", + "wikipedia-as", + "wikipedia-ast", + "wikipedia-az", + "wikipedia-be", + "wikipedia-bg", + "wikipedia-bn", + "wikipedia-br", + "wikipedia-bs", + "wikipedia-ca", + "wikipedia-cy", + "wikipedia-cz", + "wikipedia-da", + "wikipedia-de", + "wikipedia-dsb", + "wikipedia-el", + "wikipedia-eo", + "wikipedia-es", + "wikipedia-et", + "wikipedia-eu", + "wikipedia-fa", + "wikipedia-fi", + "wikipedia-fr", + "wikipedia-fy-NL", + "wikipedia-ga-IE", + "wikipedia-gd", + "wikipedia-gl", + "wikipedia-gn", + "wikipedia-gu", + "wikipedia-he", + "wikipedia-hi", + "wikipedia-hr", + "wikipedia-hsb", + "wikipedia-hu", + "wikipedia-hy-AM", + "wikipedia-ia", + "wikipedia-id", + "wikipedia-is", + "wikipedia-it", + "wikipedia-ja", + "wikipedia-ka", + "wikipedia-kab", + "wikipedia-kk", + "wikipedia-km", + "wikipedia-kn", + "wikipedia-lij", + "wikipedia-lo", + "wikipedia-lt", + "wikipedia-ltg", + "wikipedia-lv", + "wikipedia-ml", + "wikipedia-mr", + "wikipedia-ms", + "wikipedia-my", + "wikipedia-ne", + "wikipedia-nl", + "wikipedia-oc", + "wikipedia-or", + "wikipedia-pa", + "wikipedia-pl", + "wikipedia-pt", + "wikipedia-rm", + "wikipedia-ro", + "wikipedia-ru", + "wikipedia-sk", + "wikipedia-sl", + "wikipedia-sq", + "wikipedia-sr", + "wikipedia-sv-SE", + "wikipedia-ta", + "wikipedia-te", + "wikipedia-th", + "wikipedia-tr", + "wikipedia-uk", + "wikipedia-ur", + "wikipedia-uz", + "wikipedia-vi", + "wikipedia-wo", + "wikipedia-zh-CN", + "wikipedia-zh-TW", + "wikipedia", + "wiktionary-kn", + "wiktionary-oc", + "wiktionary-or", + "wiktionary-ta", + "wiktionary-te", + "yahoo-jp", + "yandex-en", + "yandex-ru", + "yandex-tr", + "yandex.by", + "yandex" + ) + ) +} \ No newline at end of file