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 |