OLD | NEW |
| (Empty) |
1 # -*- test-case-name: buildbot.test.test_twisted -*- | |
2 | |
3 from twisted.trial import unittest | |
4 | |
5 from buildbot import interfaces | |
6 from buildbot.steps.python_twisted import countFailedTests | |
7 from buildbot.steps.python_twisted import Trial, TrialTestCaseCounter | |
8 from buildbot.status import builder | |
9 | |
10 noisy = 0 | |
11 if noisy: | |
12 from twisted.python.log import startLogging | |
13 import sys | |
14 startLogging(sys.stdout) | |
15 | |
16 out1 = """ | |
17 ------------------------------------------------------------------------------- | |
18 Ran 13 tests in 1.047s | |
19 | |
20 OK | |
21 """ | |
22 | |
23 out2 = """ | |
24 ------------------------------------------------------------------------------- | |
25 Ran 12 tests in 1.040s | |
26 | |
27 FAILED (failures=1) | |
28 """ | |
29 | |
30 out3 = """ | |
31 NotImplementedError | |
32 ------------------------------------------------------------------------------- | |
33 Ran 13 tests in 1.042s | |
34 | |
35 FAILED (failures=1, errors=1) | |
36 """ | |
37 | |
38 out4 = """ | |
39 unparseable | |
40 """ | |
41 | |
42 out5 = """ | |
43 File "/usr/home/warner/stuff/python/twisted/Twisted-CVS/twisted/test/test_def
er.py", line 79, in testTwoCallbacks | |
44 self.fail("just because") | |
45 File "/usr/home/warner/stuff/python/twisted/Twisted-CVS/twisted/trial/unittes
t.py", line 21, in fail | |
46 raise AssertionError, message | |
47 AssertionError: just because | |
48 unparseable | |
49 """ | |
50 | |
51 out6 = """ | |
52 =============================================================================== | |
53 SKIPPED: testProtocolLocalhost (twisted.flow.test.test_flow.FlowTest) | |
54 ------------------------------------------------------------------------------- | |
55 XXX freezes, fixme | |
56 =============================================================================== | |
57 SKIPPED: testIPv6 (twisted.names.test.test_names.HostsTestCase) | |
58 ------------------------------------------------------------------------------- | |
59 IPv6 support is not in our hosts resolver yet | |
60 =============================================================================== | |
61 EXPECTED FAILURE: testSlots (twisted.test.test_rebuild.NewStyleTestCase) | |
62 ------------------------------------------------------------------------------- | |
63 Traceback (most recent call last): | |
64 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unitt
est.py", line 240, in _runPhase | |
65 stage(*args, **kwargs) | |
66 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unitt
est.py", line 262, in _main | |
67 self.runner(self.method) | |
68 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/runne
r.py", line 95, in runTest | |
69 method() | |
70 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/test/test_r
ebuild.py", line 130, in testSlots | |
71 rebuild.updateInstance(self.m.SlottedClass()) | |
72 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/python/rebu
ild.py", line 114, in updateInstance | |
73 self.__class__ = latestClass(self.__class__) | |
74 TypeError: __class__ assignment: 'SlottedClass' object layout differs from 'Slot
tedClass' | |
75 =============================================================================== | |
76 FAILURE: testBatchFile (twisted.conch.test.test_sftp.TestOurServerBatchFile) | |
77 ------------------------------------------------------------------------------- | |
78 Traceback (most recent call last): | |
79 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unitt
est.py", line 240, in _runPhase | |
80 stage(*args, **kwargs) | |
81 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unitt
est.py", line 262, in _main | |
82 self.runner(self.method) | |
83 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/runne
r.py", line 95, in runTest | |
84 method() | |
85 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/conch/test/
test_sftp.py", line 450, in testBatchFile | |
86 self.failUnlessEqual(res[1:-2], ['testDirectory', 'testRemoveFile', 'testRen
ameFile', 'testfile1']) | |
87 File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unitt
est.py", line 115, in failUnlessEqual | |
88 raise FailTest, (msg or '%r != %r' % (first, second)) | |
89 FailTest: [] != ['testDirectory', 'testRemoveFile', 'testRenameFile', 'testfile1
'] | |
90 ------------------------------------------------------------------------------- | |
91 Ran 1454 tests in 911.579s | |
92 | |
93 FAILED (failures=2, skips=49, expectedFailures=9) | |
94 Exception exceptions.AttributeError: "'NoneType' object has no attribute 'String
IO'" in <bound method RemoteReference.__del__ of <twisted.spread.pb.RemoteRefere
nce instance at 0x27036c0>> ignored | |
95 """ | |
96 | |
97 class MyTrial(Trial): | |
98 def addTestResult(self, testname, results, text, logs): | |
99 self.results.append((testname, results, text, logs)) | |
100 def addCompleteLog(self, name, log): | |
101 pass | |
102 | |
103 class MyLogFile: | |
104 def __init__(self, text): | |
105 self.text = text | |
106 def getText(self): | |
107 return self.text | |
108 | |
109 | |
110 class Count(unittest.TestCase): | |
111 | |
112 def count(self, total, failures=0, errors=0, | |
113 expectedFailures=0, unexpectedSuccesses=0, skips=0): | |
114 d = { | |
115 'total': total, | |
116 'failures': failures, | |
117 'errors': errors, | |
118 'expectedFailures': expectedFailures, | |
119 'unexpectedSuccesses': unexpectedSuccesses, | |
120 'skips': skips, | |
121 } | |
122 return d | |
123 | |
124 def testCountFailedTests(self): | |
125 count = countFailedTests(out1) | |
126 self.assertEquals(count, self.count(total=13)) | |
127 count = countFailedTests(out2) | |
128 self.assertEquals(count, self.count(total=12, failures=1)) | |
129 count = countFailedTests(out3) | |
130 self.assertEquals(count, self.count(total=13, failures=1, errors=1)) | |
131 count = countFailedTests(out4) | |
132 self.assertEquals(count, self.count(total=None)) | |
133 count = countFailedTests(out5) | |
134 self.assertEquals(count, self.count(total=None)) | |
135 | |
136 class Counter(unittest.TestCase): | |
137 | |
138 def setProgress(self, metric, value): | |
139 self.progress = (metric, value) | |
140 | |
141 def testCounter(self): | |
142 self.progress = (None,None) | |
143 c = TrialTestCaseCounter() | |
144 c.setStep(self) | |
145 STDOUT = interfaces.LOG_CHANNEL_STDOUT | |
146 def add(text): | |
147 c.logChunk(None, None, None, STDOUT, text) | |
148 add("\n\n") | |
149 self.failUnlessEqual(self.progress, (None,None)) | |
150 add("bogus line\n") | |
151 self.failUnlessEqual(self.progress, (None,None)) | |
152 add("buildbot.test.test_config.ConfigTest.testBots ... [OK]\n") | |
153 self.failUnlessEqual(self.progress, ("tests", 1)) | |
154 add("buildbot.test.test_config.ConfigTest.tes") | |
155 self.failUnlessEqual(self.progress, ("tests", 1)) | |
156 add("tBuilders ... [OK]\n") | |
157 self.failUnlessEqual(self.progress, ("tests", 2)) | |
158 # confirm alternative delimiters work too.. ptys seem to emit | |
159 # something different | |
160 add("buildbot.test.test_config.ConfigTest.testIRC ... [OK]\r\n") | |
161 self.failUnlessEqual(self.progress, ("tests", 3)) | |
162 add("===================================================================
============\n") | |
163 self.failUnlessEqual(self.progress, ("tests", 3)) | |
164 add("buildbot.test.test_config.IOnlyLookLikeA.testLine ... [OK]\n") | |
165 self.failUnlessEqual(self.progress, ("tests", 3)) | |
166 | |
167 | |
168 | |
169 class Parse(unittest.TestCase): | |
170 def failUnlessIn(self, substr, string): | |
171 self.failUnless(string.find(substr) != -1) | |
172 | |
173 def testParse(self): | |
174 t = MyTrial(build=None, workdir=".", testpath=None, testChanges=True) | |
175 t.results = [] | |
176 log = MyLogFile(out6) | |
177 t.createSummary(log) | |
178 | |
179 self.failUnlessEqual(len(t.results), 4) | |
180 r1, r2, r3, r4 = t.results | |
181 testname, results, text, logs = r1 | |
182 self.failUnlessEqual(testname, | |
183 ("twisted", "flow", "test", "test_flow", | |
184 "FlowTest", "testProtocolLocalhost")) | |
185 self.failUnlessEqual(results, builder.SKIPPED) | |
186 self.failUnlessEqual(text, ['skipped']) | |
187 self.failUnlessIn("XXX freezes, fixme", logs) | |
188 self.failUnless(logs.startswith("SKIPPED:")) | |
189 self.failUnless(logs.endswith("fixme\n")) | |
190 | |
191 testname, results, text, logs = r2 | |
192 self.failUnlessEqual(testname, | |
193 ("twisted", "names", "test", "test_names", | |
194 "HostsTestCase", "testIPv6")) | |
195 self.failUnlessEqual(results, builder.SKIPPED) | |
196 self.failUnlessEqual(text, ['skipped']) | |
197 self.failUnless(logs.startswith("SKIPPED: testIPv6")) | |
198 self.failUnless(logs.endswith("IPv6 support is not in our hosts resolver
yet\n")) | |
199 | |
200 testname, results, text, logs = r3 | |
201 self.failUnlessEqual(testname, | |
202 ("twisted", "test", "test_rebuild", | |
203 "NewStyleTestCase", "testSlots")) | |
204 self.failUnlessEqual(results, builder.SUCCESS) | |
205 self.failUnlessEqual(text, ['expected', 'failure']) | |
206 self.failUnless(logs.startswith("EXPECTED FAILURE: ")) | |
207 self.failUnlessIn("\nTraceback ", logs) | |
208 self.failUnless(logs.endswith("layout differs from 'SlottedClass'\n")) | |
209 | |
210 testname, results, text, logs = r4 | |
211 self.failUnlessEqual(testname, | |
212 ("twisted", "conch", "test", "test_sftp", | |
213 "TestOurServerBatchFile", "testBatchFile")) | |
214 self.failUnlessEqual(results, builder.FAILURE) | |
215 self.failUnlessEqual(text, ['failure']) | |
216 self.failUnless(logs.startswith("FAILURE: ")) | |
217 self.failUnlessIn("Traceback ", logs) | |
218 self.failUnless(logs.endswith("'testRenameFile', 'testfile1']\n")) | |
219 | |
OLD | NEW |