summaryrefslogtreecommitdiff
path: root/buildscripts/tests/tooling_metrics/test_tooling_metrics_utils.py
blob: c705059194b7b26a612788afecf0576f07660a5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"""Unit tests for tooling_metrics.py."""
from datetime import datetime
import os
import sys
import unittest
from unittest.mock import mock_open, patch
from mock import MagicMock
import mongomock
import pymongo
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'
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_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._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 "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("builtins.open", mock_open(read_data="ubuntu1804-workstation"))
    def test_is_virtual_workstation(self):
        assert under_test._is_virtual_workstation() is True

    @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):
    @patch("os.environ.get", return_value='1')
    def test_opt_out(self, mock_environ_get):
        assert under_test._has_metrics_opt_out()

    @patch("os.environ.get", return_value=None)
    def test_no_opt_out(self, mock_environ_get):
        assert not under_test._has_metrics_opt_out()


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()

    @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()