Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/buildbot/buildbot/test/test_twisted.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildbot/buildbot/test/test_twisted.py')
-rw-r--r--buildbot/buildbot/test/test_twisted.py219
1 files changed, 219 insertions, 0 deletions
diff --git a/buildbot/buildbot/test/test_twisted.py b/buildbot/buildbot/test/test_twisted.py
new file mode 100644
index 0000000..7b4f9bf
--- /dev/null
+++ b/buildbot/buildbot/test/test_twisted.py
@@ -0,0 +1,219 @@
+# -*- test-case-name: buildbot.test.test_twisted -*-
+
+from twisted.trial import unittest
+
+from buildbot import interfaces
+from buildbot.steps.python_twisted import countFailedTests
+from buildbot.steps.python_twisted import Trial, TrialTestCaseCounter
+from buildbot.status import builder
+
+noisy = 0
+if noisy:
+ from twisted.python.log import startLogging
+ import sys
+ startLogging(sys.stdout)
+
+out1 = """
+-------------------------------------------------------------------------------
+Ran 13 tests in 1.047s
+
+OK
+"""
+
+out2 = """
+-------------------------------------------------------------------------------
+Ran 12 tests in 1.040s
+
+FAILED (failures=1)
+"""
+
+out3 = """
+ NotImplementedError
+-------------------------------------------------------------------------------
+Ran 13 tests in 1.042s
+
+FAILED (failures=1, errors=1)
+"""
+
+out4 = """
+unparseable
+"""
+
+out5 = """
+ File "/usr/home/warner/stuff/python/twisted/Twisted-CVS/twisted/test/test_defer.py", line 79, in testTwoCallbacks
+ self.fail("just because")
+ File "/usr/home/warner/stuff/python/twisted/Twisted-CVS/twisted/trial/unittest.py", line 21, in fail
+ raise AssertionError, message
+ AssertionError: just because
+unparseable
+"""
+
+out6 = """
+===============================================================================
+SKIPPED: testProtocolLocalhost (twisted.flow.test.test_flow.FlowTest)
+-------------------------------------------------------------------------------
+XXX freezes, fixme
+===============================================================================
+SKIPPED: testIPv6 (twisted.names.test.test_names.HostsTestCase)
+-------------------------------------------------------------------------------
+IPv6 support is not in our hosts resolver yet
+===============================================================================
+EXPECTED FAILURE: testSlots (twisted.test.test_rebuild.NewStyleTestCase)
+-------------------------------------------------------------------------------
+Traceback (most recent call last):
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unittest.py", line 240, in _runPhase
+ stage(*args, **kwargs)
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unittest.py", line 262, in _main
+ self.runner(self.method)
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/runner.py", line 95, in runTest
+ method()
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/test/test_rebuild.py", line 130, in testSlots
+ rebuild.updateInstance(self.m.SlottedClass())
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/python/rebuild.py", line 114, in updateInstance
+ self.__class__ = latestClass(self.__class__)
+TypeError: __class__ assignment: 'SlottedClass' object layout differs from 'SlottedClass'
+===============================================================================
+FAILURE: testBatchFile (twisted.conch.test.test_sftp.TestOurServerBatchFile)
+-------------------------------------------------------------------------------
+Traceback (most recent call last):
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unittest.py", line 240, in _runPhase
+ stage(*args, **kwargs)
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unittest.py", line 262, in _main
+ self.runner(self.method)
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/runner.py", line 95, in runTest
+ method()
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/conch/test/test_sftp.py", line 450, in testBatchFile
+ self.failUnlessEqual(res[1:-2], ['testDirectory', 'testRemoveFile', 'testRenameFile', 'testfile1'])
+ File "/Users/buildbot/Buildbot/twisted/OSX-full2.3/Twisted/twisted/trial/unittest.py", line 115, in failUnlessEqual
+ raise FailTest, (msg or '%r != %r' % (first, second))
+FailTest: [] != ['testDirectory', 'testRemoveFile', 'testRenameFile', 'testfile1']
+-------------------------------------------------------------------------------
+Ran 1454 tests in 911.579s
+
+FAILED (failures=2, skips=49, expectedFailures=9)
+Exception exceptions.AttributeError: "'NoneType' object has no attribute 'StringIO'" in <bound method RemoteReference.__del__ of <twisted.spread.pb.RemoteReference instance at 0x27036c0>> ignored
+"""
+
+class MyTrial(Trial):
+ def addTestResult(self, testname, results, text, logs):
+ self.results.append((testname, results, text, logs))
+ def addCompleteLog(self, name, log):
+ pass
+
+class MyLogFile:
+ def __init__(self, text):
+ self.text = text
+ def getText(self):
+ return self.text
+
+
+class Count(unittest.TestCase):
+
+ def count(self, total, failures=0, errors=0,
+ expectedFailures=0, unexpectedSuccesses=0, skips=0):
+ d = {
+ 'total': total,
+ 'failures': failures,
+ 'errors': errors,
+ 'expectedFailures': expectedFailures,
+ 'unexpectedSuccesses': unexpectedSuccesses,
+ 'skips': skips,
+ }
+ return d
+
+ def testCountFailedTests(self):
+ count = countFailedTests(out1)
+ self.assertEquals(count, self.count(total=13))
+ count = countFailedTests(out2)
+ self.assertEquals(count, self.count(total=12, failures=1))
+ count = countFailedTests(out3)
+ self.assertEquals(count, self.count(total=13, failures=1, errors=1))
+ count = countFailedTests(out4)
+ self.assertEquals(count, self.count(total=None))
+ count = countFailedTests(out5)
+ self.assertEquals(count, self.count(total=None))
+
+class Counter(unittest.TestCase):
+
+ def setProgress(self, metric, value):
+ self.progress = (metric, value)
+
+ def testCounter(self):
+ self.progress = (None,None)
+ c = TrialTestCaseCounter()
+ c.setStep(self)
+ STDOUT = interfaces.LOG_CHANNEL_STDOUT
+ def add(text):
+ c.logChunk(None, None, None, STDOUT, text)
+ add("\n\n")
+ self.failUnlessEqual(self.progress, (None,None))
+ add("bogus line\n")
+ self.failUnlessEqual(self.progress, (None,None))
+ add("buildbot.test.test_config.ConfigTest.testBots ... [OK]\n")
+ self.failUnlessEqual(self.progress, ("tests", 1))
+ add("buildbot.test.test_config.ConfigTest.tes")
+ self.failUnlessEqual(self.progress, ("tests", 1))
+ add("tBuilders ... [OK]\n")
+ self.failUnlessEqual(self.progress, ("tests", 2))
+ # confirm alternative delimiters work too.. ptys seem to emit
+ # something different
+ add("buildbot.test.test_config.ConfigTest.testIRC ... [OK]\r\n")
+ self.failUnlessEqual(self.progress, ("tests", 3))
+ add("===============================================================================\n")
+ self.failUnlessEqual(self.progress, ("tests", 3))
+ add("buildbot.test.test_config.IOnlyLookLikeA.testLine ... [OK]\n")
+ self.failUnlessEqual(self.progress, ("tests", 3))
+
+
+
+class Parse(unittest.TestCase):
+ def failUnlessIn(self, substr, string):
+ self.failUnless(string.find(substr) != -1)
+
+ def testParse(self):
+ t = MyTrial(build=None, workdir=".", testpath=None, testChanges=True)
+ t.results = []
+ log = MyLogFile(out6)
+ t.createSummary(log)
+
+ self.failUnlessEqual(len(t.results), 4)
+ r1, r2, r3, r4 = t.results
+ testname, results, text, logs = r1
+ self.failUnlessEqual(testname,
+ ("twisted", "flow", "test", "test_flow",
+ "FlowTest", "testProtocolLocalhost"))
+ self.failUnlessEqual(results, builder.SKIPPED)
+ self.failUnlessEqual(text, ['skipped'])
+ self.failUnlessIn("XXX freezes, fixme", logs)
+ self.failUnless(logs.startswith("SKIPPED:"))
+ self.failUnless(logs.endswith("fixme\n"))
+
+ testname, results, text, logs = r2
+ self.failUnlessEqual(testname,
+ ("twisted", "names", "test", "test_names",
+ "HostsTestCase", "testIPv6"))
+ self.failUnlessEqual(results, builder.SKIPPED)
+ self.failUnlessEqual(text, ['skipped'])
+ self.failUnless(logs.startswith("SKIPPED: testIPv6"))
+ self.failUnless(logs.endswith("IPv6 support is not in our hosts resolver yet\n"))
+
+ testname, results, text, logs = r3
+ self.failUnlessEqual(testname,
+ ("twisted", "test", "test_rebuild",
+ "NewStyleTestCase", "testSlots"))
+ self.failUnlessEqual(results, builder.SUCCESS)
+ self.failUnlessEqual(text, ['expected', 'failure'])
+ self.failUnless(logs.startswith("EXPECTED FAILURE: "))
+ self.failUnlessIn("\nTraceback ", logs)
+ self.failUnless(logs.endswith("layout differs from 'SlottedClass'\n"))
+
+ testname, results, text, logs = r4
+ self.failUnlessEqual(testname,
+ ("twisted", "conch", "test", "test_sftp",
+ "TestOurServerBatchFile", "testBatchFile"))
+ self.failUnlessEqual(results, builder.FAILURE)
+ self.failUnlessEqual(text, ['failure'])
+ self.failUnless(logs.startswith("FAILURE: "))
+ self.failUnlessIn("Traceback ", logs)
+ self.failUnless(logs.endswith("'testRenameFile', 'testfile1']\n"))
+