diff options
Diffstat (limited to 'buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py')
-rw-r--r-- | buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py b/buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py index b540a529d78..c705059194b 100644 --- a/buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py +++ b/buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py @@ -1,67 +1,75 @@ """Unit tests for tooling_metrics.py.""" -import asyncio from datetime import datetime import os import sys import unittest -from unittest.mock import patch +from unittest.mock import mock_open, patch +from mock import MagicMock import mongomock import pymongo -from buildscripts.metrics.metrics_datatypes import ToolingMetrics +from buildscripts.metrics.metrics_datatypes import ResmokeToolingMetrics, SConsToolingMetrics import buildscripts.metrics.tooling_metrics_utils as under_test # pylint: disable=unused-argument # pylint: disable=protected-access TEST_INTERNAL_TOOLING_METRICS_HOSTNAME = 'mongodb://testing:27017' -CURRENT_DATE_TIME = datetime(2022, 10, 4) +RESMOKE_METRICS_ARGS = { + "utc_starttime": datetime(2022, 10, 4), + "exit_hook": MagicMock(exit_code=0), +} # Metrics collection is not supported for Windows if os.name == "nt": sys.exit() +@patch("atexit.register") +class TestRegisterMetricsCollectionAtExit(unittest.TestCase): + @patch("buildscripts.metrics.tooling_metrics_utils._should_collect_metrics", return_value=True) + def test_register_metrics_collection(self, mock_should_collect_metrics, mock_atexit): + under_test.register_metrics_collection_atexit(ResmokeToolingMetrics.generate_metrics, + RESMOKE_METRICS_ARGS) + atexit_functions = [call[0][0].__name__ for call in mock_atexit.call_args_list] + assert "_save_metrics" in atexit_functions + + @patch("buildscripts.metrics.tooling_metrics_utils._should_collect_metrics", return_value=False) + def test_no_register_metrics_collection(self, mock_should_collect_metrics, mock_atexit): + under_test.register_metrics_collection_atexit(ResmokeToolingMetrics.generate_metrics, + RESMOKE_METRICS_ARGS) + atexit_functions = [call[0][0].__name__ for call in mock_atexit.call_args_list] + assert "_save_metrics" not in atexit_functions + + @patch("buildscripts.metrics.tooling_metrics_utils.INTERNAL_TOOLING_METRICS_HOSTNAME", TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) class TestSaveToolingMetrics(unittest.TestCase): @mongomock.patch(servers=((TEST_INTERNAL_TOOLING_METRICS_HOSTNAME), )) - def test_on_virtual_workstation(self): - under_test.save_tooling_metrics(ToolingMetrics.get_resmoke_metrics(CURRENT_DATE_TIME)) + def test_save_resmoke_metrics(self): + under_test._save_metrics(ResmokeToolingMetrics.generate_metrics, RESMOKE_METRICS_ARGS) client = pymongo.MongoClient(host=TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) assert client.metrics.tooling_metrics.find_one() @mongomock.patch(servers=((TEST_INTERNAL_TOOLING_METRICS_HOSTNAME), )) - @patch("buildscripts.metrics.tooling_metrics_utils._save_metrics", - side_effect=pymongo.errors.WriteError(error="Error Information")) - def test_exception_caught(self, mock_save_metrics): - with self.assertLogs('tooling_metrics_utils') as cm: - under_test.save_tooling_metrics(ToolingMetrics.get_resmoke_metrics(CURRENT_DATE_TIME)) + @patch("buildscripts.metrics.tooling_metrics_utils._get_internal_tooling_metrics_client", + side_effect=pymongo.errors.ServerSelectionTimeoutError(message="Error Information")) + def test_save_metrics_with_exc(self, mock_save_metrics): + with self.assertLogs('tooling_metrics') as cm: + under_test._save_metrics(ResmokeToolingMetrics.generate_metrics, RESMOKE_METRICS_ARGS) assert "Error Information" in cm.output[0] - assert "Unexpected: Tooling metrics collection is not available" in cm.output[0] + assert "Internal Metrics Collection Failed" in cm.output[0] client = pymongo.MongoClient(host=TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) assert not client.metrics.tooling_metrics.find_one() class TestIsVirtualWorkstation(unittest.TestCase): - @patch("buildscripts.metrics.tooling_metrics_utils._toolchain_exists", return_value=False) - @patch("buildscripts.metrics.tooling_metrics_utils._git_user_exists", return_value=True) - def test_no_toolchain_has_email(self, mock_git_user_exists, mock_toolchain_exists): - assert not under_test._is_virtual_workstation() - - @patch("buildscripts.metrics.tooling_metrics_utils._toolchain_exists", return_value=True) - @patch("buildscripts.metrics.tooling_metrics_utils._git_user_exists", return_value=True) - def test_has_toolchain_has_email(self, mock_git_user_exists, mock_toolchain_exists): - assert under_test._is_virtual_workstation() - - @patch("buildscripts.metrics.tooling_metrics_utils._toolchain_exists", return_value=True) - @patch("buildscripts.metrics.tooling_metrics_utils._git_user_exists", return_value=False) - def test_has_toolchain_no_email(self, mock_git_user_exists, mock_toolchain_exists): - assert not under_test._is_virtual_workstation() + @patch("builtins.open", mock_open(read_data="ubuntu1804-workstation")) + def test_is_virtual_workstation(self): + assert under_test._is_virtual_workstation() is True - @patch("buildscripts.metrics.tooling_metrics_utils._toolchain_exists", return_value=False) - @patch("buildscripts.metrics.tooling_metrics_utils._git_user_exists", return_value=False) - def test_no_toolchain_no_email(self, mock_git_user_exists, mock_toolchain_exists): - assert not under_test._is_virtual_workstation() + @patch("builtins.open", mock_open(read_data="test")) + def test_is_not_virtual_workstation(self): + assert under_test._is_virtual_workstation() is False class TestHasMetricsOptOut(unittest.TestCase): @@ -78,9 +86,9 @@ class TestShouldCollectMetrics(unittest.TestCase): @patch("buildscripts.metrics.tooling_metrics_utils._is_virtual_workstation", return_value=True) @patch("buildscripts.metrics.tooling_metrics_utils._has_metrics_opt_out", return_value=False) def test_should_collect_metrics(self, mock_opt_out, mock_is_virtual_env): - assert under_test.should_collect_metrics() + assert under_test._should_collect_metrics() @patch("buildscripts.metrics.tooling_metrics_utils._is_virtual_workstation", return_value=True) @patch("buildscripts.metrics.tooling_metrics_utils._has_metrics_opt_out", return_value=True) def test_no_collect_metrics_opt_out(self, mock_opt_out, mock_is_virtual_env): - assert not under_test.should_collect_metrics() + assert not under_test._should_collect_metrics() |