#!/usr/bin/python """Tests for drone_utility.""" import os, sys, unittest from cStringIO import StringIO import common from autotest_lib.client.common_lib import global_config from autotest_lib.client.common_lib.test_utils import mock from autotest_lib.scheduler import drone_utility class TestDroneUtility(unittest.TestCase): def setUp(self): self.drone_utility = drone_utility.DroneUtility() self._fake_command = '!faketest!' self._fake_proc_info = {'pid': 3, 'pgid': 4, 'ppid': 2, 'comm': self._fake_command, 'args': ''} self.god = mock.mock_god() self.god.stub_function(self.drone_utility, '_get_process_info') def tearDown(self): self.god.unstub_all() global_config.global_config.reset_config_values() @staticmethod def _set_check_dark_mark(value): global_config.global_config.override_config_value( 'SCHEDULER', 'check_processes_for_dark_mark', repr(value)) def test_refresh_processes_ignore_dark_mark(self): self._set_check_dark_mark(False) self.drone_utility._get_process_info.expect_call().and_return( [self._fake_proc_info]) fake_open = lambda path, mode: self.fail('dark mark checked!') processes = self.drone_utility._refresh_processes(self._fake_command, open=fake_open) our_pid = self._fake_proc_info['pid'] for process in processes: if our_pid == process['pid']: break else: self.fail("No %s processes found" % self._fake_command) self.god.check_playback() def test_refresh_processes_check_dark_mark(self): self._set_check_dark_mark(True) num_procs = 2 proc_info_list = num_procs * [self._fake_proc_info] self.drone_utility._get_process_info.expect_call().and_return( proc_info_list) # Test processes that have the mark in their env. def _open_mark(path, mode): return StringIO('foo=\0%s=\0bar=\0' % drone_utility.DARK_MARK_ENVIRONMENT_VAR) processes = self.drone_utility._refresh_processes(self._fake_command, open=_open_mark) self.assertEqual(num_procs, len(processes)) self.assertEqual(proc_info_list, processes) self.drone_utility._get_process_info.expect_call().and_return( proc_info_list) # Test processes that do not have the mark in their env def _open_nomark(path, mode): return StringIO('foo=\0bar=\0') # No dark mark. processes = self.drone_utility._refresh_processes(self._fake_command, open=_open_nomark) self.assertEqual([], processes) self.god.check_playback() if __name__ == '__main__': unittest.main()