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