remove a lot of unused imports, marked by pyflakes
[buildbot.git] / buildbot / test / test_changes.py
blob492f79a537e921b8cc22c006494d21f2361abc66
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"],
12 'who': "marvin",
13 'comments': "Some changes in Project"}
14 d2 = {'files': ["OtherProject/bar.c"],
15 'who': "zaphod",
16 'comments': "other changes"}
17 d3 = {'files': ["Project/baz.c", "OtherProject/bloo.c"],
18 'who': "alice",
19 'comments': "mixed changes"}
20 d4 = {'files': ["trunk/baz.c", "branches/foobranch/foo.c", "trunk/bar.c"],
21 'who': "alice",
22 'comments': "mixed changes"}
24 class TestChangePerspective(unittest.TestCase):
26 def setUp(self):
27 self.changes = []
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)
36 c1 = self.changes[0]
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")
42 def testPrefix(self):
43 p = pb.ChangePerspective(self, "Project/")
45 p.perspective_addChange(d1)
46 self.failUnlessEqual(len(self.changes), 1)
47 c1 = 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)
58 c3 = self.changes[-1]
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)
68 c1 = 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)
84 c1 = 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)
93 c1 = self.changes[-1]
94 self.failUnlessEqual(c1.files, ["foo.c"])
95 self.failUnlessEqual(c1.comments, "mixed changes")
99 config_empty = """
100 BuildmasterConfig = c = {}
101 c['bots'] = []
102 c['builders'] = []
103 c['sources'] = []
104 c['schedulers'] = []
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):
115 def setUp(self):
116 self.master = master.BuildMaster(".")
117 def tearDown(self):
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)
125 return maybeWait(d)
127 def stall(self, res, timeout):
128 d = defer.Deferred()
129 reactor.callLater(timeout, d.callback, res)
130 return d
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)
139 return maybeWait(d)
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,
148 'files': ["foo.c"],
151 d = runner.sendchange(self.options)
152 d.addCallback(self._testSender_2)
153 return d
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)
169 return d
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")
183 f.close()
184 self.options['comments'] = None
185 self.options['logfile'] = logfile
187 d = runner.sendchange(self.options)
188 d.addCallback(self._testSender_4)
189 return d
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)
206 return d
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)
221 return d
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")