# Copyright (c) 2017 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. # The objective of this test is to identify crashes outlined in the below # directories while tests run. import logging class CrashDetector(object): """ Identifies all crash files outlined in the below (crash_paths) directories while tests run and get_crash_files finally retuns the list of crash files found so that the count/file names can be used for further analysis. At present this test looks for .meta and .kcrash files as defined in crash_signs variable""" version = 1 def __init__(self, host): """Initilize variables and lists used in script @param host: this function runs on client or as defined """ self.client = host self.crash_paths = ['/var/spool', '/home/chronos', '/home/chronos/u-*'] self.crash_signs = ('\( -name "*.meta*" -o -name "*.kcrash*" \) ' '-printf "%f \n"') self.files_found = [] self.crash_files_list = [] def remove_crash_files(self): """Delete crash files from host.""" for crash_path in self.crash_paths: self.client.run('rm -rf %s/crash' % crash_path, ignore_status=True) def add_crash_files(self, crash_files, crash_path): """Checks if files list is empty and then adds to files_list @param crash_files: list of crash files found in crash_path @param crash_path: the path under which crash files are searched for """ for crash_file in crash_files: if crash_file is not '': self.files_found.append(crash_file) logging.info('CRASH DETECTED in %s/crash: %s', crash_path, crash_file) def find_crash_files(self): """Gets crash files from crash_paths and adds them to list.""" for crash_path in self.crash_paths: if str(self.client.run('ls %s' % crash_path, ignore_status=True)).find('crash') != -1: crash_out = self.client.run("find {0} {1} ".format(crash_path, self.crash_signs),ignore_status=True).stdout crash_files = crash_out.strip().split('\n') self.add_crash_files(crash_files, crash_path) def get_new_crash_files(self): """ Gets the newly generated files since last . @returns list of newly generated crashes """ self.find_crash_files() files_collected = set(self.files_found) crash_files = set(self.crash_files_list) diff = list(files_collected.difference(crash_files)) if diff: self.crash_files_list.extend(diff) return diff def is_new_crash_present(self): """Checks for kernel, browser, process crashes on host @returns False if there are no crashes; True otherwise """ if self.get_new_crash_files(): return True return False def get_crash_files(self): """Gets the list of crash_files collected during the tests whenever is_new_crash_present method is called. @returns the list of crash files collected duing the test run """ self.is_new_crash_present() return self.crash_files_list