blob: 7a3b83f313fb745482de06ac273e1bda030d2a5f [file] [log] [blame]
Eli Benderskyb9223602011-12-28 10:06:55 +02001#-------------------------------------------------------------------------------
2# test/utils.py
3#
4# Some common utils for tests
5#
6# Eli Bendersky (eliben@gmail.com)
7# This code is in the public domain
8#-------------------------------------------------------------------------------
Eli Benderskyccdb5542013-03-31 14:19:21 -07009import os, sys, subprocess, tempfile
Eli Bendersky26e41c42011-12-28 09:21:14 +020010
Eli Benderskydd71c432013-04-08 06:38:57 -070011# This module should not import elftools before setup_syspath() is called!
12# See the Hacking Guide in the documentation for more details.
Eli Bendersky26e41c42011-12-28 09:21:14 +020013
Eli Benderskyd32d7112013-04-06 07:00:00 -070014def setup_syspath():
15 """ Setup sys.path so that tests pick up local pyelftools before the
16 installed one when run from development directory.
17 """
18 if sys.path[0] != '.':
19 sys.path.insert(0, '.')
20
21
Eli Bendersky26e41c42011-12-28 09:21:14 +020022def run_exe(exe_path, args):
23 """ Runs the given executable as a subprocess, given the
24 list of arguments. Captures its return code (rc) and stdout and
25 returns a pair: rc, stdout_str
26 """
27 popen_cmd = [exe_path] + args
28 if os.path.splitext(exe_path)[1] == '.py':
Eli Benderskyccdb5542013-03-31 14:19:21 -070029 popen_cmd.insert(0, sys.executable)
Eli Bendersky26e41c42011-12-28 09:21:14 +020030 proc = subprocess.Popen(popen_cmd, stdout=subprocess.PIPE)
31 proc_stdout = proc.communicate()[0]
Eli Benderskydd71c432013-04-08 06:38:57 -070032 from elftools.common.py3compat import bytes2str
Eli Bendersky79271e92012-01-27 10:25:47 +020033 return proc.returncode, bytes2str(proc_stdout)
Eli Benderskyd32d7112013-04-06 07:00:00 -070034
Eli Bendersky26e41c42011-12-28 09:21:14 +020035
36def is_in_rootdir():
37 """ Check whether the current dir is the root dir of pyelftools
38 """
39 dirstuff = os.listdir('.')
40 return 'test' in dirstuff and 'elftools' in dirstuff
Eli Benderskyd32d7112013-04-06 07:00:00 -070041
Eli Benderskyb9223602011-12-28 10:06:55 +020042
43def dump_output_to_temp_files(testlog, *args):
44 """ Dumps the output strings given in 'args' to temp files: one for each
45 arg.
46 """
47 for i, s in enumerate(args):
48 fd, path = tempfile.mkstemp(
49 prefix='out' + str(i + 1) + '_',
50 suffix='.stdout')
51 file = os.fdopen(fd, 'w')
52 file.write(s)
53 file.close()
54 testlog.info('@@ Output #%s dumped to file: %s' % (i + 1, path))
Eli Benderskyd32d7112013-04-06 07:00:00 -070055