Home | History | Annotate | Download | only in cros
      1 # Copyright (c) 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 # The objective of this test is to identify crashes outlined in the below
      5 # directories while tests run.
      6 
      7 import logging
      8 
      9 class CrashDetector(object):
     10     """ Identifies all crash files outlined in the below (crash_paths)
     11     directories while tests run and get_crash_files finally retuns the list of
     12     crash files found so that the count/file names can be used for further
     13     analysis. At present this test looks for .meta and .kcrash files as defined
     14     in crash_signs variable"""
     15     version = 1
     16 
     17     def __init__(self, host):
     18         """Initilize variables and lists used in script
     19 
     20         @param host: this function runs on client or as defined
     21 
     22         """
     23         self.client = host
     24         self.crash_paths = ['/var/spool', '/home/chronos', '/home/chronos/u-*']
     25         self.crash_signs = ('\( -name "*.meta*" -o -name "*.kcrash*" \) '
     26                             '-printf "%f \n"')
     27         self.files_found = []
     28         self.crash_files_list = []
     29 
     30 
     31     def remove_crash_files(self):
     32         """Delete crash files from host."""
     33         for crash_path in self.crash_paths:
     34             self.client.run('rm -rf %s/crash' % crash_path,
     35                           ignore_status=True)
     36 
     37 
     38     def add_crash_files(self, crash_files, crash_path):
     39         """Checks if files list is empty and then adds to files_list
     40 
     41         @param crash_files: list of crash files found in crash_path
     42         @param crash_path: the path under which crash files are searched for
     43 
     44         """
     45         for crash_file in crash_files:
     46             if crash_file is not '':
     47                 self.files_found.append(crash_file)
     48                 logging.info('CRASH DETECTED in %s/crash: %s',
     49                              crash_path, crash_file)
     50 
     51 
     52     def find_crash_files(self):
     53         """Gets crash files from crash_paths and adds them to list."""
     54         for crash_path in self.crash_paths:
     55             if str(self.client.run('ls %s' % crash_path,
     56                    ignore_status=True)).find('crash') != -1:
     57                 crash_out = self.client.run("find {0} {1} ".format(crash_path,
     58                                     self.crash_signs),ignore_status=True).stdout
     59                 crash_files = crash_out.strip().split('\n')
     60                 self.add_crash_files(crash_files, crash_path)
     61 
     62 
     63     def get_new_crash_files(self):
     64         """ Gets the newly generated files since last .
     65 
     66         @returns list of newly generated crashes
     67         """
     68         self.find_crash_files()
     69         files_collected = set(self.files_found)
     70         crash_files = set(self.crash_files_list)
     71 
     72         diff = list(files_collected.difference(crash_files))
     73         if diff:
     74             self.crash_files_list.extend(diff)
     75         return diff
     76 
     77 
     78     def is_new_crash_present(self):
     79         """Checks for kernel, browser, process crashes on host
     80 
     81         @returns False if there are no crashes; True otherwise
     82 
     83         """
     84         if self.get_new_crash_files():
     85             return True
     86         return False
     87 
     88 
     89     def get_crash_files(self):
     90         """Gets the list of crash_files collected during the tests whenever
     91         is_new_crash_present method is called.
     92 
     93         @returns the list of crash files collected duing the test run
     94         """
     95         self.is_new_crash_present()
     96         return self.crash_files_list
     97