Sun, 29 Oct 2006 20:03:12 -0500
[svn] Fix a small bug that would crash the program if an archive was empty.
Make basename calculation more robust.
Go ahead and run .exe files through the ZipExtractor. Need to cope more
gracefully when it doesn't work, but I've lost momentum for tonight.
1 | 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 |