tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 5f658ee430a79b6058cba0f25d7445ed5161deae
parent 959238d01966d1d1f80e3b545d27acb58a238192
Author: Cristina Horotan <chorotan@mozilla.com>
Date:   Fri, 24 Oct 2025 23:52:27 +0300

Revert "Bug 1994786 - Add additional tests for TOU and legacy telemetry reporting policy notification flows that confirm the correct state of canUpload in various scenarios r=toolkit-telemetry-reviewers,dmose,TravisLong" for causing xpcshell failures on test_canUpload_truth_table.js

This reverts commit d6f9ff3ebcdbb2ef0ea043a5897c680c6845fec3.

Diffstat:
Mtoolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs | 3+--
Dtoolkit/components/telemetry/tests/unit/test_canUpload_truth_table.js | 440-------------------------------------------------------------------------------
Mtoolkit/components/telemetry/tests/unit/xpcshell.toml | 8--------
3 files changed, 1 insertion(+), 450 deletions(-)

diff --git a/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs b/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs @@ -141,8 +141,7 @@ export var TelemetryReportingPolicy = { * 2. The user is not eligible to see the ToU. Example local builds and temporarily Linux. */ TELEMETRY_TOU_ACCEPTED_OR_INELIGIBLE: "telemetry-tou-accepted-or-ineligible", - // Make this value accessible on TelemetryReportingPolicy - OLDEST_ALLOWED_TOU_ACCEPTANCE_YEAR, + /** * Setup the policy. */ diff --git a/toolkit/components/telemetry/tests/unit/test_canUpload_truth_table.js b/toolkit/components/telemetry/tests/unit/test_canUpload_truth_table.js @@ -1,440 +0,0 @@ -/* 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/. */ - -"use strict"; - -ChromeUtils.defineESModuleGetters(this, { - AppConstants: "resource://gre/modules/AppConstants.sys.mjs", - NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", - TestUtils: "resource://testing-common/TestUtils.sys.mjs", - sinon: "resource://testing-common/Sinon.sys.mjs", -}); - -const { NimbusTestUtils } = ChromeUtils.importESModule( - "resource://testing-common/NimbusTestUtils.sys.mjs" -); -const { TelemetryUtils } = ChromeUtils.importESModule( - "resource://gre/modules/TelemetryUtils.sys.mjs" -); - -const { Policy, TelemetryReportingPolicy } = ChromeUtils.importESModule( - "resource://gre/modules/TelemetryReportingPolicy.sys.mjs" -); - -const PREONBOARDING_ENABLED_PREF = "browser.preonboarding.enabled"; -const TOU_ACCEPTED_VERSION_PREF = "termsofuse.acceptedVersion"; -const TOU_ACCEPTED_DATE_PREF = "termsofuse.acceptedDate"; -const TOU_MINIMUM_VERSION_PREF = "termsofuse.minimumVersion"; -const TOU_CURRENT_VERSION_PREF = "termsofuse.currentVersion"; -const TOU_BYPASS_NOTIFICATION_PREF = "termsofuse.bypassNotification"; -const TOU_PREF_MIGRATION_CHECK = "browser.termsofuse.prefMigrationCheck"; - -const CURRENT_VERSION = 900; -const MINIMUM_VERSION = 899; -NimbusTestUtils.init(this); - -add_setup(async function common_setup() { - Services.prefs.setBoolPref( - TelemetryUtils.Preferences.BypassNotification, - false - ); - Services.prefs.setBoolPref(TOU_BYPASS_NOTIFICATION_PREF, false); - - TelemetryReportingPolicy.setup(); - - const { cleanup } = await NimbusTestUtils.setupTest(); - registerCleanupFunction(cleanup); - - registerCleanupFunction(() => { - for (const pref of [ - PREONBOARDING_ENABLED_PREF, - TOU_BYPASS_NOTIFICATION_PREF, - TOU_ACCEPTED_DATE_PREF, - TOU_ACCEPTED_VERSION_PREF, - TOU_MINIMUM_VERSION_PREF, - TOU_CURRENT_VERSION_PREF, - TOU_PREF_MIGRATION_CHECK, - TelemetryUtils.Preferences.BypassNotification, - TelemetryUtils.Preferences.AcceptedPolicyVersion, - TelemetryUtils.Preferences.AcceptedPolicyDate, - TelemetryUtils.Preferences.DataSubmissionEnabled, - ]) { - Services.prefs.clearUserPref(pref); - } - TelemetryReportingPolicy.testNotificationInProgress(false); - TelemetryReportingPolicy.reset(); - sinon.restore(); - }); -}); - -async function enrollPreonboarding({ - enabled = true, - currentVersion, - minimumVersion, -}) { - Services.prefs.setIntPref(TOU_CURRENT_VERSION_PREF, currentVersion); - Services.prefs.setIntPref(TOU_MINIMUM_VERSION_PREF, minimumVersion); - - return NimbusTestUtils.enrollWithFeatureConfig( - { - featureId: NimbusFeatures.preonboarding.featureId, - value: { - enabled, - currentVersion, - minimumVersion, - screens: [{ id: "test" }], - }, - }, - { isRollout: false } - ); -} - -function setDataSubmissionEnabled(on) { - Services.prefs.setBoolPref( - TelemetryUtils.Preferences.DataSubmissionEnabled, - !!on - ); -} - -/** - * Mutators are per-row helpers that set up state for either the Terms of Use - * (“A”) path or the legacy data reporting notification (“B”) path. - * - * Constraints: - * - Each mutator only touches the specific prefs or policy flags named in the - * function and no unrelated global state. - * - The test clears all related prefs before each row, ensuring a clean - * baseline. Each mutator must therefore set every value it needs so rows are - * independent and can run in any order without hidden dependencies. - * - * Usage: - * - ROWS.A and ROWS.B contain arrays of mutator names. The test runner calls - * each in sequence to produce the preconditions for that row. - */ -const Mutators = { - // A cases - TOU does NOT qualify to show - A_touDisabled() { - Services.prefs.setBoolPref(PREONBOARDING_ENABLED_PREF, false); - }, - A_touBypass() { - Services.prefs.setBoolPref(TOU_BYPASS_NOTIFICATION_PREF, true); - }, - A_touBypassFalse() { - Services.prefs.setBoolPref(TOU_BYPASS_NOTIFICATION_PREF, false); - }, - A_touAccepted() { - Services.prefs.setStringPref(TOU_ACCEPTED_DATE_PREF, String(Date.now())); - const current = Services.prefs.getIntPref( - TOU_CURRENT_VERSION_PREF, - CURRENT_VERSION - ); - Services.prefs.setIntPref(TOU_ACCEPTED_VERSION_PREF, current); - }, - A_touNotAccepted() { - Services.prefs.clearUserPref(TOU_ACCEPTED_DATE_PREF); - Services.prefs.clearUserPref(TOU_ACCEPTED_VERSION_PREF); - }, - A_touAcceptedOld() { - // Choose a date that is guaranteed to be rejected by setting one year - // before minimum. - const old = new Date( - `${Policy.OLDEST_ALLOWED_TOU_ACCEPTANCE_YEAR - 1}-01-01T00:00:00Z` - ).getTime(); // older than allowed - Services.prefs.setStringPref(TOU_ACCEPTED_DATE_PREF, String(old)); - const current = Services.prefs.getIntPref( - TOU_CURRENT_VERSION_PREF, - CURRENT_VERSION - ); - Services.prefs.setIntPref(TOU_ACCEPTED_VERSION_PREF, current); - }, - A_touAcceptedBelowMin() { - const min = Services.prefs.getIntPref( - TOU_MINIMUM_VERSION_PREF, - MINIMUM_VERSION - ); - Services.prefs.setStringPref(TOU_ACCEPTED_DATE_PREF, String(Date.now())); - Services.prefs.setIntPref(TOU_ACCEPTED_VERSION_PREF, Math.max(0, min - 1)); - }, - - // B cases - legacy flow does NOT qualify to show - B_legacyBypass() { - Services.prefs.setBoolPref( - TelemetryUtils.Preferences.BypassNotification, - true - ); - }, - B_legacyBypassFalse() { - Services.prefs.setBoolPref( - TelemetryUtils.Preferences.BypassNotification, - false - ); - }, - B_legacyNotified() { - const min = Services.prefs.getIntPref( - TelemetryUtils.Preferences.MinimumPolicyVersion, - 1 - ); - Services.prefs.setIntPref( - TelemetryUtils.Preferences.AcceptedPolicyVersion, - min - ); - Services.prefs.setStringPref( - TelemetryUtils.Preferences.AcceptedPolicyDate, - String(Date.now()) - ); - }, - B_legacyNotifiedFalse() { - Services.prefs.clearUserPref( - TelemetryUtils.Preferences.AcceptedPolicyVersion - ); - Services.prefs.clearUserPref(TelemetryUtils.Preferences.AcceptedPolicyDate); - }, - // Users cannot upload if a notification is in progress - inProgressSetTrue() { - TelemetryReportingPolicy.testNotificationInProgress(true); - }, - inProgressSetFalse() { - TelemetryReportingPolicy.testNotificationInProgress(false); - }, -}; - -/** - * Truth table - * - * Fields: - * - name: string description for logging - * - submissionEnabled: boolean mapped to - * TelemetryUtils.Preferences.DataSubmissionEnabled - * - A: array<string> of “A_” mutators (TOU path), formatted as strings for easy - * logging - * - B: array<string> of “B_” mutators (legacy path), formatted as strings for - * easy logging - * - inProgress: "tou" | "legacy" | null If set, we force - * TelemetryReportingPolicy.testNotificationInProgress(true) to model a - * notification (Terms of User or Legacy) currently showing. - * - preNimbusEvaluate: If true, call canUpload() once before Nimbus variables - * are populated, then again after we simulate startup, triggering - * _delayedStartup. We expect both results to match. This ensures that even if - * canUpload() is called before the Nimbus Variables are evaluated as part of - * the _delayedStartup process, we evaluate them on the fly so that their - * value is consistent. - * - expect: boolean expected final result of canUpload() - * - expectMigration: if true, we assert that the legacy to TOU pref migration - * ran - */ -const ROWS = [ - { - name: "Data submission disable -> false", - submissionEnabled: false, - A: ["A_touNotAccepted", "A_touBypassFalse"], - B: ["B_legacyBypassFalse", "B_legacyNotifiedFalse"], - inProgress: null, - expect: false, - }, - { - name: "TOU bypass and Legacy bypass -> true", - submissionEnabled: true, - A: ["A_touBypass", "A_touNotAccepted"], - B: ["B_legacyBypass", "B_legacyNotifiedFalse"], - inProgress: null, - expect: true, - }, - { - name: "TOU accepted and Legacy notified -> true", - submissionEnabled: true, - A: ["A_touAccepted", "A_touBypassFalse"], - B: ["B_legacyNotified", "B_legacyBypassFalse"], - inProgress: null, - expect: true, - }, - { - name: "TOU bypass only -> false", - submissionEnabled: true, - A: ["A_touBypass", "A_touNotAccepted"], - B: ["B_legacyBypassFalse", "B_legacyNotifiedFalse"], - inProgress: null, - expect: false, - }, - { - name: "Legacy bypass only -> true", - submissionEnabled: true, - A: ["A_touNotAccepted", "A_touBypassFalse"], - B: ["B_legacyBypass", "B_legacyNotifiedFalse"], - inProgress: null, - expect: true, - // Pref migration will result in legacy bypass value being mirrored in TOU - // bypass value - expectMigration: true, - }, - { - name: "Legacy notified -> true", - submissionEnabled: true, - A: ["A_touNotAccepted", "A_touBypassFalse"], - B: ["B_legacyNotified", "B_legacyBypassFalse"], - inProgress: null, - expect: true, - }, - { - name: "TOU notification in progress -> false", - submissionEnabled: true, - A: ["A_touBypassFalse", "A_touNotAccepted"], - B: ["B_legacyBypassFalse", "B_legacyNotifiedFalse"], - inProgress: "tou", - expect: false, - }, - { - name: "Legacy notification in progress -> false", - submissionEnabled: true, - A: ["A_touNotAccepted", "A_touBypassFalse"], - B: ["B_legacyBypassFalse", "B_legacyNotifiedFalse"], - inProgress: "legacy", - expect: false, - }, - { - name: "TOU accepted with invalid date, not notified of legacy flow -> false", - submissionEnabled: true, - A: ["A_touAcceptedOld", "A_touBypassFalse"], - B: ["B_legacyBypassFalse", "B_legacyNotifiedFalse"], - inProgress: null, - expect: false, - }, - { - name: "TOU accepted below minimum version, not notified of legacy flow -> false", - submissionEnabled: true, - A: ["A_touAcceptedBelowMin", "A_touBypassFalse"], - B: ["B_legacyBypassFalse", "B_legacyNotifiedFalse"], - inProgress: null, - expect: false, - }, - { - name: "TOU accepted with invalid date, Legacy bypass -> false", - submissionEnabled: true, - A: ["A_touAcceptedOld", "A_touBypassFalse"], - B: ["B_legacyBypass", "B_legacyNotifiedFalse"], - inProgress: null, - expect: false, - }, - { - name: "TOU accepted below minimum version, Legacy bypass -> false", - submissionEnabled: true, - A: ["A_touAcceptedBelowMin", "A_touBypassFalse"], - B: ["B_legacyBypass", "B_legacyNotifiedFalse"], - inProgress: null, - expect: false, - }, - { - name: "Nimbus value for preonboarding enabled settles to the same value regardless of when called -> true", - submissionEnabled: true, - preNimbusEvaluate: true, - A: ["A_touDisabled", "A_touBypassFalse", "A_touNotAccepted"], - B: ["B_legacyBypass", "B_legacyNotifiedFalse"], - inProgress: null, - expect: true, - // Pref migration will result in legacy bypass value being mirrored in TOU - // bypass value - expectMigration: true, - }, -]; - -/** - * Tests TelemetryReportingPolicy.canUpload() using a declarative truth table. - * - * Each row defines the relevant prefs and policy state (TOU, legacy, - * in-progress) to verify that canUpload() returns the expected result across - * combinations. - */ -add_task(async function test_canUpload_truth_table() { - const unenroll = await enrollPreonboarding({ - enabled: true, - currentVersion: CURRENT_VERSION, - minimumVersion: MINIMUM_VERSION, - }); - registerCleanupFunction(unenroll); - - for (const row of ROWS) { - info(`ROW: ${row.name}`); - TelemetryReportingPolicy.reset(); - sinon.restore(); - const modalStub = sinon.stub(Policy, "showModal").returns(true); - - for (const pref of [ - PREONBOARDING_ENABLED_PREF, - TOU_BYPASS_NOTIFICATION_PREF, - TOU_ACCEPTED_DATE_PREF, - TOU_ACCEPTED_VERSION_PREF, - TOU_PREF_MIGRATION_CHECK, - TelemetryUtils.Preferences.BypassNotification, - TelemetryUtils.Preferences.AcceptedPolicyVersion, - TelemetryUtils.Preferences.AcceptedPolicyDate, - TelemetryUtils.Preferences.DataSubmissionEnabled, - ]) { - Services.prefs.clearUserPref(pref); - } - // Normalize browser.preonboarding.enabled across platforms (currently set - // to "false" by default on Linux). - Services.prefs.setBoolPref(PREONBOARDING_ENABLED_PREF, true); - - Mutators.inProgressSetFalse(); - - setDataSubmissionEnabled(!!row.submissionEnabled); - - // Some callers may evaluate canUpload() before Nimbus variables are - // initialized. The `preNimbusEvaluate` flag triggers an early call to - // canUpload() before fakeSessionRestoreNotification(), then checks - // afterward that the result "converges" once Nimbus state is finalized. - // This ensures early evaluations don't leave inconsistent or stale policy - // state. - if (row.preNimbusEvaluate) { - const pre = TelemetryReportingPolicy.canUpload(); - info(`Before Nimbus initialization, canUpload() = ${pre}`); - } - - // Apply conditions - for (const m of row.A) { - Mutators[m](); - } - for (const m of row.B) { - Mutators[m](); - } - - await Policy.fakeSessionRestoreNotification(); - - if (row.expectMigration) { - Assert.ok( - Services.prefs.getBoolPref(TOU_PREF_MIGRATION_CHECK, false), - "TOU pref migration ran" - ); - } - - // Force “in progress” if requested - if (row.inProgress) { - Mutators.inProgressSetTrue(); - } else { - Mutators.inProgressSetFalse(); - } - - const got = TelemetryReportingPolicy.canUpload(); - Assert.equal( - got, - row.expect, - `canUpload() matches expectation for: ${row.name}` - ); - - // This checks to ensure that that even if canUpload() is called before the - // Nimbus Variables are evaluated as part of the _delayedStartup process, - // we evaluate them on the fly so that their value is consistent. - if (row.preNimbusEvaluate) { - const after = TelemetryReportingPolicy.canUpload(); - Assert.equal( - after, - row.expect, - `After Nimbus initialization, canUpload() converged for: ${row.name}` - ); - } - - // Per-row teardown - modalStub.restore(); - Mutators.inProgressSetFalse(); - } -}); diff --git a/toolkit/components/telemetry/tests/unit/xpcshell.toml b/toolkit/components/telemetry/tests/unit/xpcshell.toml @@ -161,14 +161,6 @@ skip-if = [ ["test_UtilityScalars.js"] run-if = ["os == 'win'"] -["test_canUpload_truth_table.js"] -skip-if = [ - "appname == 'thunderbird'", - "os == 'android'", -] -# The policy notification/acceptance flows are desktop only and not used by -# Thunderbird or Android. - ["test_client_id.js"] ["test_failover_retry.js"]