diff options
author | Tausif Rahman <tausif.rahman@mongodb.com> | 2022-10-12 21:46:03 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-10-12 23:05:26 +0000 |
commit | 61ab44c46f6474094648219537c07378f724b578 (patch) | |
tree | b546c4c562cd8f381741386ac2a66857fa023607 /buildscripts/tests | |
parent | cac04731d8662e87c83d729e775411916e2875dd (diff) | |
download | mongo-61ab44c46f6474094648219537c07378f724b578.tar.gz |
SERVER-69628 Standup Metrics Collection Service
Diffstat (limited to 'buildscripts/tests')
-rw-r--r-- | buildscripts/tests/tooling_metrics/test_metrics_collection.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/buildscripts/tests/tooling_metrics/test_metrics_collection.py b/buildscripts/tests/tooling_metrics/test_metrics_collection.py new file mode 100644 index 00000000000..eff0b905028 --- /dev/null +++ b/buildscripts/tests/tooling_metrics/test_metrics_collection.py @@ -0,0 +1,98 @@ +"""Unit tests for tooling_metrics.py.""" +import asyncio +from datetime import datetime +import socket +import unittest +from unittest.mock import patch +import mongomock +import pymongo +import buildscripts.metrics.tooling_metrics as under_test + +# pylint: disable=unused-argument +# pylint: disable=protected-access + +TEST_INTERNAL_TOOLING_METRICS_HOSTNAME = 'mongodb://testing:27017' +TEST_TOOLING_METRIC_DATA = { + "command": "buildscripts/resmoke.py test-command --test-option=test-value", + "utc_starttime": datetime(2022, 10, 4, 21, 52, 17), + "utc_endtime": datetime(2022, 10, 4, 21, 53, 16), +} +TEST_TOOLING_METRICS = under_test.ToolingMetrics(**TEST_TOOLING_METRIC_DATA) + + +async def extended_sleep(arg): + await asyncio.sleep(2) + + +class TestToolingMetricsCollection(unittest.TestCase): + @mongomock.patch(servers=((TEST_INTERNAL_TOOLING_METRICS_HOSTNAME), )) + @patch("buildscripts.metrics.tooling_metrics.INTERNAL_TOOLING_METRICS_HOSTNAME", + TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + @patch("buildscripts.metrics.tooling_metrics._is_virtual_workstation", return_value=True) + def test_on_virtual_workstation(self, mock_is_virtual_workstation): + under_test.save_tooling_metrics(TEST_TOOLING_METRICS) + client = pymongo.MongoClient(host=TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + inserted_doc = client.metrics.tooling_metrics.find_one() + del inserted_doc['_id'] + expected_doc = {"ip_address": socket.gethostbyname(socket.gethostname())} + expected_doc.update(inserted_doc) + assert inserted_doc == expected_doc + + @mongomock.patch(servers=((TEST_INTERNAL_TOOLING_METRICS_HOSTNAME), )) + @patch("buildscripts.metrics.tooling_metrics.INTERNAL_TOOLING_METRICS_HOSTNAME", + TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + @patch("buildscripts.metrics.tooling_metrics._is_virtual_workstation", return_value=False) + def test_not_on_virtual_workstation(self, mock_is_virtual_workstation): + under_test.save_tooling_metrics(TEST_TOOLING_METRICS) + client = pymongo.MongoClient(host=TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + assert not client.metrics.tooling_metrics.find_one() + + @mongomock.patch(servers=((TEST_INTERNAL_TOOLING_METRICS_HOSTNAME), )) + @patch("buildscripts.metrics.tooling_metrics.INTERNAL_TOOLING_METRICS_HOSTNAME", + TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + @patch("buildscripts.metrics.tooling_metrics._save_metrics", + side_effect=pymongo.errors.WriteError(error="Error Information")) + @patch("buildscripts.metrics.tooling_metrics._is_virtual_workstation", return_value=True) + def test_exception_caught(self, mock_is_virtual_workstation, mock_save_metrics): + with self.assertLogs('tooling_metrics_collection') as cm: + under_test.save_tooling_metrics(TEST_TOOLING_METRICS) + assert "Error Information" in cm.output[0] + assert "Unexpected: Could not save tooling metrics data to MongoDB Atlas Cluster." in cm.output[ + 0] + client = pymongo.MongoClient(host=TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + assert not client.metrics.tooling_metrics.find_one() + + @mongomock.patch(servers=((TEST_INTERNAL_TOOLING_METRICS_HOSTNAME), )) + @patch("buildscripts.metrics.tooling_metrics.INTERNAL_TOOLING_METRICS_HOSTNAME", + TEST_INTERNAL_TOOLING_METRICS_HOSTNAME) + @patch("buildscripts.metrics.tooling_metrics._save_metrics", side_effect=extended_sleep) + @patch("buildscripts.metrics.tooling_metrics._is_virtual_workstation", return_value=True) + def test_timeout_caught(self, mock_is_virtual_workstation, mock_save_metrics): + with self.assertLogs('tooling_metrics_collection') as cm: + under_test.save_tooling_metrics(TEST_TOOLING_METRICS) + assert "Timeout: Could not save tooling metrics data to MongoDB Atlas Cluster." 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._toolchain_exists", return_value=False) + @patch("buildscripts.metrics.tooling_metrics._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._toolchain_exists", return_value=True) + @patch("buildscripts.metrics.tooling_metrics._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._toolchain_exists", return_value=True) + @patch("buildscripts.metrics.tooling_metrics._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("buildscripts.metrics.tooling_metrics._toolchain_exists", return_value=False) + @patch("buildscripts.metrics.tooling_metrics._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() |