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/.
6 from unittest
import mock
7 from unittest
.mock
import Mock
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
,
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)
34 s
.register_provider(MachSettings
)
35 s
.register_provider(OtherSettings
)
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
:
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
):
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
):
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."""
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):
98 "mach.telemetry.resolve_is_employee", return_value
=is_employee
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)
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)
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)
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
):
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
):
155 "mach.telemetry.resolve_is_employee_by_credentials",
156 return_value
=is_employee_bugzilla
,
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__":