1 # -*- test-case-name: buildbot.test.test_changes -*-
3 from twisted
.trial
import unittest
4 from twisted
.internet
import defer
, reactor
6 from buildbot
import master
7 from buildbot
.twcompat
import maybeWait
8 from buildbot
.changes
import pb
9 from buildbot
.scripts
import runner
11 d1
= {'files': ["Project/foo.c", "Project/bar/boo.c"],
13 'comments': "Some changes in Project"}
14 d2
= {'files': ["OtherProject/bar.c"],
16 'comments': "other changes"}
17 d3
= {'files': ["Project/baz.c", "OtherProject/bloo.c"],
19 'comments': "mixed changes"}
20 d4
= {'files': ["trunk/baz.c", "branches/foobranch/foo.c", "trunk/bar.c"],
22 'comments': "mixed changes"}
24 class TestChangePerspective(unittest
.TestCase
):
29 def addChange(self
, c
):
30 self
.changes
.append(c
)
32 def testNoPrefix(self
):
33 p
= pb
.ChangePerspective(self
, None)
34 p
.perspective_addChange(d1
)
35 self
.failUnlessEqual(len(self
.changes
), 1)
37 self
.failUnlessEqual(c1
.files
,
38 ["Project/foo.c", "Project/bar/boo.c"])
39 self
.failUnlessEqual(c1
.comments
, "Some changes in Project")
40 self
.failUnlessEqual(c1
.who
, "marvin")
43 p
= pb
.ChangePerspective(self
, "Project/")
45 p
.perspective_addChange(d1
)
46 self
.failUnlessEqual(len(self
.changes
), 1)
48 self
.failUnlessEqual(c1
.files
, ["foo.c", "bar/boo.c"])
49 self
.failUnlessEqual(c1
.comments
, "Some changes in Project")
50 self
.failUnlessEqual(c1
.who
, "marvin")
52 p
.perspective_addChange(d2
) # should be ignored
53 self
.failUnlessEqual(len(self
.changes
), 1)
55 p
.perspective_addChange(d3
) # should ignore the OtherProject file
56 self
.failUnlessEqual(len(self
.changes
), 2)
59 self
.failUnlessEqual(c3
.files
, ["baz.c"])
60 self
.failUnlessEqual(c3
.comments
, "mixed changes")
61 self
.failUnlessEqual(c3
.who
, "alice")
63 def testPrefix2(self
):
64 p
= pb
.ChangePerspective(self
, "Project/bar/")
66 p
.perspective_addChange(d1
)
67 self
.failUnlessEqual(len(self
.changes
), 1)
69 self
.failUnlessEqual(c1
.files
, ["boo.c"])
70 self
.failUnlessEqual(c1
.comments
, "Some changes in Project")
71 self
.failUnlessEqual(c1
.who
, "marvin")
73 p
.perspective_addChange(d2
) # should be ignored
74 self
.failUnlessEqual(len(self
.changes
), 1)
76 p
.perspective_addChange(d3
) # should ignore this too
77 self
.failUnlessEqual(len(self
.changes
), 1)
79 def testPrefix3(self
):
80 p
= pb
.ChangePerspective(self
, "trunk/")
82 p
.perspective_addChange(d4
)
83 self
.failUnlessEqual(len(self
.changes
), 1)
85 self
.failUnlessEqual(c1
.files
, ["baz.c", "bar.c"])
86 self
.failUnlessEqual(c1
.comments
, "mixed changes")
88 def testPrefix4(self
):
89 p
= pb
.ChangePerspective(self
, "branches/foobranch/")
91 p
.perspective_addChange(d4
)
92 self
.failUnlessEqual(len(self
.changes
), 1)
94 self
.failUnlessEqual(c1
.files
, ["foo.c"])
95 self
.failUnlessEqual(c1
.comments
, "mixed changes")
100 BuildmasterConfig = c = {}
105 c['slavePortnum'] = 0
108 config_sender
= config_empty
+ \
110 from buildbot.changes import pb
111 c['sources'] = [pb.PBChangeSource(port=None)]
114 class Sender(unittest
.TestCase
):
116 self
.master
= master
.BuildMaster(".")
118 d
= defer
.maybeDeferred(self
.master
.stopService
)
119 # TODO: something in Twisted-2.0.0 (and probably 2.0.1) doesn't shut
120 # down the Broker listening socket when it's supposed to.
121 # Twisted-1.3.0, and current SVN (which will be post-2.0.1) are ok.
122 # This iterate() is a quick hack to deal with the problem. I need to
123 # investigate more thoroughly and find a better solution.
124 d
.addCallback(self
.stall
, 0.1)
127 def stall(self
, res
, timeout
):
129 reactor
.callLater(timeout
, d
.callback
, res
)
132 def testSender(self
):
133 self
.master
.loadConfig(config_empty
)
134 self
.master
.startService()
135 # TODO: BuildMaster.loadChanges replaces the change_svc object, so we
136 # have to load it twice. Clean this up.
137 d
= self
.master
.loadConfig(config_sender
)
138 d
.addCallback(self
._testSender
_1)
141 def _testSender_1(self
, res
):
142 self
.cm
= cm
= self
.master
.change_svc
143 s1
= list(self
.cm
)[0]
144 port
= self
.master
.slavePort
._port
.getHost().port
146 self
.options
= {'username': "alice",
147 'master': "localhost:%d" % port
,
151 d
= runner
.sendchange(self
.options
)
152 d
.addCallback(self
._testSender
_2)
155 def _testSender_2(self
, res
):
156 # now check that the change was received
157 self
.failUnlessEqual(len(self
.cm
.changes
), 1)
158 c
= self
.cm
.changes
.pop()
159 self
.failUnlessEqual(c
.who
, "alice")
160 self
.failUnlessEqual(c
.files
, ["foo.c"])
161 self
.failUnlessEqual(c
.comments
, "")
162 self
.failUnlessEqual(c
.revision
, None)
164 self
.options
['revision'] = "r123"
165 self
.options
['comments'] = "test change"
167 d
= runner
.sendchange(self
.options
)
168 d
.addCallback(self
._testSender
_3)
171 def _testSender_3(self
, res
):
172 self
.failUnlessEqual(len(self
.cm
.changes
), 1)
173 c
= self
.cm
.changes
.pop()
174 self
.failUnlessEqual(c
.who
, "alice")
175 self
.failUnlessEqual(c
.files
, ["foo.c"])
176 self
.failUnlessEqual(c
.comments
, "test change")
177 self
.failUnlessEqual(c
.revision
, "r123")
179 # test options['logfile'] by creating a temporary file
180 logfile
= self
.mktemp()
181 f
= open(logfile
, "wt")
182 f
.write("longer test change")
184 self
.options
['comments'] = None
185 self
.options
['logfile'] = logfile
187 d
= runner
.sendchange(self
.options
)
188 d
.addCallback(self
._testSender
_4)
191 def _testSender_4(self
, res
):
192 self
.failUnlessEqual(len(self
.cm
.changes
), 1)
193 c
= self
.cm
.changes
.pop()
194 self
.failUnlessEqual(c
.who
, "alice")
195 self
.failUnlessEqual(c
.files
, ["foo.c"])
196 self
.failUnlessEqual(c
.comments
, "longer test change")
197 self
.failUnlessEqual(c
.revision
, "r123")
199 # make sure that numeric revisions work too
200 self
.options
['logfile'] = None
201 del self
.options
['revision']
202 self
.options
['revision_number'] = 42
204 d
= runner
.sendchange(self
.options
)
205 d
.addCallback(self
._testSender
_5)
208 def _testSender_5(self
, res
):
209 self
.failUnlessEqual(len(self
.cm
.changes
), 1)
210 c
= self
.cm
.changes
.pop()
211 self
.failUnlessEqual(c
.who
, "alice")
212 self
.failUnlessEqual(c
.files
, ["foo.c"])
213 self
.failUnlessEqual(c
.comments
, "")
214 self
.failUnlessEqual(c
.revision
, 42)
216 # verify --branch too
217 self
.options
['branch'] = "branches/test"
219 d
= runner
.sendchange(self
.options
)
220 d
.addCallback(self
._testSender
_6)
223 def _testSender_6(self
, res
):
224 self
.failUnlessEqual(len(self
.cm
.changes
), 1)
225 c
= self
.cm
.changes
.pop()
226 self
.failUnlessEqual(c
.who
, "alice")
227 self
.failUnlessEqual(c
.files
, ["foo.c"])
228 self
.failUnlessEqual(c
.comments
, "")
229 self
.failUnlessEqual(c
.revision
, 42)
230 self
.failUnlessEqual(c
.branch
, "branches/test")