blob: daaf2fe7b87a613ffb846e0cb4c094a9ca527a9a [file] [log] [blame]
Allen Lica61e062017-07-13 13:15:21 -07001# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Unit tests for proc_metrics."""
6
7# pylint: disable=protected-access
8
9from __future__ import absolute_import
Allen Lica61e062017-07-13 13:15:21 -070010
Mike Frysingercb56b642019-08-25 15:33:08 -040011import psutil # pylint: disable=import-error
Allen Lica61e062017-07-13 13:15:21 -070012
13from chromite.lib import cros_test_lib
14from chromite.scripts.sysmon import proc_metrics
Mike Frysinger40ffb532021-02-12 07:36:08 -050015from chromite.third_party import mock
Allen Lica61e062017-07-13 13:15:21 -070016
17
18def _mock_process(name, cmdline, parent=None):
19 proc = mock.Mock(dir(psutil.Process))
20 proc.name.return_value = name
21 proc.cmdline.return_value = cmdline
22 proc.cpu_percent.return_value = 2
23 if parent is not None:
24 proc.parent.return_value = parent
25 return proc
26
27
28def _mock_forked_process(name, cmdline):
29 parent_proc = _mock_process(name, cmdline)
30 return _mock_process(name, cmdline, parent=parent_proc)
31
32
Allen Li3992c662018-01-05 15:26:36 -080033def _expected_calls_for(name):
34 """Return expected calls for a process metric."""
35 return [
36 mock.call('proc/count', (name,), None,
37 1, enforce_ge=mock.ANY),
38 mock.call('proc/cpu_percent', (name,), None,
39 2, enforce_ge=mock.ANY),
40 ]
41
42
Allen Lica61e062017-07-13 13:15:21 -070043class TestProcMetrics(cros_test_lib.TestCase):
44 """Tests for proc_metrics."""
45
46 def setUp(self):
47 patcher = mock.patch('infra_libs.ts_mon.common.interface.state.store',
48 autospec=True)
49 self.store = patcher.start()
50 self.addCleanup(patcher.stop)
51
52 def test_collect(self):
53 with mock.patch('psutil.process_iter', autospec=True) as process_iter:
54 process_iter.return_value = [
55 _mock_process(
56 name='autoserv',
57 cmdline=['/usr/bin/python',
58 '-u', '/usr/local/autotest/server/autoserv',
59 '-p',
60 '-r', ('/usr/local/autotest/results/hosts/'
61 'chromeos4-row3-rack13-host9/646252-provision'
62 '/20171307125911'),
63 '-m', 'chromeos4-row3-rack13-host9',
64 '--verbose', '--lab', 'True',
65 '--provision', '--job-labels',
66 'cros-version:winky-release/R61-9741.0.0']
67 ),
68 _mock_process(
69 name='apache2',
70 cmdline=['/usr/sbin/apache2', '-k', 'start'],
71 ),
72 _mock_forked_process(
73 name='autoserv',
74 cmdline=['/usr/bin/python',
75 '-u', '/usr/local/autotest/server/autoserv',
76 '-p',
77 '-r', ('/usr/local/autotest/results/hosts/'
78 'chromeos4-row3-rack13-host9/646252-provision'
79 '/20171307125911'),
80 '-m', 'chromeos4-row3-rack13-host9',
81 '--verbose', '--lab', 'True',
82 '--provision', '--job-labels',
83 'cros-version:winky-release/R61-9741.0.0']
84 ),
85 _mock_process(
Allen Li3511a832018-06-27 14:41:01 -070086 name='gs_offloader',
87 cmdline=['/usr/bin/python',
88 '/usr/local/autotest/site_utils/gs_offloader.py',
89 '-s', '--parallelism=30']
90 ),
91 _mock_process(
Allen Lica61e062017-07-13 13:15:21 -070092 name='python',
93 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
94 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
95 '/bin/python'),
96 '-m', 'chromite.scripts.sysmon', '--interval', '60']
97 ),
Allen Li3992c662018-01-05 15:26:36 -080098 _mock_process(
99 name='python',
100 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
101 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
102 '/bin/python'),
103 '-m', 'lucifer.cmd.job_aborter',
104 '--jobdir', '/usr/local/autotest/leases']
105 ),
106 _mock_process(
107 name='python',
108 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
109 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
110 '/bin/python'),
111 '-m', 'lucifer.cmd.job_reporter',
112 '--run-job-path',
113 '/opt/infra-tools/usr/bin/lucifer_run_job',
114 '--jobdir', '/usr/local/autotest/leases',
115 '--job-id', '167263377',
116 '--autoserv-exit', '0',
117 '--',
118 '-resultsdir',
119 ('/usr/local/autotest/results/167263377-chromeos-test/'
120 'chromeos2-row11-rack6-host5'),
121 '-autotestdir', '/usr/local/autotest',
122 '-watcherpath',
123 '/opt/infra-tools/usr/bin/lucifer_watcher']
124 ),
125 _mock_process(
Allen Liee3f5c42018-08-27 18:07:06 -0700126 name='lucifer',
127 cmdline=['/opt/infra-tools/usr/bin/lucifer',
Allen Li3992c662018-01-05 15:26:36 -0800128 '-resultsdir',
129 ('/usr/local/autotest/results/167263377-chromeos-test/'
130 'chromeos2-row11-rack6-host5'),
131 '-autotestdir', '/usr/local/autotest',
132 '-watcherpath',
133 '/opt/infra-tools/usr/bin/lucifer_watcher']
134 ),
Prathmesh Prabhu5ed6f902018-05-07 14:13:02 -0700135 _mock_process(
136 name='lxc-start',
137 cmdline=['[lcx monitor] /usr/local/autotest/containers'
138 ' test_196499100_1525673902_240543]']
139 ),
140 _mock_process(
141 name='lxc-attach',
142 cmdline=['lxc-attach',
143 '-P',
144 '/usr/local/autotest/containers',
145 '-n',
146 'test_196499100_1525673902_240543',
147 '--',
148 'bash',
149 '-c',
150 ('/usr/local/autotest/server/autoserv'
151 ' -s -P 196499100-chromeos-test/group0 ...')]
152 ),
Aviv Keshet98f33792019-10-29 11:05:53 -0700153 _mock_process(
154 name='getty',
155 cmdline=['/sbin/getty', '-8', '38400', 'console',]
156 ),
Allen Lica61e062017-07-13 13:15:21 -0700157 ]
158 proc_metrics.collect_proc_info()
159
160 setter = self.store.set
Allen Li3992c662018-01-05 15:26:36 -0800161 calls = []
Allen Li3511a832018-06-27 14:41:01 -0700162 calls.extend(_expected_calls_for('apache'))
Allen Li3992c662018-01-05 15:26:36 -0800163 calls.extend(_expected_calls_for('autoserv'))
Aviv Keshet98f33792019-10-29 11:05:53 -0700164 calls.extend(_expected_calls_for('getty'))
Allen Li3511a832018-06-27 14:41:01 -0700165 calls.extend(_expected_calls_for('gs_offloader'))
Allen Li3992c662018-01-05 15:26:36 -0800166 calls.extend(_expected_calls_for('job_aborter'))
167 calls.extend(_expected_calls_for('job_reporter'))
Allen Liee3f5c42018-08-27 18:07:06 -0700168 calls.extend(_expected_calls_for('lucifer'))
Prathmesh Prabhu5ed6f902018-05-07 14:13:02 -0700169 calls.extend(_expected_calls_for('lxc-start'))
170 calls.extend(_expected_calls_for('lxc-attach'))
Allen Li3511a832018-06-27 14:41:01 -0700171 calls.extend(_expected_calls_for('sysmon'))
Allen Li3992c662018-01-05 15:26:36 -0800172 calls.extend(_expected_calls_for('other'))
Allen Lica61e062017-07-13 13:15:21 -0700173 setter.assert_has_calls(calls)
174 self.assertEqual(len(setter.mock_calls), len(calls))