autotest: Make crash tests resilient to builds with high ambient crash rates

Change-Id: I1d7dadf109f129a087cb50bcc1c452f6d6f7d02f

BUG=8415
TEST=Run tests with 10Hz ambient crash rate

Review URL: http://codereview.chromium.org/4185011
diff --git a/client/bin/site_crash_test.py b/client/bin/site_crash_test.py
index 8144fe4..9f2d52e 100644
--- a/client/bin/site_crash_test.py
+++ b/client/bin/site_crash_test.py
@@ -10,6 +10,7 @@
 class CrashTest(test.test):
 
     _CONSENT_FILE = '/home/chronos/Consent To Send Stats'
+    _CORE_PATTERN = '/proc/sys/kernel/core_pattern'
     _CRASH_REPORTER_PATH = '/sbin/crash_reporter'
     _CRASH_SENDER_PATH = '/sbin/crash_sender'
     _CRASH_SENDER_RATE_DIR = '/var/lib/crash_sender'
@@ -102,6 +103,10 @@
 
     def _initialize_crash_reporter(self):
         utils.system('%s --init --nounclean_check' % self._CRASH_REPORTER_PATH)
+        # Completely disable crash_reporter from generating crash dumps
+        # while any tests are running, otherwise a crashy system can make
+        # these tests flaky.
+        self.enable_crash_filtering('none')
 
 
     def write_crash_dir_entry(self, name, contents):
@@ -278,11 +283,29 @@
         return result
 
 
+    def _replace_crash_reporter_filter_in(self, new_parameter):
+        core_pattern = utils.read_file(self._CORE_PATTERN)[:-1]
+        core_pattern = re.sub('--filter_in=\S*\s*', '',
+                              core_pattern).rstrip()
+        if new_parameter:
+            core_pattern += ' ' + new_parameter
+        utils.system('echo "%s" > %s' % (core_pattern, self._CORE_PATTERN))
+
+
+    def enable_crash_filtering(self, name):
+        self._replace_crash_reporter_filter_in('--filter_in=' + name)
+
+
+    def disable_crash_filtering(self):
+        self._replace_crash_reporter_filter_in('')
+
+
     def initialize(self):
         test.test.initialize(self)
         self._log_reader = site_log_reader.LogReader()
         self._leave_crash_sending = True
         self._automatic_consent_saving = True
+        self.enable_crash_filtering('none')
 
 
     def cleanup(self):
@@ -292,6 +315,7 @@
         self._set_sending_mock(mock_enabled=False)
         if self._automatic_consent_saving:
             self._pop_consent()
+        self.disable_crash_filtering()
         test.test.cleanup(self)