blob: 9dea77eb4019b9b0f6ab25100fc540e61f0d05ad [file] [log] [blame]
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import re
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
class platform_CheckCriticalProcesses(test.test):
"""
Builds a process list (without spawning 'ps'), and validates
that among these processes all the expected processes are running.
"""
version = 1
def get_process_name(self, pid):
"""Gathers info about one process, given its PID
@param pid string representing the process ID
@return string process name
"""
with open(os.path.join('/proc', pid, 'status')) as pid_status_file:
for line in pid_status_file:
fields = re.split('\s+',line)
if fields[0] == 'Name:':
return fields[1]
def get_process_list(self):
"""Returns the set the process names"""
process_names = set()
for pid in os.listdir('/proc'):
if not pid.isdigit():
continue
# There can be a race where after we listdir(), a process
# exits. In that case get_process_name will throw an IOError
# becase /proc/NNNN won't exist.
# In those cases, skip to the next go-round of our loop.
try:
process_names.add(self.get_process_name(pid))
except IOError:
continue
return process_names
def run_once(self, process_list):
"""
Verify processes in |process_list| are running.
@param process_list: list of process names to check
"""
processes = self.get_process_list()
missing_processes = []
for p in process_list:
processes_names = p.split('|')
if set(processes_names).isdisjoint(processes):
missing_processes.append(p)
if missing_processes:
raise error.TestFail('The following processes are not running: %r.'
% missing_processes)