123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/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()
|