tests/compare.py

Thu, 10 Jul 2008 19:51:53 -0400

author
Brett Smith <brett@brettcsmith.org>
date
Thu, 10 Jul 2008 19:51:53 -0400
branch
trunk
changeset 69
35a2f45cdd3b
parent 54
cd43d2f61162
child 107
1b7450ae4c67
permissions
-rw-r--r--

Count files in the archive and report that in the recursion prompt.

I like this because, for example, if you see that all or most of the files
in the archive are recursive, you can go ahead and decide to recurse right
away.

This invoved making the grep tests a little smarter about handling white
space.

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 #
42
4a4cab75d5e6 [svn] Update documentation.
brett
parents: 38
diff changeset
3 # compare.py -- High-level tests for dtrx.
54
cd43d2f61162 [svn] Update copyright dates in the license headers.
brett
parents: 53
diff changeset
4 # Copyright (c) 2006, 2007, 2008 Brett Smith <brettcsmith@brettcsmith.org>.
1
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
28
4d88f2231d33 [svn] Change all the license notices from GPLv2 to GPLv3.
brett
parents: 20
diff changeset
8 # Free Software Foundation; either version 3 of the License, or (at your
1
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
42
4a4cab75d5e6 [svn] Update documentation.
brett
parents: 38
diff changeset
17 # with this program; if not, see <http://www.gnu.org/licenses/>.
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
18
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
19 import os
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
20 import re
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
21 import subprocess
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
22 import syck
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
23 import sys
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
24 import tempfile
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
25
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
26 from sets import Set as set
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
27
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
28 if os.path.exists('scripts/dtrx') and os.path.exists('tests'):
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
29 os.chdir('tests')
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
30 elif os.path.exists('../scripts/dtrx') and os.path.exists('../tests'):
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
31 pass
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
32 else:
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
33 print "ERROR: Can't run tests in this directory!"
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
34 sys.exit(2)
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
35
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
36 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
37 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
38 OUTCOMES = ['error', 'failed', 'passed']
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
39 TESTSCRIPT_NAME = 'testscript.sh'
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
40 SCRIPT_PROLOGUE = """#!/bin/sh
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
41 set -e
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
42 """
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
43
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
44 input_buffer = tempfile.TemporaryFile()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
45 output_buffer = tempfile.TemporaryFile()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
46
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
47 class ExtractorTestError(Exception):
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
48 pass
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
49
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 class ExtractorTest(object):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
52 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
53 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
54 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
55 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
56 for key in ('directory', 'prerun', 'posttest', 'baseline', 'error',
29
5fad99c17221 [svn] Add support for Ruby Gems, and extracting metadata from .deb/.gem files.
brett
parents: 28
diff changeset
57 'grep', 'antigrep', 'input', 'output', 'cleanup'):
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
58 setattr(self, key, kwargs.get(key, None))
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
59
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
60 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
61 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
62 output_buffer.flush()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
63 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
64 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
65 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
66 stdout=subprocess.PIPE)
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
67 process.wait()
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
68 output = process.stdout.read(-1)
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
69 process.stdout.close()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
70 return status, set(output.split('\n'))
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
71
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
72 def write_script(self, commands):
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
73 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
74 script.write("%s%s\n" % (SCRIPT_PROLOGUE, commands))
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
75 script.close()
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
76 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
77
30
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
78 def run_script(self, key):
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
79 commands = getattr(self, key)
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
80 if commands is not None:
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
81 if self.directory:
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
82 directory_hint = '../'
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
83 else:
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
84 directory_hint = ''
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
85 self.write_script(commands)
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
86 subprocess.call(['sh', TESTSCRIPT_NAME, directory_hint])
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
87
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
88 def get_shell_results(self):
30
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
89 self.run_script('prerun')
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
90 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
91 return self.get_results(['sh', TESTSCRIPT_NAME] + self.filenames)
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
92
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
93 def get_extractor_results(self):
30
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
94 self.run_script('prerun')
20
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
95 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
96 input_buffer.truncate()
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
97 if self.input:
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
98 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
99 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
100 input_buffer.write('\n')
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
101 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
102 input_buffer.flush()
69c93c3e6972 [svn] If the archive contains one directory with the "wrong" name, ask the user
brett
parents: 19
diff changeset
103 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
104 input_buffer)
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
105
7
1f3cb3845dfd [svn] Add a test for recursive extraction which also makes sure that we fix
brett
parents: 1
diff changeset
106 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
107 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
108 return 0
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
109 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
110 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
111
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
112 def clean(self):
30
1015bbd6dc5e [svn] If we can't figure out what the file is by mimetype, try using the file
brett
parents: 29
diff changeset
113 self.run_script('cleanup')
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
114 if self.directory:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
115 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
116 extra_options = ['!', '-name', TESTSCRIPT_NAME]
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
117 else:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
118 target = ROOT_DIR
38
f637b9d24c21 [svn] Some more tests to make sure we always do the right thing in the
brett
parents: 30
diff changeset
119 extra_options = ['(', '(', '-type', 'd',
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
120 '!', '-name', 'CVS',
38
f637b9d24c21 [svn] Some more tests to make sure we always do the right thing in the
brett
parents: 30
diff changeset
121 '!', '-name', '.svn', ')',
f637b9d24c21 [svn] Some more tests to make sure we always do the right thing in the
brett
parents: 30
diff changeset
122 '-or', '-name', 'test-text',
f637b9d24c21 [svn] Some more tests to make sure we always do the right thing in the
brett
parents: 30
diff changeset
123 '-or', '-name', 'test-onefile', ')']
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
124 status = subprocess.call(['find', target,
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
125 '-mindepth', '1', '-maxdepth', '1'] +
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
126 extra_options +
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
127 ['-exec', 'rm', '-rf', '{}', ';'])
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
128 if status != 0:
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
129 raise ExtractorTestError("cleanup exited with status code %s" %
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
130 (status,))
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
131
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
132 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
133 raw_status = status.lower()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
134 if raw_status != 'passed':
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
135 output_buffer.seek(0, 0)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
136 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
137 if message is None:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
138 last_part = ''
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
139 else:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
140 last_part = ': %s' % (message,)
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
141 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
142 return raw_status
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
143
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
144 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
145 posttest_result = self.get_posttest_result()
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
146 self.clean()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
147 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
148 self.clean()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
149 if expected != actual:
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
150 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
151 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
152 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
153 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
154 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
155 elif posttest_result != 0:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
156 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
157 return self.show_status('FAILED')
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
158 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
159
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
160 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
161 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
162 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
163 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
164 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
165 return None
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
166
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
167 def grep_output(self, output):
69
35a2f45cdd3b Count files in the archive and report that in the recursion prompt.
Brett Smith <brett@brettcsmith.org>
parents: 54
diff changeset
168 if self.grep and (not re.search(self.grep.replace(' ', '\\s+'),
35a2f45cdd3b Count files in the archive and report that in the recursion prompt.
Brett Smith <brett@brettcsmith.org>
parents: 54
diff changeset
169 output, re.MULTILINE)):
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
170 return "output did not match %s" % (self.grep)
69
35a2f45cdd3b Count files in the archive and report that in the recursion prompt.
Brett Smith <brett@brettcsmith.org>
parents: 54
diff changeset
171 elif self.antigrep and re.search(self.antigrep.replace(' ', '\\s+'),
35a2f45cdd3b Count files in the archive and report that in the recursion prompt.
Brett Smith <brett@brettcsmith.org>
parents: 54
diff changeset
172 output, re.MULTILINE):
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
173 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
174 return None
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
175
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
176 def check_output(self, output):
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
177 if ((self.output is not None) and
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
178 (self.output.strip() != output.strip())):
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
179 return "output did not match provided text"
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
180 return None
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
181
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
182 def check_results(self):
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
183 output_buffer.seek(0, 0)
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
184 output_buffer.truncate()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
185 self.clean()
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
186 status, actual = self.get_extractor_results()
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
187 output_buffer.seek(0, 0)
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
188 output_buffer.readline()
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
189 output = output_buffer.read(-1)
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
190 problem = (self.have_error_mismatch(status) or
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
191 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
192 if problem:
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
193 return self.show_status('FAILED', problem)
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
194 if self.baseline:
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
195 return self.compare_results(actual)
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
196 else:
50
71bdbc1148af [svn] Run the cleanup script after the test even if there's no more comparing to do.
brett
parents: 42
diff changeset
197 self.clean()
19
bb6e9f4af1a5 [svn] Rename the program to dtrx.
brett
parents: 17
diff changeset
198 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
199
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
200 def run(self):
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
201 if self.directory:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
202 os.mkdir(self.directory)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
203 os.chdir(self.directory)
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
204 try:
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
205 result = self.check_results()
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
206 except ExtractorTestError, error:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
207 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
208 if self.directory:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
209 os.chdir(ROOT_DIR)
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
210 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
211 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
212 return result
1
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
213
a86a0cb0dd57 [svn] Repository reorganization to make tags easy
brett
parents:
diff changeset
214
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
215 test_db = open('tests.yml')
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
216 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
217 test_db.close()
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
218 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
219 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
220 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
221 (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
222 continue
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
223 data = original_data.copy()
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
224 data['name'] += ' in ..'
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
225 data['directory'] = 'inside-dir'
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
226 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
227 data.get('filenames', '').split()])
14
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
228 tests.append(ExtractorTest(**data))
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
229 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
230 counts = {}
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
231 for outcome in OUTCOMES:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
232 counts[outcome] = 0
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
233 for result in results:
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
234 counts[result] += 1
6f9e1bb59719 [svn] Add support for just decompressing files that are compressed. So, if you
brett
parents: 10
diff changeset
235 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
236 input_buffer.close()
17
481a2b4be471 [svn] Lots of tests for various boundary cases, and slightly better handling for
brett
parents: 15
diff changeset
237 output_buffer.close()

mercurial