Bug 1874684 - Part 28: Return DateDuration from DifferenceISODateTime. r=mgaudet
[gecko.git] / python / mozbuild / mozbuild / test / test_telemetry_settings.py
blobedd293ecf4e8c2d2f0b6e42d14db5bf9084e3f83
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 import os
6 from unittest import mock
7 from unittest.mock import Mock
9 import mozunit
10 import pytest
11 import requests
12 from mach.config import ConfigSettings
13 from mach.decorators import SettingsProvider
14 from mach.settings import MachSettings
15 from mach.telemetry import (
16 initialize_telemetry_setting,
17 record_telemetry_settings,
18 resolve_is_employee,
22 @SettingsProvider
23 class OtherSettings:
24 config_settings = [("foo.bar", "int", "", 1), ("build.abc", "string", "", "")]
27 def record_enabled_telemetry(mozbuild_path, settings):
28 record_telemetry_settings(settings, mozbuild_path, True)
31 @pytest.fixture
32 def settings():
33 s = ConfigSettings()
34 s.register_provider(MachSettings)
35 s.register_provider(OtherSettings)
36 return s
39 def load_settings_file(mozbuild_path, settings):
40 settings.load_file(os.path.join(mozbuild_path, "machrc"))
43 def write_config(mozbuild_path, contents):
44 with open(os.path.join(mozbuild_path, "machrc"), "w") as f:
45 f.write(contents)
48 def test_nonexistent(tmpdir, settings):
49 record_enabled_telemetry(tmpdir, settings)
50 load_settings_file(tmpdir, settings)
51 assert settings.mach_telemetry.is_enabled
54 def test_file_exists_no_build_section(tmpdir, settings):
55 write_config(
56 tmpdir,
57 """[foo]
58 bar = 2
59 """,
61 record_enabled_telemetry(tmpdir, settings)
62 load_settings_file(tmpdir, settings)
63 assert settings.mach_telemetry.is_enabled
64 assert settings.foo.bar == 2
67 def test_existing_build_section(tmpdir, settings):
68 write_config(
69 tmpdir,
70 """[foo]
71 bar = 2
73 [build]
74 abc = xyz
75 """,
77 record_enabled_telemetry(tmpdir, settings)
78 load_settings_file(tmpdir, settings)
79 assert settings.mach_telemetry.is_enabled
80 assert settings.build.abc == "xyz"
81 assert settings.foo.bar == 2
84 def test_malformed_file(tmpdir, settings):
85 """Ensure that a malformed config file doesn't cause breakage."""
86 write_config(
87 tmpdir,
88 """[foo
89 bar = 1
90 """,
92 record_enabled_telemetry(tmpdir, settings)
93 # Can't load_settings config, it will not have been written!
96 def _initialize_telemetry(settings, is_employee, contributor_prompt_response=None):
97 with mock.patch(
98 "mach.telemetry.resolve_is_employee", return_value=is_employee
99 ), mock.patch(
100 "mach.telemetry.prompt_telemetry_message_contributor",
101 return_value=contributor_prompt_response,
102 ) as prompt_mock, mock.patch(
103 "subprocess.run", return_value=Mock(returncode=0)
104 ), mock.patch(
105 "mach.config.ConfigSettings"
107 initialize_telemetry_setting(settings, "", "")
108 return prompt_mock.call_count == 1
111 def test_initialize_new_contributor_deny_telemetry(settings):
112 did_prompt = _initialize_telemetry(settings, False, False)
113 assert did_prompt
114 assert not settings.mach_telemetry.is_enabled
115 assert settings.mach_telemetry.is_set_up
116 assert settings.mach_telemetry.is_done_first_time_setup
119 def test_initialize_new_contributor_allow_telemetry(settings):
120 did_prompt = _initialize_telemetry(settings, False, True)
121 assert did_prompt
122 assert settings.mach_telemetry.is_enabled
123 assert settings.mach_telemetry.is_set_up
124 assert settings.mach_telemetry.is_done_first_time_setup
127 def test_initialize_new_employee(settings):
128 did_prompt = _initialize_telemetry(settings, True)
129 assert not did_prompt
130 assert settings.mach_telemetry.is_enabled
131 assert settings.mach_telemetry.is_set_up
132 assert settings.mach_telemetry.is_done_first_time_setup
135 def test_initialize_noop_when_telemetry_disabled_env(monkeypatch):
136 monkeypatch.setenv("DISABLE_TELEMETRY", "1")
137 with mock.patch("mach.telemetry.record_telemetry_settings") as record_mock:
138 did_prompt = _initialize_telemetry(None, False)
139 assert record_mock.call_count == 0
140 assert not did_prompt
143 def test_initialize_noop_when_request_error(settings):
144 with mock.patch(
145 "mach.telemetry.resolve_is_employee",
146 side_effect=requests.exceptions.RequestException("Unlucky"),
147 ), mock.patch("mach.telemetry.record_telemetry_settings") as record_mock:
148 initialize_telemetry_setting(None, None, None)
149 assert record_mock.call_count == 0
152 def test_resolve_is_employee():
153 def mock_and_run(is_employee_bugzilla, is_employee_vcs):
154 with mock.patch(
155 "mach.telemetry.resolve_is_employee_by_credentials",
156 return_value=is_employee_bugzilla,
157 ), mock.patch(
158 "mach.telemetry.resolve_is_employee_by_vcs", return_value=is_employee_vcs
160 return resolve_is_employee(None)
162 assert not mock_and_run(False, False)
163 assert not mock_and_run(False, True)
164 assert not mock_and_run(False, None)
165 assert mock_and_run(True, False)
166 assert mock_and_run(True, True)
167 assert mock_and_run(True, None)
168 assert not mock_and_run(None, False)
169 assert mock_and_run(None, True)
172 if __name__ == "__main__":
173 mozunit.main()