blob: 626f255ae7b60cfe896cb33286a633c7742b4256 [file] [log] [blame]
mbligh05269362007-10-16 16:58:11 +00001# Copyright Martin J. Bligh, Andy Whitcroft, 2007
2#
mblighea397bb2008-02-02 19:17:51 +00003# Define the server-side test class
mbligh05269362007-10-16 16:58:11 +00004#
mbligh05269362007-10-16 16:58:11 +00005
jadmanski54f90af2008-10-10 16:20:55 +00006import os, tempfile
mblighea397bb2008-02-02 19:17:51 +00007
jadmanski54f90af2008-10-10 16:20:55 +00008from autotest_lib.client.common_lib import log, utils, test as common_test
mbligh05269362007-10-16 16:58:11 +00009
10
mblighccb9e182008-04-17 15:42:10 +000011class test(common_test.base_test):
jadmanski0afbb632008-06-06 21:10:57 +000012 pass
mblighdccabe32008-02-01 17:39:32 +000013
14
jadmanski54f90af2008-10-10 16:20:55 +000015_sysinfo_before_script = """\
16import pickle
17from autotest_lib.client.bin import test
18mytest = test.test(job, '', %r)
19job.sysinfo.log_before_each_test(mytest)
20sysinfo_pickle = os.path.join(mytest.outputdir, 'sysinfo.pickle')
21pickle.dump(job.sysinfo, open(sysinfo_pickle, 'w'))
22job.record('GOOD', '', 'sysinfo.before')
23"""
24
25_sysinfo_after_script = """\
26import pickle
27from autotest_lib.client.bin import test
28mytest = test.test(job, '', %r)
29sysinfo_pickle = os.path.join(mytest.outputdir, 'sysinfo.pickle')
30if os.path.exists(sysinfo_pickle):
31 job.sysinfo = pickle.load(open(sysinfo_pickle))
32 job.sysinfo.__init__(job.resultdir)
33job.sysinfo.log_after_each_test(mytest)
34job.record('GOOD', '', 'sysinfo.after')
35"""
36
37
38class _sysinfo_logger(object):
39 def __init__(self, job):
40 self.job = job
41 self.pickle = None
42 if len(job.machines) != 1:
43 # disable logging on multi-machine tests
44 self.before_hook = self.after_hook = None
45
46
47 def _install(self):
48 from autotest_lib.server import hosts, autotest
49 host = hosts.create_host(self.job.machines[0], auto_monitor=False)
50 tmp_dir = host.get_tmp_dir()
51 at = autotest.Autotest(host)
52 at.install_base(autodir=tmp_dir)
53 return host, at
54
55
56 @log.log_and_ignore_errors("pre-test server sysinfo error:")
57 def before_hook(self, mytest):
58 host, at = self._install()
59 outputdir = host.get_tmp_dir()
60
61 # run the pre-test sysinfo script
62 at.run(_sysinfo_before_script % outputdir,
63 results_dir=self.job.resultdir)
64
65 # pull back the sysinfo pickle
66 fd, path = tempfile.mkstemp(dir=self.job.tmpdir)
67 os.close(fd)
68 host.get_file(os.path.join(outputdir, "sysinfo.pickle"), path)
69 self.pickle = path
70
71
72 @log.log_and_ignore_errors("post-test server sysinfo error:")
73 def after_hook(self, mytest):
74 host, at = self._install()
75 outputdir = host.get_tmp_dir()
76
77 # push the sysinfo pickle out to the remote machine
78 if self.pickle:
79 host.send_file(self.pickle,
80 os.path.join(outputdir, "sysinfo.pickle"))
81 os.remove(self.pickle)
82 self.pickle = None
83
84 # run the post-test sysinfo script
85 at.run(_sysinfo_after_script % outputdir,
86 results_dir=self.job.resultdir)
87
88 # pull the sysinfo data back on to the server
89 host.get_file(os.path.join(outputdir, "sysinfo"), mytest.outputdir)
90
91 # pull the keyval data back into the local one
92 fd, path = tempfile.mkstemp(dir=self.job.tmpdir)
93 os.close(fd)
94 host.get_file(os.path.join(outputdir, "keyval"), path)
95 keyval = utils.read_keyval(path)
96 os.remove(path)
97 mytest.write_test_keyval(keyval)
98
99
mbligh05269362007-10-16 16:58:11 +0000100def runtest(job, url, tag, args, dargs):
jadmanski54f90af2008-10-10 16:20:55 +0000101 logger = _sysinfo_logger(job)
102 common_test.runtest(job, url, tag, args, dargs, locals(), globals(),
103 logger.before_hook, logger.after_hook)