tests/compare.py

Sat, 28 Apr 2007 23:52:36 -0400

author
brett
date
Sat, 28 Apr 2007 23:52:36 -0400
branch
trunk
changeset 23
039dd321a7d0
parent 20
69c93c3e6972
child 28
4d88f2231d33
permissions
-rw-r--r--

[svn] If an archive contains other archives, and the user didn't specify that
they wanted recursion, prompt them to find out what they want to do.

This required some changes in the way prompting for one-item archives works
too, because if an archive inside another archive is itself a one-item
archive, things get really weird. I'm still not really sure what the right
policy is for that.

I'm not wild about this code. It feels like programming a bunch of special
cases. I need to figure out a better way to abstract it. I'm thinking
some kind of Policy class....

1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
1 #!/usr/bin/env python
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
2 #
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
3 # compare.py -- High-level tests for x.
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
4 # Copyright (c) 2006 Brett Smith <brettcsmith@brettcsmith.org>.
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
5 #
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
6 # This program is free software; you can redistribute it and/or modify it
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
7 # under the terms of the GNU General Public License as published by the
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
8 # Free Software Foundation; either version 2 of the License, or (at your
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
9 # option) any later version.
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
10 #
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful, but
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
14 # Public License for more details.
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
15 #
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
16 # You should have received a copy of the GNU General Public License along
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
17 # with this program; if not, write to the Free Software Foundation, Inc.,
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
18 # 51 Franklin Street, 5th Floor, Boston, MA, 02111.
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
19
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
20 import os
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
21 import re
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
22 import subprocess
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
23 import syck
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
24 import sys
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
25 import tempfile
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
26
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
27 from sets import Set as set
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
28
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
29 if os.path.exists('scripts/dtrx') and os.path.exists('tests'):
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
30 os.chdir('tests')
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
31 elif os.path.exists('../scripts/dtrx') and os.path.exists('../tests'):
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
32 pass
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
33 else:
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
34 print "ERROR: Can't run tests in this directory!"
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
35 sys.exit(2)
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
36
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
37 X_SCRIPT = os.path.realpath('../scripts/dtrx')
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
38 ROOT_DIR = os.path.realpath(os.curdir)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
39 OUTCOMES = ['error', 'failed', 'passed']
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
40 TESTSCRIPT_NAME = 'testscript.sh'
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
41 SCRIPT_PROLOGUE = """#!/bin/sh
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
42 set -e
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
43 """
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
44
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
45 input_buffer = tempfile.TemporaryFile()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
46 output_buffer = tempfile.TemporaryFile()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
47
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
48 class ExtractorTestError(Exception):
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
49 pass
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
50
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
51
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
52 class ExtractorTest(object):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
53 def __init__(self, **kwargs):
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
54 setattr(self, 'name', kwargs['name'])
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
55 setattr(self, 'options', kwargs.get('options', '-n').split())
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
56 setattr(self, 'filenames', kwargs.get('filenames', '').split())
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
57 for key in ('directory', 'prerun', 'posttest', 'baseline', 'error',
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
58 'grep', 'antigrep', 'input', 'output'):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
59 setattr(self, key, kwargs.get(key, None))
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
60
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
61 def get_results(self, commands, stdin=None):
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
62 print >>output_buffer, "Output from %s:" % (' '.join(commands),)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
63 output_buffer.flush()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
64 status = subprocess.call(commands, stdout=output_buffer,
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
65 stderr=output_buffer, stdin=stdin)
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
66 process = subprocess.Popen(['find', '!', '-name', TESTSCRIPT_NAME],
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
67 stdout=subprocess.PIPE)
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
68 process.wait()
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
69 output = process.stdout.read(-1)
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
70 process.stdout.close()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
71 return status, set(output.split('\n'))
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
72
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
73 def write_script(self, commands):
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
74 script = open(TESTSCRIPT_NAME, 'w')
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
75 script.write("%s%s\n" % (SCRIPT_PROLOGUE, commands))
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
76 script.close()
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
77 subprocess.call(['chmod', 'u+w', TESTSCRIPT_NAME])
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
78
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
79 def get_shell_results(self):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
80 self.write_script(self.baseline)
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
81 return self.get_results(['sh', TESTSCRIPT_NAME] + self.filenames)
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
82
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
83 def get_extractor_results(self):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
84 if self.prerun:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
85 self.write_script(self.prerun)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
86 subprocess.call(['sh', TESTSCRIPT_NAME])
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
87 input_buffer.seek(0, 0)
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
88 input_buffer.truncate()
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
89 if self.input:
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
90 input_buffer.write(self.input)
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
91 if not self.input.endswith('\n'):
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
92 input_buffer.write('\n')
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
93 input_buffer.seek(0, 0)
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
94 input_buffer.flush()
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
95 return self.get_results([X_SCRIPT] + self.options + self.filenames,
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
96 input_buffer)
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
97
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
98 def get_posttest_result(self):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
99 if not self.posttest:
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
100 return 0
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
101 self.write_script(self.posttest)
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
102 return subprocess.call(['sh', TESTSCRIPT_NAME])
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
103
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
104 def clean(self):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
105 if self.directory:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
106 target = os.path.join(ROOT_DIR, self.directory)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
107 extra_options = ['!', '-name', TESTSCRIPT_NAME]
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
108 else:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
109 target = ROOT_DIR
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
110 extra_options = ['-type', 'd',
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
111 '!', '-name', 'CVS',
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
112 '!', '-name', '.svn']
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
113 status = subprocess.call(['find', target,
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
114 '-mindepth', '1', '-maxdepth', '1'] +
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
115 extra_options +
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
116 ['-exec', 'rm', '-rf', '{}', ';'])
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
117 if status != 0:
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
118 raise ExtractorTestError("cleanup exited with status code %s" %
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
119 (status,))
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
120
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
121 def show_status(self, status, message=None):
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
122 raw_status = status.lower()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
123 if raw_status != 'passed':
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
124 output_buffer.seek(0, 0)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
125 sys.stdout.write(output_buffer.read(-1))
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
126 if message is None:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
127 last_part = ''
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
128 else:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
129 last_part = ': %s' % (message,)
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
130 print "%7s: %s%s" % (status, self.name, last_part)
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
131 return raw_status
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
132
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
133 def compare_results(self, actual):
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
134 posttest_result = self.get_posttest_result()
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
135 self.clean()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
136 status, expected = self.get_shell_results()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
137 self.clean()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
138 if expected != actual:
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
139 print >>output_buffer, "Only in baseline results:"
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
140 print >>output_buffer, '\n'.join(expected.difference(actual))
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
141 print >>output_buffer, "Only in actual results:"
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
142 print >>output_buffer, '\n'.join(actual.difference(expected))
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
143 return self.show_status('FAILED')
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
144 elif posttest_result != 0:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
145 print >>output_buffer, "Posttest gave status code", posttest_result
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
146 return self.show_status('FAILED')
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
147 return self.show_status('Passed')
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
148
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
149 def have_error_mismatch(self, status):
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
150 if self.error and (status == 0):
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
151 return "dtrx did not return expected error"
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
152 elif (not self.error) and (status != 0):
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
153 return "dtrx returned error code %s" % (status,)
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
154 return None
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
155
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
156 def grep_output(self, output):
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
157 if self.grep and (not re.search(self.grep, output)):
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
158 return "output did not match %s" % (self.grep)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
159 elif self.antigrep and re.search(self.antigrep, output):
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
160 return "output matched antigrep %s" % (self.antigrep)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
161 return None
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
162
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
163 def check_output(self, output):
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
164 if ((self.output is not None) and
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
165 (self.output.strip() != output.strip())):
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
166 return "output did not match provided text"
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
167 return None
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
168
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
169 def check_results(self):
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
170 output_buffer.seek(0, 0)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
171 output_buffer.truncate()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
172 self.clean()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
173 status, actual = self.get_extractor_results()
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
174 output_buffer.seek(0, 0)
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
175 output_buffer.readline()
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
176 output = output_buffer.read(-1)
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
177 problem = (self.have_error_mismatch(status) or
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
178 self.check_output(output) or self.grep_output(output))
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
179 if problem:
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
180 return self.show_status('FAILED', problem)
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
181 if self.baseline:
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
182 return self.compare_results(actual)
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
183 else:
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
184 return self.show_status('Passed')
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
185
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
186 def run(self):
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
187 if self.directory:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
188 os.mkdir(self.directory)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
189 os.chdir(self.directory)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
190 try:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
191 result = self.check_results()
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
192 except ExtractorTestError, error:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
193 result = self.show_status('ERROR', error)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
194 if self.directory:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
195 os.chdir(ROOT_DIR)
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
196 subprocess.call(['chmod', '-R', '700', self.directory])
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
197 subprocess.call(['rm', '-rf', self.directory])
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
198 return result
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
199
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
200
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
201 test_db = open('tests.yml')
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
202 test_data = syck.load(test_db.read(-1))
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
203 test_db.close()
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
204 tests = [ExtractorTest(**data) for data in test_data]
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
205 for original_data in test_data:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
206 if (original_data.has_key('directory') or
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
207 (not original_data.has_key('baseline'))):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
208 continue
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
209 data = original_data.copy()
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
210 data['name'] += ' in ..'
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
211 data['directory'] = 'inside-dir'
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
212 data['filenames'] = ' '.join(['../%s' % filename for filename in
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
213 data.get('filenames', '').split()])
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
214 tests.append(ExtractorTest(**data))
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
215 results = [test.run() for test in tests]
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
216 counts = {}
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
217 for outcome in OUTCOMES:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
218 counts[outcome] = 0
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
219 for result in results:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
220 counts[result] += 1
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
221 print " Totals:", ', '.join(["%s %s" % (counts[key], key) for key in OUTCOMES])
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
222 input_buffer.close()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
223 output_buffer.close()

mercurial