| Index: third_party/buildbot_7_12/buildbot/test/test_scheduler.py
|
| diff --git a/third_party/buildbot_7_12/buildbot/test/test_scheduler.py b/third_party/buildbot_7_12/buildbot/test/test_scheduler.py
|
| deleted file mode 100644
|
| index 5e6cb234bd73f9186790228607ccc3f0145a626e..0000000000000000000000000000000000000000
|
| --- a/third_party/buildbot_7_12/buildbot/test/test_scheduler.py
|
| +++ /dev/null
|
| @@ -1,348 +0,0 @@
|
| -# -*- test-case-name: buildbot.test.test_scheduler -*-
|
| -
|
| -import os, time
|
| -
|
| -from twisted.trial import unittest
|
| -from twisted.internet import defer, reactor
|
| -from twisted.application import service
|
| -from twisted.spread import pb
|
| -
|
| -from buildbot import scheduler, sourcestamp, buildset, status
|
| -from buildbot.changes.changes import Change
|
| -from buildbot.scripts import tryclient
|
| -
|
| -
|
| -class FakeMaster(service.MultiService):
|
| - d = None
|
| - def submitBuildSet(self, bs):
|
| - self.sets.append(bs)
|
| - if self.d:
|
| - reactor.callLater(0, self.d.callback, bs)
|
| - self.d = None
|
| - return pb.Referenceable() # makes the cleanup work correctly
|
| -
|
| -class Scheduling(unittest.TestCase):
|
| - def setUp(self):
|
| - self.master = master = FakeMaster()
|
| - master.sets = []
|
| - master.startService()
|
| -
|
| - def tearDown(self):
|
| - d = self.master.stopService()
|
| - return d
|
| -
|
| - def addScheduler(self, s):
|
| - s.setServiceParent(self.master)
|
| -
|
| - def testPeriodic1(self):
|
| - self.addScheduler(scheduler.Periodic("quickly", ["a","b"], 2))
|
| - d = defer.Deferred()
|
| - reactor.callLater(5, d.callback, None)
|
| - d.addCallback(self._testPeriodic1_1)
|
| - return d
|
| - def _testPeriodic1_1(self, res):
|
| - self.failUnless(len(self.master.sets) > 1)
|
| - s1 = self.master.sets[0]
|
| - self.failUnlessEqual(s1.builderNames, ["a","b"])
|
| - self.failUnlessEqual(s1.reason, "The Periodic scheduler named 'quickly' triggered this build")
|
| -
|
| - def testNightly(self):
|
| - # now == 15-Nov-2005, 00:05:36 AM . By using mktime, this is
|
| - # converted into the local timezone, which happens to match what
|
| - # Nightly is going to do anyway.
|
| - MIN=60; HOUR=60*MIN; DAY=24*3600
|
| - now = time.mktime((2005, 11, 15, 0, 5, 36, 1, 319, -1))
|
| -
|
| - s = scheduler.Nightly('nightly', ["a"], hour=3)
|
| - t = s.calculateNextRunTimeFrom(now)
|
| - self.failUnlessEqual(int(t-now), 2*HOUR+54*MIN+24)
|
| -
|
| - s = scheduler.Nightly('nightly', ["a"], minute=[3,8,54])
|
| - t = s.calculateNextRunTimeFrom(now)
|
| - self.failUnlessEqual(int(t-now), 2*MIN+24)
|
| -
|
| - s = scheduler.Nightly('nightly', ["a"],
|
| - dayOfMonth=16, hour=1, minute=6)
|
| - t = s.calculateNextRunTimeFrom(now)
|
| - self.failUnlessEqual(int(t-now), DAY+HOUR+24)
|
| -
|
| - s = scheduler.Nightly('nightly', ["a"],
|
| - dayOfMonth=16, hour=1, minute=3)
|
| - t = s.calculateNextRunTimeFrom(now)
|
| - self.failUnlessEqual(int(t-now), DAY+57*MIN+24)
|
| -
|
| - s = scheduler.Nightly('nightly', ["a"],
|
| - dayOfMonth=15, hour=1, minute=3)
|
| - t = s.calculateNextRunTimeFrom(now)
|
| - self.failUnlessEqual(int(t-now), 57*MIN+24)
|
| -
|
| - s = scheduler.Nightly('nightly', ["a"],
|
| - dayOfMonth=15, hour=0, minute=3)
|
| - t = s.calculateNextRunTimeFrom(now)
|
| - self.failUnlessEqual(int(t-now), 30*DAY-3*MIN+24)
|
| -
|
| -
|
| - def isImportant(self, change):
|
| - if "important" in change.files:
|
| - return True
|
| - return False
|
| -
|
| - def testBranch(self):
|
| - s = scheduler.Scheduler("b1", "branch1", 2, ["a","b"],
|
| - fileIsImportant=self.isImportant)
|
| - self.addScheduler(s)
|
| -
|
| - c0 = Change("carol", ["important"], "other branch", branch="other")
|
| - s.addChange(c0)
|
| - self.failIf(s.timer)
|
| - self.failIf(s.importantChanges)
|
| -
|
| - c1 = Change("alice", ["important", "not important"], "some changes",
|
| - branch="branch1")
|
| - s.addChange(c1)
|
| - c2 = Change("bob", ["not important", "boring"], "some more changes",
|
| - branch="branch1")
|
| - s.addChange(c2)
|
| - c3 = Change("carol", ["important", "dull"], "even more changes",
|
| - branch="branch1")
|
| - s.addChange(c3)
|
| -
|
| - self.failUnlessEqual(s.importantChanges, [c1,c3])
|
| - self.failUnlessEqual(s.allChanges, [c1,c2,c3])
|
| - self.failUnless(s.timer)
|
| -
|
| - d = defer.Deferred()
|
| - reactor.callLater(4, d.callback, None)
|
| - d.addCallback(self._testBranch_1)
|
| - return d
|
| - def _testBranch_1(self, res):
|
| - self.failUnlessEqual(len(self.master.sets), 1)
|
| - s = self.master.sets[0].source
|
| - self.failUnlessEqual(s.branch, "branch1")
|
| - self.failUnlessEqual(s.revision, None)
|
| - self.failUnlessEqual(len(s.changes), 3)
|
| - self.failUnlessEqual(s.patch, None)
|
| -
|
| -
|
| - def testAnyBranch(self):
|
| - s = scheduler.AnyBranchScheduler("b1", None, 1, ["a","b"],
|
| - fileIsImportant=self.isImportant)
|
| - self.addScheduler(s)
|
| -
|
| - c1 = Change("alice", ["important", "not important"], "some changes",
|
| - branch="branch1")
|
| - s.addChange(c1)
|
| - c2 = Change("bob", ["not important", "boring"], "some more changes",
|
| - branch="branch1")
|
| - s.addChange(c2)
|
| - c3 = Change("carol", ["important", "dull"], "even more changes",
|
| - branch="branch1")
|
| - s.addChange(c3)
|
| -
|
| - c4 = Change("carol", ["important"], "other branch", branch="branch2")
|
| - s.addChange(c4)
|
| -
|
| - c5 = Change("carol", ["important"], "default branch", branch=None)
|
| - s.addChange(c5)
|
| -
|
| - d = defer.Deferred()
|
| - reactor.callLater(2, d.callback, None)
|
| - d.addCallback(self._testAnyBranch_1)
|
| - return d
|
| - def _testAnyBranch_1(self, res):
|
| - self.failUnlessEqual(len(self.master.sets), 3)
|
| - self.master.sets.sort(lambda a,b: cmp(a.source.branch,
|
| - b.source.branch))
|
| -
|
| - s1 = self.master.sets[0].source
|
| - self.failUnlessEqual(s1.branch, None)
|
| - self.failUnlessEqual(s1.revision, None)
|
| - self.failUnlessEqual(len(s1.changes), 1)
|
| - self.failUnlessEqual(s1.patch, None)
|
| -
|
| - s2 = self.master.sets[1].source
|
| - self.failUnlessEqual(s2.branch, "branch1")
|
| - self.failUnlessEqual(s2.revision, None)
|
| - self.failUnlessEqual(len(s2.changes), 3)
|
| - self.failUnlessEqual(s2.patch, None)
|
| -
|
| - s3 = self.master.sets[2].source
|
| - self.failUnlessEqual(s3.branch, "branch2")
|
| - self.failUnlessEqual(s3.revision, None)
|
| - self.failUnlessEqual(len(s3.changes), 1)
|
| - self.failUnlessEqual(s3.patch, None)
|
| -
|
| - def testAnyBranch2(self):
|
| - # like testAnyBranch but without fileIsImportant
|
| - s = scheduler.AnyBranchScheduler("b1", None, 2, ["a","b"])
|
| - self.addScheduler(s)
|
| - c1 = Change("alice", ["important", "not important"], "some changes",
|
| - branch="branch1")
|
| - s.addChange(c1)
|
| - c2 = Change("bob", ["not important", "boring"], "some more changes",
|
| - branch="branch1")
|
| - s.addChange(c2)
|
| - c3 = Change("carol", ["important", "dull"], "even more changes",
|
| - branch="branch1")
|
| - s.addChange(c3)
|
| -
|
| - c4 = Change("carol", ["important"], "other branch", branch="branch2")
|
| - s.addChange(c4)
|
| -
|
| - d = defer.Deferred()
|
| - reactor.callLater(2, d.callback, None)
|
| - d.addCallback(self._testAnyBranch2_1)
|
| - return d
|
| - def _testAnyBranch2_1(self, res):
|
| - self.failUnlessEqual(len(self.master.sets), 2)
|
| - self.master.sets.sort(lambda a,b: cmp(a.source.branch,
|
| - b.source.branch))
|
| - s1 = self.master.sets[0].source
|
| - self.failUnlessEqual(s1.branch, "branch1")
|
| - self.failUnlessEqual(s1.revision, None)
|
| - self.failUnlessEqual(len(s1.changes), 3)
|
| - self.failUnlessEqual(s1.patch, None)
|
| -
|
| - s2 = self.master.sets[1].source
|
| - self.failUnlessEqual(s2.branch, "branch2")
|
| - self.failUnlessEqual(s2.revision, None)
|
| - self.failUnlessEqual(len(s2.changes), 1)
|
| - self.failUnlessEqual(s2.patch, None)
|
| -
|
| -
|
| - def createMaildir(self, jobdir):
|
| - os.mkdir(jobdir)
|
| - os.mkdir(os.path.join(jobdir, "new"))
|
| - os.mkdir(os.path.join(jobdir, "cur"))
|
| - os.mkdir(os.path.join(jobdir, "tmp"))
|
| -
|
| - jobcounter = 1
|
| - def pushJob(self, jobdir, job):
|
| - while 1:
|
| - filename = "job_%d" % self.jobcounter
|
| - self.jobcounter += 1
|
| - if os.path.exists(os.path.join(jobdir, "new", filename)):
|
| - continue
|
| - if os.path.exists(os.path.join(jobdir, "tmp", filename)):
|
| - continue
|
| - if os.path.exists(os.path.join(jobdir, "cur", filename)):
|
| - continue
|
| - break
|
| - f = open(os.path.join(jobdir, "tmp", filename), "w")
|
| - f.write(job)
|
| - f.close()
|
| - os.rename(os.path.join(jobdir, "tmp", filename),
|
| - os.path.join(jobdir, "new", filename))
|
| -
|
| - def testTryJobdir(self):
|
| - self.master.basedir = "try_jobdir"
|
| - os.mkdir(self.master.basedir)
|
| - jobdir = "jobdir1"
|
| - jobdir_abs = os.path.join(self.master.basedir, jobdir)
|
| - self.createMaildir(jobdir_abs)
|
| - s = scheduler.Try_Jobdir("try1", ["a", "b"], jobdir)
|
| - self.addScheduler(s)
|
| - self.failIf(self.master.sets)
|
| - job1 = tryclient.createJobfile("buildsetID",
|
| - "branch1", "123", 1, "diff",
|
| - ["a", "b"])
|
| - self.master.d = d = defer.Deferred()
|
| - self.pushJob(jobdir_abs, job1)
|
| - d.addCallback(self._testTryJobdir_1)
|
| - # N.B.: if we don't have DNotify, we poll every 10 seconds, so don't
|
| - # set a .timeout here shorter than that. TODO: make it possible to
|
| - # set the polling interval, so we can make it shorter.
|
| - return d
|
| -
|
| - def _testTryJobdir_1(self, bs):
|
| - self.failUnlessEqual(bs.builderNames, ["a", "b"])
|
| - self.failUnlessEqual(bs.source.branch, "branch1")
|
| - self.failUnlessEqual(bs.source.revision, "123")
|
| - self.failUnlessEqual(bs.source.patch, (1, "diff"))
|
| -
|
| -
|
| - def testTryUserpass(self):
|
| - up = [("alice","pw1"), ("bob","pw2")]
|
| - s = scheduler.Try_Userpass("try2", ["a", "b"], 0, userpass=up)
|
| - self.addScheduler(s)
|
| - port = s.getPort()
|
| - config = {'connect': 'pb',
|
| - 'username': 'alice',
|
| - 'passwd': 'pw1',
|
| - 'master': "localhost:%d" % port,
|
| - 'builders': ["a", "b"],
|
| - }
|
| - t = tryclient.Try(config)
|
| - ss = sourcestamp.SourceStamp("branch1", "123", (1, "diff"))
|
| - t.sourcestamp = ss
|
| - d2 = self.master.d = defer.Deferred()
|
| - d = t.deliverJob()
|
| - d.addCallback(self._testTryUserpass_1, t, d2)
|
| - return d
|
| - testTryUserpass.timeout = 5
|
| - def _testTryUserpass_1(self, res, t, d2):
|
| - # at this point, the Try object should have a RemoteReference to the
|
| - # status object. The FakeMaster returns a stub.
|
| - self.failUnless(t.buildsetStatus)
|
| - d2.addCallback(self._testTryUserpass_2, t)
|
| - return d2
|
| - def _testTryUserpass_2(self, bs, t):
|
| - # this should be the BuildSet submitted by the TryScheduler
|
| - self.failUnlessEqual(bs.builderNames, ["a", "b"])
|
| - self.failUnlessEqual(bs.source.branch, "branch1")
|
| - self.failUnlessEqual(bs.source.revision, "123")
|
| - self.failUnlessEqual(bs.source.patch, (1, "diff"))
|
| -
|
| - t.cleanup()
|
| -
|
| - # twisted-2.0.1 (but not later versions) seems to require a reactor
|
| - # iteration before stopListening actually works. TODO: investigate
|
| - # this.
|
| - d = defer.Deferred()
|
| - reactor.callLater(0, d.callback, None)
|
| - return d
|
| -
|
| - def testGetBuildSets(self):
|
| - # validate IStatus.getBuildSets
|
| - s = status.builder.Status(None, ".")
|
| - bs1 = buildset.BuildSet(["a","b"], sourcestamp.SourceStamp(),
|
| - reason="one", bsid="1")
|
| - s.buildsetSubmitted(bs1.status)
|
| - self.failUnlessEqual(s.getBuildSets(), [bs1.status])
|
| - bs1.status.notifyFinishedWatchers()
|
| - self.failUnlessEqual(s.getBuildSets(), [])
|
| -
|
| - def testCategory(self):
|
| - s1 = scheduler.Scheduler("b1", "branch1", 2, ["a","b"], categories=["categoryA", "both"])
|
| - self.addScheduler(s1)
|
| - s2 = scheduler.Scheduler("b2", "branch1", 2, ["a","b"], categories=["categoryB", "both"])
|
| - self.addScheduler(s2)
|
| -
|
| - c0 = Change("carol", ["important"], "branch1", branch="branch1", category="categoryA")
|
| - s1.addChange(c0)
|
| - s2.addChange(c0)
|
| -
|
| - c1 = Change("carol", ["important"], "branch1", branch="branch1", category="categoryB")
|
| - s1.addChange(c1)
|
| - s2.addChange(c1)
|
| -
|
| - c2 = Change("carol", ["important"], "branch1", branch="branch1")
|
| - s1.addChange(c2)
|
| - s2.addChange(c2)
|
| -
|
| - c3 = Change("carol", ["important"], "branch1", branch="branch1", category="both")
|
| - s1.addChange(c3)
|
| - s2.addChange(c3)
|
| -
|
| - self.failUnlessEqual(s1.importantChanges, [c0, c3])
|
| - self.failUnlessEqual(s2.importantChanges, [c1, c3])
|
| -
|
| - s = scheduler.Scheduler("b3", "branch1", 2, ["a","b"])
|
| - self.addScheduler(s)
|
| -
|
| - c0 = Change("carol", ["important"], "branch1", branch="branch1", category="categoryA")
|
| - s.addChange(c0)
|
| - c1 = Change("carol", ["important"], "branch1", branch="branch1", category="categoryB")
|
| - s.addChange(c1)
|
| -
|
| - self.failUnlessEqual(s.importantChanges, [c0, c1])
|
|
|