OLD | NEW |
| (Empty) |
1 from twisted.trial import unittest | |
2 from twisted.internet import reactor, defer | |
3 | |
4 from buildbot.test.runutils import RunMixin, TestFlagMixin, rmtree | |
5 from buildbot.changes import changes | |
6 from buildbot.sourcestamp import SourceStamp | |
7 from buildbot.process.base import BuildRequest | |
8 | |
9 nextslave_config = """ | |
10 from buildbot.process import factory | |
11 from buildbot.steps import dummy | |
12 from buildbot.buildslave import BuildSlave | |
13 from buildbot.scheduler import Scheduler | |
14 from buildbot.config import BuilderConfig | |
15 | |
16 f1 = factory.BuildFactory([dummy.Dummy(timeout=0)]) | |
17 | |
18 def nextSlave(builder, slaves): | |
19 for s in slaves: | |
20 if s.slave.slavename == 'bot1': | |
21 return s | |
22 | |
23 BuildmasterConfig = c = {} | |
24 c['slaves'] = [BuildSlave('bot1', 'sekrit'), BuildSlave('bot2', 'sekrit')] | |
25 c['schedulers'] = [Scheduler('dummy', None, 0, ['dummy'])] | |
26 c['builders'] = [ | |
27 BuilderConfig(name='dummy', slavenames=['bot1', 'bot2'], | |
28 factory=f1, nextSlave=nextSlave), | |
29 ] | |
30 c['slavePortnum'] = 0 | |
31 c['mergeRequests'] = lambda builder, req1, req2: False | |
32 """ | |
33 class NextSlave(RunMixin, unittest.TestCase): | |
34 def rmtree(self, d): | |
35 rmtree(d) | |
36 | |
37 def testNextSlave(self): | |
38 d = self.master.loadConfig(nextslave_config) | |
39 self.master.readConfig = True | |
40 d.addCallback(lambda res: self.master.startService()) | |
41 d.addCallback(lambda res: self.connectSlave(slavename='bot1')) | |
42 d.addCallback(lambda res: self.connectSlave(slavename='bot2')) | |
43 | |
44 def check(res): | |
45 builder = self.status.getBuilder("dummy") | |
46 self.failUnlessEqual(len(builder.slavenames), 2) | |
47 for i in range(5): | |
48 build = builder.getBuild(i) | |
49 self.failUnlessEqual(build.slavename, 'bot1') | |
50 | |
51 def _send(res): | |
52 # send some build requests | |
53 reqs = [] | |
54 ss = SourceStamp() | |
55 for i in range(5): | |
56 req = BuildRequest(str(i), ss, "dummy") | |
57 self.master.botmaster.builders['dummy'].submitBuildRequest(req) | |
58 reqs.append(req.waitUntilFinished()) | |
59 | |
60 dl = defer.DeferredList(reqs) | |
61 dl.addCallback(check) | |
62 return dl | |
63 | |
64 d.addCallback(_send) | |
65 | |
66 return d | |
67 | |
68 # Test nextBuild | |
69 nextbuild_config = """ | |
70 from buildbot.process import factory | |
71 from buildbot.steps import dummy | |
72 from buildbot.buildslave import BuildSlave | |
73 from buildbot.scheduler import Scheduler | |
74 from buildbot.config import BuilderConfig | |
75 | |
76 f1 = factory.BuildFactory([dummy.Dummy(timeout=0)]) | |
77 | |
78 def nextBuild(builder, requests): | |
79 # Return the newest request first | |
80 return requests[-1] | |
81 | |
82 BuildmasterConfig = c = {} | |
83 c['slaves'] = [BuildSlave('bot1', 'sekrit')] | |
84 c['schedulers'] = [Scheduler('dummy', None, 0, ['dummy'])] | |
85 c['builders'] = [ | |
86 BuilderConfig(name='dummy', slavenames=['bot1'], factory=f1, nextBuild=nextB
uild), | |
87 ] | |
88 c['slavePortnum'] = 0 | |
89 c['mergeRequests'] = lambda builder, req1, req2: False | |
90 """ | |
91 class NextBuild(RunMixin, unittest.TestCase): | |
92 def rmtree(self, d): | |
93 rmtree(d) | |
94 | |
95 def testNextBuild(self): | |
96 d = self.master.loadConfig(nextbuild_config) | |
97 self.master.readConfig = True | |
98 d.addCallback(lambda res: self.master.startService()) | |
99 | |
100 start_order = [] | |
101 reqs = [] | |
102 | |
103 def check(res): | |
104 builder = self.status.getBuilder("dummy") | |
105 self.failUnlessEqual(len(builder.slavenames), 1) | |
106 self.failUnlessEqual(start_order, [4,3,2,1,0]) | |
107 | |
108 def send(res): | |
109 # send some build requests | |
110 ss = SourceStamp() | |
111 for i in range(5): | |
112 req = BuildRequest(str(i), ss, "dummy") | |
113 self.master.botmaster.builders['dummy'].submitBuildRequest(req) | |
114 req.submittedAt = i | |
115 def append(build): | |
116 start_order.append(int(build.reason)) | |
117 req.subscribe(append) | |
118 reqs.append(req.waitUntilFinished()) | |
119 | |
120 d.addCallback(send) | |
121 d.addCallback(lambda res: self.connectSlave(slavename='bot1')) | |
122 | |
123 def connected(res): | |
124 return defer.DeferredList(reqs) | |
125 d.addCallback(connected) | |
126 d.addCallback(check) | |
127 return d | |
128 | |
129 # Test prioritizeBuilders | |
130 prioritizebuilders_config = """ | |
131 from buildbot.process import factory | |
132 from buildbot.steps import dummy | |
133 from buildbot.buildslave import BuildSlave | |
134 from buildbot.scheduler import Scheduler | |
135 from buildbot.config import BuilderConfig | |
136 | |
137 f1 = factory.BuildFactory([dummy.Dummy(timeout=0)]) | |
138 | |
139 def prioritizeBuilders(buildmaster, builders): | |
140 for builder in builders: | |
141 if builder.name == 'dummy1': | |
142 return [builder] | |
143 return [] | |
144 | |
145 BuildmasterConfig = c = {} | |
146 c['slaves'] = [BuildSlave('bot1', 'sekrit')] | |
147 c['schedulers'] = [Scheduler('dummy', None, 0, ['dummy1', 'dummy2'])] | |
148 c['builders'] = [ | |
149 BuilderConfig(name='dummy1', slavename='bot1', factory=f1), | |
150 BuilderConfig(name='dummy2', slavename='bot1', factory=f1), | |
151 ] | |
152 c['slavePortnum'] = 0 | |
153 c['mergeRequests'] = lambda builder, req1, req2: False | |
154 c['prioritizeBuilders'] = prioritizeBuilders | |
155 """ | |
156 class PrioritizeBuilders(RunMixin, unittest.TestCase): | |
157 def rmtree(self, d): | |
158 rmtree(d) | |
159 | |
160 def testPrioritizeBuilders(self): | |
161 d = self.master.loadConfig(prioritizebuilders_config) | |
162 self.master.readConfig = True | |
163 d.addCallback(lambda res: self.master.startService()) | |
164 | |
165 builder_names = [] | |
166 reqs = [] | |
167 incomplete_reqs = [] | |
168 complete_reqs = [] | |
169 | |
170 def check(res): | |
171 builder = self.status.getBuilder("dummy1") | |
172 self.failUnlessEqual(len(builder.slavenames), 1) | |
173 self.failUnlessEqual(builder_names, ['dummy1'] * 5) | |
174 for req in incomplete_reqs: | |
175 self.failUnlessEqual(req.startCount, 0) | |
176 for req in complete_reqs: | |
177 self.failUnlessEqual(req.startCount, 1) | |
178 | |
179 def send(res): | |
180 # send some build requests | |
181 ss = SourceStamp() | |
182 for i in range(5): | |
183 req1 = BuildRequest(str(i), ss, "dummy") | |
184 self.master.botmaster.builders['dummy1'].submitBuildRequest(req1
) | |
185 req2 = BuildRequest(str(i), ss, "dummy") | |
186 self.master.botmaster.builders['dummy2'].submitBuildRequest(req2
) | |
187 def append(build): | |
188 builder_names.append(build.builder.name) | |
189 req1.subscribe(append) | |
190 req2.subscribe(append) | |
191 reqs.append(req1.waitUntilFinished()) | |
192 complete_reqs.append(req1) | |
193 incomplete_reqs.append(req2) | |
194 | |
195 d.addCallback(send) | |
196 d.addCallback(lambda res: self.connectSlave(slavename='bot1', builders=[
'dummy1', 'dummy2'])) | |
197 | |
198 def connected(res): | |
199 return defer.DeferredList(reqs) | |
200 d.addCallback(connected) | |
201 d.addCallback(check) | |
202 return d | |
OLD | NEW |