tests/compare.py

branch
trunk
changeset 1
a86a0cb0dd57
child 7
1f3cb3845dfd
equal deleted inserted replaced
0:10840258891a 1:a86a0cb0dd57
1 #!/usr/bin/env python
2 #
3 # compare.py -- High-level tests for x.
4 # Copyright (c) 2006 Brett Smith <brettcsmith@brettcsmith.org>.
5 #
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by the
8 # Free Software Foundation; either version 2 of the License, or (at your
9 # option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
14 # Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along
17 # with this program; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, 5th Floor, Boston, MA, 02111.
19
20 import os
21 import subprocess
22 import sys
23
24 from sets import Set as set
25
26 TESTSCRIPT_NAME = 'testscript.sh'
27 SCRIPT_PROLOGUE = """#!/bin/sh
28 set -e
29 """
30
31 tests = {'test-1.23.tar': ['tar -xf test-1.23.tar'],
32 'test-1.23.tar.gz': ['tar -xzf test-1.23.tar.gz'],
33 'test-1.23.tar.bz2': ['mkdir test-1.23',
34 'cd test-1.23',
35 'tar -jxf ../test-1.23.tar.bz2'],
36 'test-1.23.zip': ['mkdir test-1.23',
37 'cd test-1.23',
38 'unzip -q ../test-1.23.zip'],
39 'test-1.23.cpio': ['cpio -i --make-directories \
40 <test-1.23.cpio 2>/dev/null'],
41 'test-1.23_all.deb': ['TD=$PWD',
42 'mkdir test-1.23',
43 'cd /tmp',
44 'ar x $TD/test-1.23_all.deb data.tar.gz',
45 'cd $TD/test-1.23',
46 'tar -zxf /tmp/data.tar.gz',
47 'rm /tmp/data.tar.gz']}
48
49 if os.path.exists('scripts/x') and os.path.exists('tests'):
50 os.chdir('tests')
51 elif os.path.exists('../scripts/x') and os.path.exists('../tests'):
52 pass
53 else:
54 print "ERROR: Can't run tests in this directory!"
55 sys.exit(2)
56
57 class ExtractorTestError(Exception):
58 pass
59
60
61 class ExtractorTest(object):
62 def __init__(self, archive_filename, commands):
63 self.archive_filename = archive_filename
64 self.shell_commands = commands
65
66 def get_results(self, commands):
67 status = subprocess.call(commands)
68 if status != 0:
69 return None
70 process = subprocess.Popen(['find'], stdout=subprocess.PIPE)
71 process.wait()
72 output = process.stdout.read(-1)
73 process.stdout.close()
74 return set(output.split('\n'))
75
76 def get_shell_results(self):
77 script = open(TESTSCRIPT_NAME, 'w')
78 script.write("%s%s\n" % (SCRIPT_PROLOGUE,
79 '\n'.join(self.shell_commands)))
80 script.close()
81 subprocess.call(['chmod', 'u+w', TESTSCRIPT_NAME])
82 return self.get_results(['sh', TESTSCRIPT_NAME])
83
84 def get_extractor_results(self):
85 return self.get_results(['../scripts/x', self.archive_filename])
86
87 def clean(self):
88 status = subprocess.call(['find', '-mindepth', '1', '-maxdepth', '1',
89 '-type', 'd',
90 '!', '-name', 'CVS', '!', '-name', '.svn',
91 '-exec', 'rm', '-rf', '{}', ';'])
92 if status != 0:
93 raise ExtractorTestError("cleanup exited with status code %s" %
94 (status,))
95
96 def run(self):
97 self.clean()
98 expected = self.get_shell_results()
99 self.clean()
100 actual = self.get_extractor_results()
101 self.clean()
102 if expected is None:
103 raise ExtractorTestError("could not get baseline results")
104 elif actual is None:
105 raise ExtractorTestError("could not get extractor results")
106 elif expected != actual:
107 print "FAILED:", self.archive_filename
108 print "Only in baseline results:"
109 print '\n'.join(expected.difference(actual))
110 print "Only in actual results:"
111 print '\n'.join(actual.difference(expected))
112 return False
113 else:
114 print "Passed:", self.archive_filename
115 return True
116
117
118 successes = 0
119 failures = 0
120 testnames = tests.keys()
121 testnames.sort()
122 for testname in testnames:
123 test = ExtractorTest(testname, tests[testname])
124 if test.run():
125 successes += 1
126 else:
127 failures += 1
128 print "Totals: %s successes, %s failures" % (successes, failures)
129

mercurial