#!/usr/bin/python # # 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 logging, mox, subprocess, unittest import common from autotest_lib.frontend.health import check_test_health class RunPrepScriptsTests(mox.MoxTestBase): """Test the run_prep_scripts() function.""" def setUp(self): super(RunPrepScriptsTests, self).setUp() self.mox.StubOutWithMock(subprocess, 'call') self.mox.StubOutWithMock(logging, 'error') self.mox.StubOutWithMock(logging, 'info') def test_given_scripts_are_called(self): """Test that all the scripts passed in are called when they pass.""" scripts = [['script1.sh', 'arg'], ['script2.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script1.sh', 'arg']).AndReturn(0) logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script2.sh']).AndReturn(0) self.mox.ReplayAll() check_test_health.run_prep_scripts(scripts) def test_return_true_if_all_scripts_suceed(self): """Test that True is returned when all the scripts succeed.""" scripts = [['script.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(mox.IgnoreArg()).AndReturn(0) self.mox.ReplayAll() self.assertTrue(check_test_health.run_prep_scripts(scripts)) def test_script_information_logging(self): """Test that we log prep running and failure.""" scripts = [['pass.py'], ['fail.sh', 'arg']] logging.info('Running %s', 'pass.py') subprocess.call(['pass.py']).AndReturn(0) logging.info('Running %s', 'fail.sh arg') subprocess.call(['fail.sh', 'arg']).AndReturn(1) logging.error('\'%s\' failed with return code %d', ('fail.sh arg', 1)) self.mox.ReplayAll() check_test_health.run_prep_scripts(scripts) def test_return_false_if_script_fails(self): """Test that False is returned if a preparation step fails.""" scripts = [['script.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(mox.IgnoreArg()).AndReturn(1) logging.error(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.ReplayAll() self.assertFalse(check_test_health.run_prep_scripts(scripts)) def test_do_not_run_other_scripts_after_one_fails(self): """Test that the other prep scripts are not ran if one fails.""" scripts = [['script1.sh', 'arg'], ['script2.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script1.sh', 'arg']).AndReturn(1) logging.error(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.ReplayAll() check_test_health.run_prep_scripts(scripts) class RunAnalysisScripts(mox.MoxTestBase): """Test the run_analysis_scripts() function.""" def setUp(self): super(RunAnalysisScripts, self).setUp() self.mox.StubOutWithMock(subprocess, 'call') self.mox.StubOutWithMock(logging, 'error') self.mox.StubOutWithMock(logging, 'info') def test_given_scripts_are_called(self): """Test that all the scripts passed in are called when they pass.""" scripts = [['script1.sh', 'arg'], ['script2.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script1.sh', 'arg']).AndReturn(0) logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script2.sh']).AndReturn(0) self.mox.ReplayAll() check_test_health.run_analysis_scripts(scripts) def test_return_true_if_all_scripts_suceed(self): """Test that True is returned when all the scripts succeed.""" scripts = [['script.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(mox.IgnoreArg()).AndReturn(0) self.mox.ReplayAll() self.assertTrue(check_test_health.run_analysis_scripts(scripts)) def test_script_information_logging(self): """Test that we log prep running and failure.""" scripts = [['pass.py'], ['fail.sh', 'arg']] logging.info('Running %s', 'pass.py') subprocess.call(['pass.py']).AndReturn(0) logging.info('Running %s', 'fail.sh arg') subprocess.call(['fail.sh', 'arg']).AndReturn(1) logging.error('\'%s\' failed with return code %d', ('fail.sh arg', 1)) self.mox.ReplayAll() check_test_health.run_analysis_scripts(scripts) def test_return_false_if_script_fails(self): """"Test that False is returned when at least one script fails.""" scripts = [['script.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(mox.IgnoreArg()).AndReturn(1) logging.error(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.ReplayAll() self.assertFalse(check_test_health.run_analysis_scripts(scripts)) def test_run_other_scripts_after_one_fails(self): """Test that the other analysis scripts are ran even if one fails.""" scripts = [['script1.sh', 'arg'], ['script2.sh']] logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script1.sh', 'arg']).AndReturn(1) logging.error(mox.IgnoreArg(), mox.IgnoreArg()) logging.info(mox.IgnoreArg(), mox.IgnoreArg()) subprocess.call(['script2.sh']).AndReturn(0) self.mox.ReplayAll() check_test_health.run_analysis_scripts(scripts) class MainTests(mox.MoxTestBase): """Tests the main function.""" def setUp(self): super(MainTests, self).setUp() self.mox.StubOutWithMock(check_test_health, 'run_prep_scripts') self.mox.StubOutWithMock(check_test_health, 'run_analysis_scripts') self._orig_prep = check_test_health.PREP_SCRIPTS self._orig_analysis = check_test_health.ANALYSIS_SCRIPTS def tearDown(self): super(MainTests, self).tearDown() check_test_health.PREP_SCRIPTS = self._orig_prep check_test_health.ANALYSIS_SCRIPTS = self._orig_analysis def test_all_functions_called_if_there_are_no_errors(self): """Test that all the script calling functions are called by default.""" check_test_health.PREP_SCRIPTS = [['test_prep']] check_test_health.ANALYSIS_SCRIPTS = [['test_analysis']] check_test_health.run_prep_scripts( check_test_health.PREP_SCRIPTS).AndReturn(True) check_test_health.run_analysis_scripts( check_test_health.ANALYSIS_SCRIPTS).AndReturn(True) self.mox.ReplayAll() self.assertEqual(check_test_health.main(), 0) def test_handle_prep_failure(self): """Test that we properly handle a prep script failing.""" check_test_health.run_prep_scripts(mox.IgnoreArg()).AndReturn(False) self.mox.ReplayAll() self.assertEqual(check_test_health.main(), 1) def test_handle_analysis_failure(self): """Test that we properly handle an analysis script failing.""" check_test_health.run_prep_scripts(mox.IgnoreArg()).AndReturn(True) check_test_health.run_analysis_scripts(mox.IgnoreArg()).AndReturn(False) self.mox.ReplayAll() self.assertEqual(check_test_health.main(), 1) if __name__ == '__main__': unittest.main()