| #!/usr/bin/env python3 |
| # Copyright (c) 2024 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import json |
| import os |
| import subprocess |
| import sys |
| import tempfile |
| import unittest |
| import unittest.mock |
| |
| ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| sys.path.insert(0, ROOT_DIR) |
| |
| import build_telemetry |
| |
| |
| class BuildTelemetryTest(unittest.TestCase): |
| |
| def test_check_auth(self): |
| with unittest.mock.patch('subprocess.check_output') as run_mock: |
| auth = {'email': 'bob@google.com'} |
| run_mock.return_value = json.dumps(auth) |
| self.assertEqual(build_telemetry.check_auth(), auth) |
| |
| with unittest.mock.patch('subprocess.check_output') as run_mock: |
| run_mock.side_effect = subprocess.CalledProcessError( |
| 1, cmd=['check auth'], stderr='failed') |
| self.assertEqual(build_telemetry.check_auth(), {}) |
| |
| with unittest.mock.patch('subprocess.check_output') as run_mock: |
| run_mock.return_value = '' |
| self.assertEqual(build_telemetry.check_auth(), {}) |
| |
| def test_load_and_save_config(self): |
| test_countdown = 2 |
| with tempfile.TemporaryDirectory() as tmpdir: |
| cfg_path = os.path.join(tmpdir, "build_telemetry.cfg") |
| with unittest.mock.patch( |
| 'build_telemetry.check_auth') as check_auth: |
| check_auth.return_value = {'email': 'bob@google.com'} |
| |
| # Initial config load |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| self.assertEqual(cfg.path, cfg_path) |
| self.assertTrue(cfg.is_googler) |
| self.assertEqual(cfg.countdown, test_countdown) |
| self.assertEqual(cfg.version, build_telemetry.VERSION) |
| |
| cfg.save() |
| |
| # 2nd config load |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| self.assertEqual(cfg.path, cfg_path) |
| self.assertTrue(cfg.is_googler) |
| self.assertEqual(cfg.countdown, test_countdown) |
| self.assertEqual(cfg.version, build_telemetry.VERSION) |
| |
| # build_telemetry.check_auth() is an expensive call. |
| # The cached result should be reused. |
| check_auth.assert_called_once() |
| |
| def test_enabled(self): |
| test_countdown = 2 |
| |
| # Googler auto opt-in. |
| with tempfile.TemporaryDirectory() as tmpdir: |
| cfg_path = os.path.join(tmpdir, "build_telemetry.cfg") |
| with unittest.mock.patch( |
| 'build_telemetry.check_auth') as check_auth: |
| check_auth.return_value = {'email': 'bob@google.com'} |
| |
| # Initial config load |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| cfg._show_notice = unittest.mock.MagicMock() |
| self.assertEqual(cfg.countdown, test_countdown) |
| |
| # 1st enabled() call should print the notice and |
| # change the countdown. |
| self.assertTrue(cfg.enabled()) |
| self.assertEqual(cfg.countdown, test_countdown - 1) |
| cfg._show_notice.assert_called_once() |
| cfg._show_notice.reset_mock() |
| |
| # 2nd enabled() call shouldn't print the notice and |
| # change the countdown. |
| self.assertTrue(cfg.enabled()) |
| self.assertEqual(cfg.countdown, test_countdown - 1) |
| cfg._show_notice.assert_not_called() |
| |
| cfg.save() |
| |
| # 2nd config load |
| cfg = build_telemetry.load_config(cfg_path) |
| cfg._show_notice = unittest.mock.MagicMock() |
| self.assertTrue(cfg.enabled()) |
| self.assertEqual(cfg.countdown, test_countdown - 2) |
| cfg._show_notice.assert_called_once() |
| |
| cfg.save() |
| |
| # 3rd config load |
| cfg = build_telemetry.load_config(cfg_path) |
| cfg._show_notice = unittest.mock.MagicMock() |
| self.assertTrue(cfg.enabled()) |
| self.assertEqual(cfg.countdown, 0) |
| cfg._show_notice.assert_not_called() |
| |
| # Googler opt-in/opt-out. |
| with tempfile.TemporaryDirectory() as tmpdir: |
| cfg_path = os.path.join(tmpdir, "build_telemetry.cfg") |
| with unittest.mock.patch( |
| 'build_telemetry.check_auth') as check_auth: |
| check_auth.return_value = {'email': 'bob@google.com'} |
| # After opt-out, it should not display the notice and |
| # change the countdown. |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| cfg.opt_out() |
| |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| cfg._show_notice = unittest.mock.MagicMock() |
| self.assertFalse(cfg.enabled()) |
| self.assertEqual(cfg.countdown, test_countdown) |
| cfg._show_notice.assert_not_called() |
| |
| # After opt-in, it should not display the notice and |
| # change the countdown. |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| cfg.opt_in() |
| |
| cfg = build_telemetry.load_config(cfg_path, test_countdown) |
| cfg._show_notice = unittest.mock.MagicMock() |
| self.assertTrue(cfg.enabled()) |
| self.assertEqual(cfg.countdown, test_countdown) |
| cfg._show_notice.assert_not_called() |
| |
| # Non-Googler |
| with tempfile.TemporaryDirectory() as tmpdir: |
| cfg_path = os.path.join(tmpdir, "build_telemetry.cfg") |
| with unittest.mock.patch( |
| 'build_telemetry.check_auth') as check_auth: |
| check_auth.return_value = {'email': 'bob@example.com'} |
| cfg = build_telemetry.load_config(cfg_path) |
| self.assertFalse(cfg.enabled()) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |