test.py revision 79a2ee19751173af33227bd4438e0bc7d2ced6e7
105269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh# Copyright Martin J. Bligh, Andy Whitcroft, 2007 205269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh# 3ea397bbc85f1a3eda39c9f2ef4fc209b4ff336f4mbligh# Define the server-side test class 405269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh# 505269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh 654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskiimport os, tempfile 7ea397bbc85f1a3eda39c9f2ef4fc209b4ff336f4mbligh 854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskifrom autotest_lib.client.common_lib import log, utils, test as common_test 905269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh 1005269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh 11ccb9e18237137e547fc0f815506710a8b1d94453mblighclass test(common_test.base_test): 120afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski pass 1305269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh 1405269369a9bbfee9481ce8b03b88f7abce4bad7bmbligh 1554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski_sysinfo_before_script = """\ 1654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskiimport pickle 1754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskifrom autotest_lib.client.bin import test 1854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskimytest = test.test(job, '', %r) 1954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskijob.sysinfo.log_before_each_test(mytest) 2054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskisysinfo_pickle = os.path.join(mytest.outputdir, 'sysinfo.pickle') 2154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskipickle.dump(job.sysinfo, open(sysinfo_pickle, 'w')) 2254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskijob.record('GOOD', '', 'sysinfo.before') 2354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski""" 2454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 2554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski_sysinfo_after_script = """\ 2654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskiimport pickle 2754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskifrom autotest_lib.client.bin import test 2854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskimytest = test.test(job, '', %r) 2954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskisysinfo_pickle = os.path.join(mytest.outputdir, 'sysinfo.pickle') 3054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskiif os.path.exists(sysinfo_pickle): 3154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski job.sysinfo = pickle.load(open(sysinfo_pickle)) 3254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski job.sysinfo.__init__(job.resultdir) 3354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskijob.sysinfo.log_after_each_test(mytest) 3454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskijob.record('GOOD', '', 'sysinfo.after') 3554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski""" 3654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 3754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 3854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskiclass _sysinfo_logger(object): 3954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski def __init__(self, job): 4054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski self.job = job 4154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski self.pickle = None 4254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski if len(job.machines) != 1: 4354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # disable logging on multi-machine tests 4454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski self.before_hook = self.after_hook = None 4554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 4654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 4754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski def _install(self): 4854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski from autotest_lib.server import hosts, autotest 49c75e0acf5fa50407e9adfefd7300731abf08dbd0mbligh host = hosts.create_host(self.job.machines[0], auto_monitor=False, 50c75e0acf5fa50407e9adfefd7300731abf08dbd0mbligh initialize=False) 5154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski tmp_dir = host.get_tmp_dir() 5254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski at = autotest.Autotest(host) 5354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski at.install_base(autodir=tmp_dir) 5454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski return host, at 5554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 5654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 5754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski @log.log_and_ignore_errors("pre-test server sysinfo error:") 5854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski def before_hook(self, mytest): 5954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski host, at = self._install() 6054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski outputdir = host.get_tmp_dir() 6154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 6254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # run the pre-test sysinfo script 6354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski at.run(_sysinfo_before_script % outputdir, 6454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski results_dir=self.job.resultdir) 6554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 6654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # pull back the sysinfo pickle 6754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski fd, path = tempfile.mkstemp(dir=self.job.tmpdir) 6854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski os.close(fd) 6954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski host.get_file(os.path.join(outputdir, "sysinfo.pickle"), path) 7054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski self.pickle = path 7154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 7254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 7354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski @log.log_and_ignore_errors("post-test server sysinfo error:") 7454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski def after_hook(self, mytest): 7554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski host, at = self._install() 7654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski outputdir = host.get_tmp_dir() 7754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 7854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # push the sysinfo pickle out to the remote machine 7954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski if self.pickle: 8054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski host.send_file(self.pickle, 8154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski os.path.join(outputdir, "sysinfo.pickle")) 8254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski os.remove(self.pickle) 8354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski self.pickle = None 8454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 8554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # run the post-test sysinfo script 8654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski at.run(_sysinfo_after_script % outputdir, 8754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski results_dir=self.job.resultdir) 8854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 8954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # pull the sysinfo data back on to the server 9054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski host.get_file(os.path.join(outputdir, "sysinfo"), mytest.outputdir) 9154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 9254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski # pull the keyval data back into the local one 9354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski fd, path = tempfile.mkstemp(dir=self.job.tmpdir) 9454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski os.close(fd) 9554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski host.get_file(os.path.join(outputdir, "keyval"), path) 9654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski keyval = utils.read_keyval(path) 9754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski os.remove(path) 9854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski mytest.write_test_keyval(keyval) 9954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 10054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski 10105269369a9bbfee9481ce8b03b88f7abce4bad7bmblighdef runtest(job, url, tag, args, dargs): 10279a2ee19751173af33227bd4438e0bc7d2ced6e7mbligh if not dargs.pop('disable_sysinfo', False): 10379a2ee19751173af33227bd4438e0bc7d2ced6e7mbligh logger = _sysinfo_logger(job) 10479a2ee19751173af33227bd4438e0bc7d2ced6e7mbligh logging_args = [logger.before_hook, logger.after_hook] 10579a2ee19751173af33227bd4438e0bc7d2ced6e7mbligh else: 10679a2ee19751173af33227bd4438e0bc7d2ced6e7mbligh logging_args = [None, None] 10754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski common_test.runtest(job, url, tag, args, dargs, locals(), globals(), 10879a2ee19751173af33227bd4438e0bc7d2ced6e7mbligh *logging_args) 109