~vcs-imports/samba/main

« back to all changes in this revision

Viewing changes to source/stf/spoolss.py

  • Committer: jerry
  • Date: 2006-07-14 21:48:39 UTC
  • Revision ID: vcs-imports@canonical.com-20060714214839-586d8c489a8fcead
gutting trunk to move to svn:externals

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
 
 
3
 
import re
4
 
import comfychair, stf
5
 
from samba import spoolss
6
 
 
7
 
class PrintServerTest(comfychair.TestCase):
8
 
    """An abstract class requiring a print server."""
9
 
    def setUp(self):
10
 
        # TODO: create a test printer
11
 
        self.server = stf.get_server(platform = "nt")
12
 
        self.require(self.server != None, "print server required")
13
 
        # TODO: remove hardcoded printer name
14
 
        self.printername = "p"
15
 
        self.uncname = "\\\\%s\\%s" % \
16
 
                           (self.server["hostname"], self.printername)
17
 
 
18
 
class W2kPrintServerTest(comfychair.TestCase):
19
 
    """An abstract class requiring a print server."""
20
 
    def setUp(self):
21
 
        # TODO: create a test printer
22
 
        self.server = stf.get_server(platform = "nt5")
23
 
        self.require(self.server != None, "print server required")
24
 
        # TODO: remove hardcoded printer name
25
 
        self.printername = "p"
26
 
        self.uncname = "\\\\%s\\%s" % \
27
 
                           (self.server["hostname"], self.printername)
28
 
 
29
 
class CredentialTest(PrintServerTest):
30
 
    """An class that calls a function with various sets of credentials."""
31
 
    def runTest(self):
32
 
 
33
 
        bad_user_creds = {"username": "spotty",
34
 
                          "domain": "dog",
35
 
                          "password": "bone"}
36
 
                        
37
 
        cases = ((self.server["administrator"], "Admin credentials", 1),
38
 
                 (bad_user_creds,               "Bad credentials",   0))
39
 
 
40
 
        # TODO: add unpriv user case
41
 
 
42
 
        for creds, testname, result in cases:
43
 
            try:
44
 
                self.runTestArg(creds)
45
 
            except:
46
 
                if result:
47
 
                    import traceback
48
 
                    traceback.print_exc()
49
 
                    self.fail("rpc with creds %s failed when it "
50
 
                              "should have suceeded" % creds)
51
 
                return
52
 
 
53
 
            if not result:
54
 
                self.fail("rpc with creds %s suceeded when it should "
55
 
                          "have failed" % creds)
56
 
        
57
 
class ArgTestServer(PrintServerTest):
58
 
    """Test a RPC that takes a UNC print server name."""
59
 
    def runTest(self):
60
 
 
61
 
        # List of test cases, %s substituted for server name
62
 
 
63
 
        cases = (("",             "No server name",          0),
64
 
                 ("\\\\%s",       "Valid server name",       1),
65
 
                 ("\\%s",         "Invalid unc server name", 0),
66
 
                 ("\\\\%s__",     "Invalid unc server name", 0))
67
 
 
68
 
        for unc, testname, result in cases:
69
 
            unc = re.sub("%s", self.server["hostname"], unc)
70
 
            try:
71
 
                self.runTestArg(unc)
72
 
            except:
73
 
                if result:
74
 
                    self.fail("rpc(\"%s\") failed when it should have "
75
 
                              "suceeded" % unc)
76
 
                return
77
 
 
78
 
            if not result:
79
 
                # Suceeded when we should have failed
80
 
                self.fail("rpc(\"%s\") suceeded when it should have "
81
 
                          "failed" % unc)
82
 
 
83
 
class ArgTestServerAndPrinter(ArgTestServer):
84
 
    """Test a RPC that takes a UNC print server or UNC printer name."""
85
 
    def runTest(self):
86
 
 
87
 
        ArgTestServer.runTest(self)
88
 
        
89
 
        # List of test cases, %s substituted for server name, %p substituted
90
 
        # for printer name.
91
 
 
92
 
        cases = (("\\\\%s\\%p",   "Valid server and printer name",      1),
93
 
                 ("\\\\%s\\%p__", "Valid server, invalid printer name", 0),
94
 
                 ("\\\\%s__\\%p", "Invalid server, valid printer name", 0))
95
 
 
96
 
        for unc, testname, result in cases:
97
 
            unc = re.sub("%s", self.server["hostname"], unc)
98
 
            unc = re.sub("%p", self.printername, unc)
99
 
            try:
100
 
                self.runTestArg(unc)
101
 
            except:
102
 
                if result:
103
 
                    self.fail("openprinter(\"%s\") failed when it should have "
104
 
                              "suceeded" % unc)
105
 
                return
106
 
 
107
 
            if not result:
108
 
                # Suceeded when we should have failed
109
 
                self.fail("openprinter(\"%s\") suceeded when it should have "
110
 
                          "failed" % unc)
111
 
 
112
 
class OpenPrinterArg(ArgTestServerAndPrinter):
113
 
    """Test the OpenPrinter RPC with combinations of valid and invalid
114
 
    server and printer names."""
115
 
    def runTestArg(self, unc):
116
 
        spoolss.openprinter(unc)
117
 
 
118
 
class OpenPrinterCred(CredentialTest):
119
 
    """Test opening printer with good and bad credentials."""
120
 
    def runTestArg(self, creds):
121
 
        spoolss.openprinter(self.uncname, creds = creds)
122
 
 
123
 
class ClosePrinter(PrintServerTest):
124
 
    """Test the ClosePrinter RPC on a printer handle."""
125
 
    def runTest(self):
126
 
        hnd = spoolss.openprinter(self.uncname)
127
 
        spoolss.closeprinter(hnd)
128
 
        
129
 
class ClosePrinterServer(PrintServerTest):
130
 
    """Test the ClosePrinter RPC on a print server handle."""
131
 
    def runTest(self):
132
 
        hnd = spoolss.openprinter("\\\\%s" % self.server["hostname"])
133
 
        spoolss.closeprinter(hnd)
134
 
        
135
 
class GetPrinterInfo(PrintServerTest):
136
 
    """Retrieve printer info at various levels."""
137
 
 
138
 
    # Sample printer data
139
 
 
140
 
    sample_info = {
141
 
        0: {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '\\\\win2kdc1', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': 1114112, 'name': '\\\\win2kdc1\\p', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 2, 'status': 1, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0},
142
 
        1: {'comment': "I'm a teapot!", 'level': 1, 'flags': 8388608, 'name': '\\\\win2kdc1\\p', 'description': '\\\\win2kdc1\\p,HP LaserJet 4,Canberra office'},
143
 
        2: {'comment': "I'm a teapot!", 'status': 1, 'print_processor': 'WinPrint', 'until_time': 0, 'share_name': 'p', 'start_time': 0, 'device_mode': {'icm_method': 1, 'bits_per_pel': 0, 'log_pixels': 0, 'orientation': 1, 'panning_width': 0, 'color': 2, 'pels_width': 0, 'print_quality': 600, 'driver_version': 24, 'display_flags': 0, 'y_resolution': 600, 'media_type': 0, 'display_frequency': 0, 'icm_intent': 0, 'pels_height': 0, 'reserved1': 0, 'size': 220, 'scale': 100, 'dither_type': 0, 'panning_height': 0, 'default_source': 7, 'duplex': 1, 'fields': 16131, 'spec_version': 1025, 'copies': 1, 'device_name': '\\\\win2kdc1\\p', 'paper_size': 1, 'paper_length': 0, 'private': 'private', 'collate': 0, 'paper_width': 0, 'form_name': 'Letter', 'reserved2': 0, 'tt_option': 0}, 'port_name': 'LPT1:', 'sepfile': '', 'parameters': '', 'security_descriptor': {'group_sid': 'S-1-5-21-1606980848-1677128483-854245398-513', 'sacl': None, 'dacl': {'ace_list': [{'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-544'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-544'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1121'}, {'flags': 10, 'type': 0, 'mask': 131072, 'trustee': 'S-1-3-0'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-3-0'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1124'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-1-0'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-550'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-550'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-549'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-549'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1106'}], 'revision': 2}, 'owner_sid': 'S-1-5-32-544', 'revision': 1}, 'name': '\\\\win2kdc1\\p', 'server_name': '\\\\win2kdc1', 'level': 2, 'datatype': 'RAW', 'cjobs': 0, 'average_ppm': 0, 'priority': 1, 'driver_name': 'HP LaserJet 4', 'location': 'Canberra office', 'attributes': 8776, 'default_priority': 0},
144
 
        3: {'flags': 4, 'security_descriptor': {'group_sid': 'S-1-5-21-1606980848-1677128483-854245398-513', 'sacl': None, 'dacl': {'ace_list': [{'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-544'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-544'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1121'}, {'flags': 10, 'type': 0, 'mask': 131072, 'trustee': 'S-1-3-0'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-3-0'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1124'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-1-0'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-550'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-550'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-549'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-549'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1106'}], 'revision': 2}, 'owner_sid': 'S-1-5-32-544', 'revision': 1}, 'level': 3}
145
 
        }
146
 
 
147
 
    def runTest(self):
148
 
        self.hnd = spoolss.openprinter(self.uncname)
149
 
 
150
 
        # Everyone should have getprinter levels 0-3
151
 
 
152
 
        for i in (0, 1, 2, 3):
153
 
            info = self.hnd.getprinter(level = i)
154
 
            try:
155
 
                stf.dict_check(self.sample_info[i], info)
156
 
            except ValueError, msg:
157
 
                raise "info%d: %s" % (i, msg)
158
 
 
159
 
class EnumPrinters(PrintServerTest):
160
 
    """Enumerate print info at various levels."""
161
 
 
162
 
    sample_info = {
163
 
 
164
 
        0: {'q': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': -1833435136, 'name': 'q', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 0, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, 'p': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': -1831337984, 'name': 'p', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 1, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, 'magpie': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': 1114112, 'name': 'magpie', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 0, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}},
165
 
 
166
 
        1: {'q': {'comment': 'cheepy birds', 'level': 1, 'flags': 8388608, 'name': 'q', 'description': 'q,HP LaserJet 4,'}, 'p': {'comment': "I'm a teapot!", 'level': 1, 'flags': 8388608, 'name': 'p', 'description': 'p,HP LaserJet 4,Canberra office'}, 'magpie': {'comment': '', 'level': 1, 'flags': 8388608, 'name': 'magpie', 'description': 'magpie,Generic / Text Only,'}}
167
 
        }
168
 
 
169
 
    def runTest(self):
170
 
        for i in (0, 1):
171
 
            info = spoolss.enumprinters(
172
 
                "\\\\%s" % self.server["hostname"], level = i)
173
 
            try:
174
 
                stf.dict_check(self.sample_info[i], info)
175
 
            except ValueError, msg:
176
 
                raise "info%d: %s" % (i, msg)
177
 
 
178
 
class EnumPrintersArg(ArgTestServer):
179
 
    def runTestArg(self, unc):
180
 
        spoolss.enumprinters(unc)
181
 
 
182
 
class EnumPrintersCred(CredentialTest):
183
 
    """Test opening printer with good and bad credentials."""
184
 
    def runTestArg(self, creds):
185
 
        spoolss.enumprinters(
186
 
            "\\\\%s" % self.server["hostname"], creds = creds)
187
 
 
188
 
class EnumPrinterdrivers(PrintServerTest):
189
 
 
190
 
    sample_info = {
191
 
        1: {'Okipage 10ex (PCL5E) : STANDARD': {'name': 'Okipage 10ex (PCL5E) : STANDARD', 'level': 1}, 'Generic / Text Only': {'name': 'Generic / Text Only', 'level': 1}, 'Brother HL-1030 series': {'name': 'Brother HL-1030 series', 'level': 1}, 'Brother HL-1240 series': {'name': 'Brother HL-1240 series', 'level': 1}, 'HP DeskJet 1220C Printer': {'name': 'HP DeskJet 1220C Printer', 'level': 1}, 'HP LaserJet 4100 PCL 6': {'name': 'HP LaserJet 4100 PCL 6', 'level': 1}, 'HP LaserJet 4': {'name': 'HP LaserJet 4', 'level': 1}},
192
 
        2: {'Okipage 10ex (PCL5E) : STANDARD': {'version': 2, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\RASDDUI.DLL', 'name': 'Okipage 10ex (PCL5E) : STANDARD', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\2\\RASDD.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\OKIPAGE.DLL', 'level': 2, 'architecture': 'Windows NT x86'}, 'Generic / Text Only': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\UNIDRVUI.DLL', 'name': 'Generic / Text Only', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\UNIDRV.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\TTY.GPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'Brother HL-1030 series': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BRUHL99A.DLL', 'name': 'Brother HL-1030 series', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL99A.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL103.PPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'Brother HL-1240 series': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BRUHL99A.DLL', 'name': 'Brother HL-1240 series', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL99A.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL124.PPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP DeskJet 1220C Printer': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'name': 'HP DeskJet 1220C Printer', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP LaserJet 4100 PCL 6': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042E.DLL', 'name': 'HP LaserJet 4100 PCL 6', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042G.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042I.PMD', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP LaserJet 4': {'version': 2, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff0.dll', 'name': 'HP LaserJet 4', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff2.dll', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff39.pmd', 'level': 2, 'architecture': 'Windows NT x86'}}
193
 
        }
194
 
 
195
 
    def runTest(self):
196
 
        for i in (1, 2):
197
 
            info = spoolss.enumprinterdrivers(
198
 
                "\\\\%s" % self.server["hostname"], level = i)
199
 
            try:
200
 
                if not self.sample_info.has_key(i):
201
 
                    self.log("%s" % info)
202
 
                    self.fail()
203
 
                stf.dict_check(self.sample_info[i], info)
204
 
            except ValueError, msg:
205
 
                raise "info%d: %s" % (i, msg)
206
 
 
207
 
class EnumPrinterdriversArg(ArgTestServer):
208
 
    def runTestArg(self, unc):
209
 
        spoolss.enumprinterdrivers(unc)
210
 
 
211
 
class EnumPrinterdriversCred(CredentialTest):
212
 
    """Test opening printer with good and bad credentials."""
213
 
    def runTestArg(self, creds):
214
 
        spoolss.enumprinterdrivers(
215
 
            "\\\\%s" % self.server["hostname"], creds = creds)
216
 
 
217
 
def usage():
218
 
    print "Usage: spoolss.py [options] [test1[,test2...]]"
219
 
    print "\t -v/--verbose     Display debugging information"
220
 
    print "\t -l/--list-tests  List available tests"
221
 
    print
222
 
    print "A list of comma separated test names or regular expressions"
223
 
    print "can be used to filter the tests performed."
224
 
            
225
 
def test_match(subtest_list, test_name):
226
 
    """Return true if a test matches a comma separated list of regular
227
 
    expression of test names."""
228
 
    # re.match does an implicit ^ at the start of the pattern.
229
 
    # Explicitly anchor to end to avoid matching substrings.
230
 
    for s in string.split(subtest_list, ","):
231
 
        if re.match(s + "$", test_name):
232
 
            return 1
233
 
    return 0
234
 
           
235
 
if __name__ == "__main__":
236
 
    import os, sys, string
237
 
    import getopt
238
 
    
239
 
    try:
240
 
        opts, args = getopt.getopt(sys.argv[1:], "vl", \
241
 
                                   ["verbose", "list-tests"])
242
 
    except getopt.GetoptError:
243
 
        usage()
244
 
        sys.exit(0)
245
 
 
246
 
    verbose = 0
247
 
    list_tests = 0
248
 
 
249
 
    for opt, arg in opts:
250
 
        if opt in ("-v", "--verbose"):
251
 
            verbose = 1
252
 
        if opt in ("-l", "--list-tests"):
253
 
            list_tests = 1
254
 
 
255
 
    if len(args) > 1:
256
 
        usage()
257
 
        sys.exit(0)
258
 
 
259
 
    test_list = [
260
 
        OpenPrinterArg,
261
 
        OpenPrinterCred,
262
 
        ClosePrinter,
263
 
        ClosePrinterServer,
264
 
        GetPrinterInfo,
265
 
        EnumPrinters,
266
 
        EnumPrintersCred,
267
 
        EnumPrintersArg,
268
 
        EnumPrinterdrivers,
269
 
        EnumPrinterdriversCred,
270
 
        EnumPrinterdriversArg,
271
 
        ]
272
 
 
273
 
    if len(args):
274
 
        t = []
275
 
        for test in test_list:
276
 
            if test_match(args[0], test.__name__):
277
 
                t.append(test)
278
 
        test_list = t
279
 
 
280
 
    if os.environ.has_key("SAMBA_DEBUG"):
281
 
        spoolss.setup_logging(interactive = 1)
282
 
        spoolss.set_debuglevel(10)
283
 
 
284
 
    if list_tests:
285
 
        for test in test_list:
286
 
            print test.__name__
287
 
    else:
288
 
        comfychair.runtests(test_list, verbose = verbose)