blob: d96401d8464c06a6b53bcf408e6abc0bf7734793 [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 Frysinger166fea02021-02-12 05:30:33 -050011from unittest import mock
12
Mike Frysingercb56b642019-08-25 15:33:08 -040013import psutil # pylint: disable=import-error
Allen Lica61e062017-07-13 13:15:21 -070014
15from chromite.lib import cros_test_lib
16from chromite.scripts.sysmon import proc_metrics
17
18
19def _mock_process(name, cmdline, parent=None):
20 proc = mock.Mock(dir(psutil.Process))
21 proc.name.return_value = name
22 proc.cmdline.return_value = cmdline
23 proc.cpu_percent.return_value = 2
24 if parent is not None:
25 proc.parent.return_value = parent
26 return proc
27
28
29def _mock_forked_process(name, cmdline):
30 parent_proc = _mock_process(name, cmdline)
31 return _mock_process(name, cmdline, parent=parent_proc)
32
33
Allen Li3992c662018-01-05 15:26:36 -080034def _expected_calls_for(name):
35 """Return expected calls for a process metric."""
36 return [
37 mock.call('proc/count', (name,), None,
38 1, enforce_ge=mock.ANY),
39 mock.call('proc/cpu_percent', (name,), None,
40 2, enforce_ge=mock.ANY),
41 ]
42
43
Allen Lica61e062017-07-13 13:15:21 -070044class TestProcMetrics(cros_test_lib.TestCase):
45 """Tests for proc_metrics."""
46
47 def setUp(self):
48 patcher = mock.patch('infra_libs.ts_mon.common.interface.state.store',
49 autospec=True)
50 self.store = patcher.start()
51 self.addCleanup(patcher.stop)
52
53 def test_collect(self):
54 with mock.patch('psutil.process_iter', autospec=True) as process_iter:
55 process_iter.return_value = [
56 _mock_process(
57 name='autoserv',
58 cmdline=['/usr/bin/python',
59 '-u', '/usr/local/autotest/server/autoserv',
60 '-p',
61 '-r', ('/usr/local/autotest/results/hosts/'
62 'chromeos4-row3-rack13-host9/646252-provision'
63 '/20171307125911'),
64 '-m', 'chromeos4-row3-rack13-host9',
65 '--verbose', '--lab', 'True',
66 '--provision', '--job-labels',
67 'cros-version:winky-release/R61-9741.0.0']
68 ),
69 _mock_process(
70 name='apache2',
71 cmdline=['/usr/sbin/apache2', '-k', 'start'],
72 ),
73 _mock_forked_process(
74 name='autoserv',
75 cmdline=['/usr/bin/python',
76 '-u', '/usr/local/autotest/server/autoserv',
77 '-p',
78 '-r', ('/usr/local/autotest/results/hosts/'
79 'chromeos4-row3-rack13-host9/646252-provision'
80 '/20171307125911'),
81 '-m', 'chromeos4-row3-rack13-host9',
82 '--verbose', '--lab', 'True',
83 '--provision', '--job-labels',
84 'cros-version:winky-release/R61-9741.0.0']
85 ),
86 _mock_process(
Allen Li3511a832018-06-27 14:41:01 -070087 name='gs_offloader',
88 cmdline=['/usr/bin/python',
89 '/usr/local/autotest/site_utils/gs_offloader.py',
90 '-s', '--parallelism=30']
91 ),
92 _mock_process(
Allen Lica61e062017-07-13 13:15:21 -070093 name='python',
94 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
95 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
96 '/bin/python'),
97 '-m', 'chromite.scripts.sysmon', '--interval', '60']
98 ),
Allen Li3992c662018-01-05 15:26:36 -080099 _mock_process(
100 name='python',
101 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
102 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
103 '/bin/python'),
104 '-m', 'lucifer.cmd.job_aborter',
105 '--jobdir', '/usr/local/autotest/leases']
106 ),
107 _mock_process(
108 name='python',
109 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
110 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
111 '/bin/python'),
112 '-m', 'lucifer.cmd.job_reporter',
113 '--run-job-path',
114 '/opt/infra-tools/usr/bin/lucifer_run_job',
115 '--jobdir', '/usr/local/autotest/leases',
116 '--job-id', '167263377',
117 '--autoserv-exit', '0',
118 '--',
119 '-resultsdir',
120 ('/usr/local/autotest/results/167263377-chromeos-test/'
121 'chromeos2-row11-rack6-host5'),
122 '-autotestdir', '/usr/local/autotest',
123 '-watcherpath',
124 '/opt/infra-tools/usr/bin/lucifer_watcher']
125 ),
126 _mock_process(
Allen Liee3f5c42018-08-27 18:07:06 -0700127 name='lucifer',
128 cmdline=['/opt/infra-tools/usr/bin/lucifer',
Allen Li3992c662018-01-05 15:26:36 -0800129 '-resultsdir',
130 ('/usr/local/autotest/results/167263377-chromeos-test/'
131 'chromeos2-row11-rack6-host5'),
132 '-autotestdir', '/usr/local/autotest',
133 '-watcherpath',
134 '/opt/infra-tools/usr/bin/lucifer_watcher']
135 ),
Prathmesh Prabhu5ed6f902018-05-07 14:13:02 -0700136 _mock_process(
137 name='lxc-start',
138 cmdline=['[lcx monitor] /usr/local/autotest/containers'
139 ' test_196499100_1525673902_240543]']
140 ),
141 _mock_process(
142 name='lxc-attach',
143 cmdline=['lxc-attach',
144 '-P',
145 '/usr/local/autotest/containers',
146 '-n',
147 'test_196499100_1525673902_240543',
148 '--',
149 'bash',
150 '-c',
151 ('/usr/local/autotest/server/autoserv'
152 ' -s -P 196499100-chromeos-test/group0 ...')]
153 ),
Aviv Keshet98f33792019-10-29 11:05:53 -0700154 _mock_process(
155 name='getty',
156 cmdline=['/sbin/getty', '-8', '38400', 'console',]
157 ),
Allen Lica61e062017-07-13 13:15:21 -0700158 ]
159 proc_metrics.collect_proc_info()
160
161 setter = self.store.set
Allen Li3992c662018-01-05 15:26:36 -0800162 calls = []
Allen Li3511a832018-06-27 14:41:01 -0700163 calls.extend(_expected_calls_for('apache'))
Allen Li3992c662018-01-05 15:26:36 -0800164 calls.extend(_expected_calls_for('autoserv'))
Aviv Keshet98f33792019-10-29 11:05:53 -0700165 calls.extend(_expected_calls_for('getty'))
Allen Li3511a832018-06-27 14:41:01 -0700166 calls.extend(_expected_calls_for('gs_offloader'))
Allen Li3992c662018-01-05 15:26:36 -0800167 calls.extend(_expected_calls_for('job_aborter'))
168 calls.extend(_expected_calls_for('job_reporter'))
Allen Liee3f5c42018-08-27 18:07:06 -0700169 calls.extend(_expected_calls_for('lucifer'))
Prathmesh Prabhu5ed6f902018-05-07 14:13:02 -0700170 calls.extend(_expected_calls_for('lxc-start'))
171 calls.extend(_expected_calls_for('lxc-attach'))
Allen Li3511a832018-06-27 14:41:01 -0700172 calls.extend(_expected_calls_for('sysmon'))
Allen Li3992c662018-01-05 15:26:36 -0800173 calls.extend(_expected_calls_for('other'))
Allen Lica61e062017-07-13 13:15:21 -0700174 setter.assert_has_calls(calls)
175 self.assertEqual(len(setter.mock_calls), len(calls))