blob: f5fb138854f03c0def5798413e9795ac80e03ada [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Allen Lica61e062017-07-13 13:15:21 -07002# Copyright 2017 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Unit tests for proc_metrics."""
7
8# pylint: disable=protected-access
9
10from __future__ import absolute_import
11from __future__ import print_function
12
13import mock
14import psutil
15
16from chromite.lib import cros_test_lib
17from chromite.scripts.sysmon import proc_metrics
18
19
20def _mock_process(name, cmdline, parent=None):
21 proc = mock.Mock(dir(psutil.Process))
22 proc.name.return_value = name
23 proc.cmdline.return_value = cmdline
24 proc.cpu_percent.return_value = 2
25 if parent is not None:
26 proc.parent.return_value = parent
27 return proc
28
29
30def _mock_forked_process(name, cmdline):
31 parent_proc = _mock_process(name, cmdline)
32 return _mock_process(name, cmdline, parent=parent_proc)
33
34
Allen Li3992c662018-01-05 15:26:36 -080035def _expected_calls_for(name):
36 """Return expected calls for a process metric."""
37 return [
38 mock.call('proc/count', (name,), None,
39 1, enforce_ge=mock.ANY),
40 mock.call('proc/cpu_percent', (name,), None,
41 2, enforce_ge=mock.ANY),
42 ]
43
44
Allen Lica61e062017-07-13 13:15:21 -070045class TestProcMetrics(cros_test_lib.TestCase):
46 """Tests for proc_metrics."""
47
48 def setUp(self):
49 patcher = mock.patch('infra_libs.ts_mon.common.interface.state.store',
50 autospec=True)
51 self.store = patcher.start()
52 self.addCleanup(patcher.stop)
53
54 def test_collect(self):
55 with mock.patch('psutil.process_iter', autospec=True) as process_iter:
56 process_iter.return_value = [
57 _mock_process(
58 name='autoserv',
59 cmdline=['/usr/bin/python',
60 '-u', '/usr/local/autotest/server/autoserv',
61 '-p',
62 '-r', ('/usr/local/autotest/results/hosts/'
63 'chromeos4-row3-rack13-host9/646252-provision'
64 '/20171307125911'),
65 '-m', 'chromeos4-row3-rack13-host9',
66 '--verbose', '--lab', 'True',
67 '--provision', '--job-labels',
68 'cros-version:winky-release/R61-9741.0.0']
69 ),
70 _mock_process(
71 name='apache2',
72 cmdline=['/usr/sbin/apache2', '-k', 'start'],
73 ),
74 _mock_forked_process(
75 name='autoserv',
76 cmdline=['/usr/bin/python',
77 '-u', '/usr/local/autotest/server/autoserv',
78 '-p',
79 '-r', ('/usr/local/autotest/results/hosts/'
80 'chromeos4-row3-rack13-host9/646252-provision'
81 '/20171307125911'),
82 '-m', 'chromeos4-row3-rack13-host9',
83 '--verbose', '--lab', 'True',
84 '--provision', '--job-labels',
85 'cros-version:winky-release/R61-9741.0.0']
86 ),
87 _mock_process(
88 name='python',
89 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
90 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
91 '/bin/python'),
92 '-m', 'chromite.scripts.sysmon', '--interval', '60']
93 ),
Allen Li3992c662018-01-05 15:26:36 -080094 _mock_process(
95 name='python',
96 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
97 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
98 '/bin/python'),
99 '-m', 'lucifer.cmd.job_aborter',
100 '--jobdir', '/usr/local/autotest/leases']
101 ),
102 _mock_process(
103 name='python',
104 cmdline=[('/usr/local/google/home/chromeos-test/.cache/cros_venv'
105 '/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0'
106 '/bin/python'),
107 '-m', 'lucifer.cmd.job_reporter',
108 '--run-job-path',
109 '/opt/infra-tools/usr/bin/lucifer_run_job',
110 '--jobdir', '/usr/local/autotest/leases',
111 '--job-id', '167263377',
112 '--autoserv-exit', '0',
113 '--',
114 '-resultsdir',
115 ('/usr/local/autotest/results/167263377-chromeos-test/'
116 'chromeos2-row11-rack6-host5'),
117 '-autotestdir', '/usr/local/autotest',
118 '-watcherpath',
119 '/opt/infra-tools/usr/bin/lucifer_watcher']
120 ),
121 _mock_process(
122 name='lucifer_run_job',
123 cmdline=['/opt/infra-tools/usr/bin/lucifer_run_job',
124 '-resultsdir',
125 ('/usr/local/autotest/results/167263377-chromeos-test/'
126 'chromeos2-row11-rack6-host5'),
127 '-autotestdir', '/usr/local/autotest',
128 '-watcherpath',
129 '/opt/infra-tools/usr/bin/lucifer_watcher']
130 ),
Allen Lica61e062017-07-13 13:15:21 -0700131 ]
132 proc_metrics.collect_proc_info()
133
134 setter = self.store.set
Allen Li3992c662018-01-05 15:26:36 -0800135 calls = []
136 calls.extend(_expected_calls_for('autoserv'))
137 calls.extend(_expected_calls_for('sysmon'))
138 calls.extend(_expected_calls_for('job_aborter'))
139 calls.extend(_expected_calls_for('job_reporter'))
140 calls.extend(_expected_calls_for('lucifer_run_job'))
141 calls.extend(_expected_calls_for('apache'))
142 calls.extend(_expected_calls_for('other'))
Allen Lica61e062017-07-13 13:15:21 -0700143 setter.assert_has_calls(calls)
144 self.assertEqual(len(setter.mock_calls), len(calls))