summaryrefslogtreecommitdiff
path: root/buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py')
-rw-r--r--buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py72
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()