| OLD | NEW |
| (Empty) |
| 1 # -*- test-case-name: buildbot.test.test_console -*- | |
| 2 | |
| 3 from twisted.trial import unittest | |
| 4 | |
| 5 from buildbot.status import builder | |
| 6 from buildbot.status.web import console | |
| 7 from buildbot.test.runutils import RunMixin | |
| 8 from buildbot.changes import changes | |
| 9 | |
| 10 try: | |
| 11 reversed | |
| 12 except NameError: | |
| 13 def reversed(data): | |
| 14 for index in xrange(len(data)-1,-1,-1): | |
| 15 yield data[index] | |
| 16 | |
| 17 # Configuration to be used by the getBuildDetailsTest | |
| 18 run_config = """ | |
| 19 from buildbot.process import factory | |
| 20 from buildbot.steps.shell import ShellCommand, WithProperties | |
| 21 from buildbot.buildslave import BuildSlave | |
| 22 from buildbot.config import BuilderConfig | |
| 23 s = factory.s | |
| 24 | |
| 25 BuildmasterConfig = c = {} | |
| 26 c['slaves'] = [BuildSlave('bot1', 'sekrit', properties={'slprop':'slprop'})] | |
| 27 c['schedulers'] = [] | |
| 28 c['slavePortnum'] = 0 | |
| 29 c['properties'] = { 'global' : 'global' } | |
| 30 | |
| 31 f1 = factory.BuildFactory([s(ShellCommand, flunkOnFailure=True, | |
| 32 command=['ls'], | |
| 33 workdir='.', timeout=10)]) | |
| 34 | |
| 35 f2 = factory.BuildFactory([s(ShellCommand, flunkOnFailure=True, | |
| 36 command=['ls -WillFail'], | |
| 37 workdir='.', timeout=10)]) | |
| 38 | |
| 39 b1 = BuilderConfig(name='full1', slavename='bot1', builddir='bd1', factory=f1) | |
| 40 b2 = BuilderConfig(name='full2', slavename='bot1', builddir='bd2', factory=f2) | |
| 41 c['builders'] = [b1, b2] | |
| 42 """ | |
| 43 | |
| 44 | |
| 45 # Tests for the global functions in console.py | |
| 46 class ConsoleTest(unittest.TestCase): | |
| 47 # Test for console.getResultsClass | |
| 48 def testgetResultsClass(self): | |
| 49 self.assertEqual(console.getResultsClass(None, None, True), "running") | |
| 50 self.assertEqual(console.getResultsClass(None, builder.SUCCESS, False),
"notstarted") | |
| 51 self.assertEqual(console.getResultsClass(builder.SUCCESS, builder.SUCCES
S, False), "success") | |
| 52 self.assertEqual(console.getResultsClass(builder.SUCCESS, builder.FAILUR
E, False), "success") | |
| 53 self.assertEqual(console.getResultsClass(builder.FAILURE, builder.FAILUR
E, False), "warnings") | |
| 54 self.assertEqual(console.getResultsClass(builder.FAILURE, builder.SUCCES
S, False), "failure") | |
| 55 self.assertEqual(console.getResultsClass(builder.FAILURE, None, False),
"failure") | |
| 56 self.assertEqual(console.getResultsClass(builder.FAILURE, builder.EXCEPT
ION, False), "failure") | |
| 57 self.assertEqual(console.getResultsClass(builder.FAILURE, builder.FAILUR
E, True), "running") | |
| 58 self.assertEqual(console.getResultsClass(builder.EXCEPTION, builder.FAIL
URE, False), "exception") | |
| 59 | |
| 60 def _createDummyChange(revision): | |
| 61 return changes.Change('Committer', ['files'], 'comment', revision=revision) | |
| 62 | |
| 63 class TimeRevisionComparatorTest(unittest.TestCase): | |
| 64 def setUp(self): | |
| 65 self.comparator = console.TimeRevisionComparator() | |
| 66 | |
| 67 def testSameRevisionIsNotGreater(self): | |
| 68 change = _createDummyChange('abcdef') | |
| 69 self.assertFalse(self.comparator.isRevisionEarlier(change, change)) | |
| 70 | |
| 71 def testOrdersDifferentRevisions(self): | |
| 72 first = _createDummyChange('first_rev') | |
| 73 second = _createDummyChange('second_rev') | |
| 74 | |
| 75 second.when += 1 # Make sure it's "after" the first | |
| 76 self.assertTrue(self.comparator.isRevisionEarlier(first, second)) | |
| 77 self.assertFalse(self.comparator.isRevisionEarlier(second, first)) | |
| 78 | |
| 79 def testReturnedKeySortsRevisionsCorrectly(self): | |
| 80 my_changes = [_createDummyChange('rev' + str(i)) | |
| 81 for i in range(1, 6)] | |
| 82 for i in range(1, len(my_changes)): | |
| 83 my_changes[i].when = my_changes[i-1].when + 1 | |
| 84 | |
| 85 reversed_changes = list(reversed(my_changes)) | |
| 86 reversed_changes.sort(lambda a,b: cmp(getattr(a, self.comparator.getSort
ingKey()), getattr(b, self.comparator.getSortingKey()))) | |
| 87 self.assertEqual(my_changes, reversed_changes) | |
| 88 | |
| 89 class IntegerRevisionComparatorTest(unittest.TestCase): | |
| 90 def setUp(self): | |
| 91 self.comparator = console.IntegerRevisionComparator() | |
| 92 | |
| 93 def testSameRevisionIsNotGreater(self): | |
| 94 change = _createDummyChange('1') | |
| 95 self.assertFalse(self.comparator.isRevisionEarlier(change, change)) | |
| 96 | |
| 97 def testOrdersDifferentRevisions(self): | |
| 98 first = _createDummyChange('1') | |
| 99 second = _createDummyChange('2') | |
| 100 | |
| 101 self.assertTrue(self.comparator.isRevisionEarlier(first, second)) | |
| 102 self.assertFalse(self.comparator.isRevisionEarlier(second, first)) | |
| 103 | |
| 104 def testIsValidRevisionAcceptsIntegers(self): | |
| 105 for rev in range(100): | |
| 106 self.assertTrue(self.comparator.isValidRevision(str(rev))) | |
| 107 | |
| 108 def testIsValidRevisionDoesNotAcceptNonIntegers(self): | |
| 109 self.assertFalse(self.comparator.isValidRevision('revision')) | |
| 110 | |
| 111 def testReturnedKeySortsRevisionsCorrectly(self): | |
| 112 my_changes = [_createDummyChange(str(i)) for i in range(1, 6)] | |
| 113 | |
| 114 reversed_changes = list(reversed(my_changes)) | |
| 115 reversed_changes.sort(lambda a,b: cmp(getattr(a, self.comparator.getSort
ingKey()), getattr(b, self.comparator.getSortingKey()))) | |
| 116 self.assertEqual(my_changes, reversed_changes) | |
| 117 | |
| 118 # Helper class to mock a request. We define only what we really need. | |
| 119 class MockRequest(object): | |
| 120 def childLink(self, link): | |
| 121 return link | |
| 122 | |
| 123 # Class to test the method getBuildDetails in ConsoleStatusResource. | |
| 124 class GetBuildDetailsTests(RunMixin, unittest.TestCase): | |
| 125 # Test ConsoleStatusResource.getBuildDetails with a success and a failure ca
se. | |
| 126 def testgetBuildDetails(self): | |
| 127 # run an actual build with a step that will succeed, then another build
with | |
| 128 # a step that will fail, then make sure the build details generated cont
ains | |
| 129 # the right data. | |
| 130 d = self.master.loadConfig(run_config) | |
| 131 d.addCallback(lambda res: self.master.startService()) | |
| 132 d.addCallback(lambda res: self.connectOneSlave("bot1")) | |
| 133 d.addCallback(lambda res: self.requestBuild("full1")) | |
| 134 | |
| 135 # Make sure the build details returned is an empty string to signify th
at | |
| 136 # everything was ok | |
| 137 def expectSuccess(bs): | |
| 138 console_status = console.ConsoleStatusResource() | |
| 139 results = console_status.getBuildDetails(MockRequest(), "buildername
", bs); | |
| 140 self.assertEqual(results, "") | |
| 141 d.addCallback(expectSuccess) | |
| 142 | |
| 143 d.addCallback(lambda res: self.requestBuild("full2")) | |
| 144 | |
| 145 # Make sure the build details returned contained the expected error. | |
| 146 def expectFailure(bs): | |
| 147 expected_details = """<li> buildername : 'ls -WillFail' failed. | |
| 148 [ <a href="../builders/buildername/builds/0/steps/shell/logs/stdio">stdio</a> ]"
"" | |
| 149 console_status = console.ConsoleStatusResource() | |
| 150 results = console_status.getBuildDetails(MockRequest(), "buildername
", bs); | |
| 151 self.assertEqual(results, expected_details) | |
| 152 | |
| 153 d.addCallback(expectFailure) | |
| 154 return d | |
| 155 | |
| OLD | NEW |