summaryrefslogtreecommitdiffstats
path: root/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ExperimentDelegateTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ExperimentDelegateTest.kt')
-rw-r--r--mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ExperimentDelegateTest.kt130
1 files changed, 130 insertions, 0 deletions
diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ExperimentDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ExperimentDelegateTest.kt
new file mode 100644
index 0000000000..20a210f562
--- /dev/null
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ExperimentDelegateTest.kt
@@ -0,0 +1,130 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+package org.mozilla.geckoview.test
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import org.hamcrest.Matchers.equalTo
+import org.json.JSONObject
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mozilla.geckoview.ExperimentDelegate
+import org.mozilla.geckoview.ExperimentDelegate.ExperimentException
+import org.mozilla.geckoview.ExperimentDelegate.ExperimentException.ERROR_EXPERIMENT_SLUG_NOT_FOUND
+import org.mozilla.geckoview.ExperimentDelegate.ExperimentException.ERROR_FEATURE_NOT_FOUND
+import org.mozilla.geckoview.GeckoResult
+import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled
+import java.lang.RuntimeException
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class ExperimentDelegateTest : BaseSessionTest() {
+
+ @Test
+ fun withPdfJS() {
+ mainSession.loadTestPath(TRACEMONKEY_PDF_PATH)
+ sessionRule.addExternalDelegateUntilTestEnd(
+ ExperimentDelegate::class,
+ sessionRule::setExperimentDelegate,
+ { sessionRule.setExperimentDelegate(null) },
+ object : ExperimentDelegate {
+ @AssertCalled(count = 1)
+ override fun onGetExperimentFeature(feature: String): GeckoResult<JSONObject> {
+ assertThat(
+ "Feature id should match",
+ feature,
+ equalTo("pdfjs"),
+ )
+ return GeckoResult<JSONObject>()
+ }
+ },
+ )
+ }
+
+ /*
+ Basic test of setting a runtime experiment delegate and an example experiment delegate with example functionality usage.
+ */
+ @Test
+ fun experimentDelegateTest() {
+ sessionRule.addExternalDelegateUntilTestEnd(
+ ExperimentDelegate::class,
+ sessionRule::setExperimentDelegate,
+ { sessionRule.setExperimentDelegate(null) },
+ object : ExperimentDelegate {
+ @AssertCalled(count = 1)
+ override fun onGetExperimentFeature(feature: String): GeckoResult<JSONObject> {
+ val result = GeckoResult<JSONObject>()
+ if (feature == "test") {
+ result.complete(JSONObject().put("item-one", true).put("item-two", 5))
+ } else {
+ result.completeExceptionally(ExperimentException(ERROR_FEATURE_NOT_FOUND))
+ }
+ return result
+ }
+
+ @AssertCalled(count = 1)
+ override fun onRecordExposureEvent(feature: String): GeckoResult<Void> {
+ val result = GeckoResult<Void>()
+ if (feature == "test") {
+ result.complete(null)
+ } else {
+ result.completeExceptionally(ExperimentException(ERROR_FEATURE_NOT_FOUND))
+ }
+ return result
+ }
+
+ @AssertCalled(count = 3)
+ override fun onRecordExperimentExposureEvent(feature: String, slug: String): GeckoResult<Void> {
+ val result = GeckoResult<Void>()
+ if (feature == "test" && slug == "test") {
+ result.complete(null)
+ } else if (slug != "test" && feature == "test") {
+ result.completeExceptionally(ExperimentException(ERROR_EXPERIMENT_SLUG_NOT_FOUND))
+ } else {
+ result.completeExceptionally(ExperimentException(ERROR_FEATURE_NOT_FOUND))
+ }
+ return result
+ }
+
+ @AssertCalled(count = 1)
+ override fun onRecordMalformedConfigurationEvent(feature: String, part: String): GeckoResult<Void> {
+ val result = GeckoResult<Void>()
+ if (feature == "test") {
+ result.complete(null)
+ } else {
+ result.completeExceptionally(ExperimentException(ERROR_FEATURE_NOT_FOUND))
+ }
+ return result
+ }
+ },
+ )
+ val experimentDelegate = sessionRule.runtime.settings.experimentDelegate!!
+ val experimentFeature = sessionRule.waitForResult(experimentDelegate.onGetExperimentFeature("test"))
+ assertThat("Experiment item one matches", experimentFeature?.get("item-one"), equalTo(true))
+ assertThat("Experiment item two matches", experimentFeature?.get("item-two"), equalTo(5))
+ val recordedExposureEvent = sessionRule.waitForResult(experimentDelegate.onRecordExposureEvent("test"))
+ assertThat("Recorded an exposure event", recordedExposureEvent, equalTo(null))
+ val recordedExperimentExposureEvent = sessionRule.waitForResult(experimentDelegate.onRecordExperimentExposureEvent("test", "test"))
+ assertThat("Recorded an experiment exposure event", recordedExperimentExposureEvent, equalTo(null))
+ val recordedMalformedEvent = sessionRule.waitForResult(experimentDelegate.onRecordMalformedConfigurationEvent("test", "data"))
+ assertThat("Recorded a malformed event", recordedMalformedEvent, equalTo(null))
+
+ try {
+ sessionRule.waitForResult(experimentDelegate.onRecordExperimentExposureEvent("test", "no-slug"))
+ } catch (re: RuntimeException) {
+ // no-op, wait for result for testing throws this
+ } catch (ee: ExperimentException) {
+ assertThat("Correct error of no slug found.", ee.code, equalTo(ERROR_EXPERIMENT_SLUG_NOT_FOUND))
+ }
+
+ try {
+ sessionRule.waitForResult(experimentDelegate.onRecordExperimentExposureEvent("no-feature", "test"))
+ } catch (re: RuntimeException) {
+ // no-op, wait for result for testing throws this
+ } catch (ee: ExperimentException) {
+ assertThat("Correct error of no feature found.", ee.code, equalTo(ERROR_FEATURE_NOT_FOUND))
+ }
+ }
+}