Index: third_party/buildbot_7_12/buildbot/test/test_steps.py |
diff --git a/third_party/buildbot_7_12/buildbot/test/test_steps.py b/third_party/buildbot_7_12/buildbot/test/test_steps.py |
deleted file mode 100644 |
index 353b4562a095ad9b2c431ec63d08a40005e60920..0000000000000000000000000000000000000000 |
--- a/third_party/buildbot_7_12/buildbot/test/test_steps.py |
+++ /dev/null |
@@ -1,955 +0,0 @@ |
-# -*- test-case-name: buildbot.test.test_steps -*- |
- |
-# create the BuildStep with a fake .remote instance that logs the |
-# .callRemote invocations and compares them against the expected calls. Then |
-# the test harness should send statusUpdate() messages in with assorted |
-# data, eventually calling remote_complete(). Then we can verify that the |
-# Step's rc was correct, and that the status it was supposed to return |
-# matches. |
- |
-# sometimes, .callRemote should raise an exception because of a stale |
-# reference. Sometimes it should errBack with an UnknownCommand failure. |
-# Or other failure. |
- |
-# todo: test batched updates, by invoking remote_update(updates) instead of |
-# statusUpdate(update). Also involves interrupted builds. |
- |
-import sys |
-import os |
- |
-from twisted.trial import unittest |
-from twisted.internet import reactor, defer |
- |
-from buildbot.sourcestamp import SourceStamp |
-from buildbot.process import buildstep, base, factory |
-from buildbot.process.properties import Properties, WithProperties |
-from buildbot.buildslave import BuildSlave |
-from buildbot.steps import shell, source, python, master |
-from buildbot.status import builder |
-from buildbot.status.builder import SUCCESS, WARNINGS, FAILURE, SKIPPED |
-from buildbot.test.runutils import RunMixin, rmtree |
-from buildbot.test.runutils import makeBuildStep, StepTester |
-from buildbot.slave import commands, registry |
- |
- |
-class MyShellCommand(shell.ShellCommand): |
- started = False |
- def runCommand(self, c): |
- self.started = True |
- self.rc = c |
- return shell.ShellCommand.runCommand(self, c) |
- |
-class FakeBuild: |
- pass |
-class FakeBuilder: |
- statusbag = None |
- name = "fakebuilder" |
-class FakeSlaveBuilder: |
- def getSlaveCommandVersion(self, command, oldversion=None): |
- return "1.10" |
- |
-class FakeRemote: |
- def __init__(self): |
- self.events = [] |
- self.remoteCalls = 0 |
- #self.callRemoteNotifier = None |
- def callRemote(self, methname, *args): |
- event = ["callRemote", methname, args] |
- self.events.append(event) |
-## if self.callRemoteNotifier: |
-## reactor.callLater(0, self.callRemoteNotifier, event) |
- self.remoteCalls += 1 |
- self.deferred = defer.Deferred() |
- return self.deferred |
- def notifyOnDisconnect(self, callback): |
- pass |
- def dontNotifyOnDisconnect(self, callback): |
- pass |
- |
- |
-class BuildStep(unittest.TestCase): |
- |
- def setUp(self): |
- rmtree("test_steps") |
- self.builder = FakeBuilder() |
- self.builder_status = builder.BuilderStatus("fakebuilder") |
- self.builder_status.basedir = "test_steps" |
- self.builder_status.nextBuildNumber = 0 |
- os.mkdir(self.builder_status.basedir) |
- self.build_status = self.builder_status.newBuild() |
- req = base.BuildRequest("reason", SourceStamp(), 'test_builder') |
- self.build = base.Build([req]) |
- self.build.build_status = self.build_status # fake it |
- self.build.builder = self.builder |
- self.build.slavebuilder = FakeSlaveBuilder() |
- self.remote = FakeRemote() |
- self.finished = 0 |
- |
- def callback(self, results): |
- self.failed = 0 |
- self.failure = None |
- self.results = results |
- self.finished = 1 |
- def errback(self, failure): |
- self.failed = 1 |
- self.failure = failure |
- self.results = None |
- self.finished = 1 |
- |
- def testShellCommand1(self): |
- cmd = "argle bargle" |
- dir = "murkle" |
- self.expectedEvents = [] |
- buildstep.RemoteCommand.commandCounter[0] = 3 |
- c = MyShellCommand(workdir=dir, command=cmd, timeout=10) |
- c.setBuild(self.build) |
- c.setBuildSlave(BuildSlave("name", "password")) |
- self.assertEqual(self.remote.events, self.expectedEvents) |
- c.step_status = self.build_status.addStepWithName("myshellcommand") |
- d = c.startStep(self.remote) |
- self.failUnless(c.started) |
- d.addCallbacks(self.callback, self.errback) |
- d2 = self.poll() |
- d2.addCallback(self._testShellCommand1_2, c) |
- return d2 |
- testShellCommand1.timeout = 10 |
- |
- def poll(self, ignored=None): |
- # TODO: This is gross, but at least it's no longer using |
- # reactor.iterate() . Still, get rid of this some day soon. |
- if self.remote.remoteCalls == 0: |
- d = defer.Deferred() |
- d.addCallback(self.poll) |
- reactor.callLater(0.1, d.callback, None) |
- return d |
- return defer.succeed(None) |
- |
- def _testShellCommand1_2(self, res, c): |
- rc = c.rc |
- self.expectedEvents.append(["callRemote", "startCommand", |
- (rc, "3", |
- "shell", |
- {'command': "argle bargle", |
- 'workdir': "murkle", |
- 'logEnviron' : True, |
- 'want_stdout': 1, |
- 'want_stderr': 1, |
- 'logfiles': {}, |
- 'timeout': 10, |
- 'maxTime': None, |
- 'usePTY': 'slave-config', |
- 'env': None}) ] ) |
- self.assertEqual(self.remote.events, self.expectedEvents) |
- |
- # we could do self.remote.deferred.errback(UnknownCommand) here. We |
- # could also do .callback(), but generally the master end silently |
- # ignores the slave's ack |
- |
- logs = c.step_status.getLogs() |
- for log in logs: |
- if log.getName() == "log": |
- break |
- |
- rc.remoteUpdate({'header': |
- "command 'argle bargle' in dir 'murkle'\n\n"}) |
- rc.remoteUpdate({'stdout': "foo\n"}) |
- self.assertEqual(log.getText(), "foo\n") |
- self.assertEqual(log.getTextWithHeaders(), |
- "command 'argle bargle' in dir 'murkle'\n\n" |
- "foo\n") |
- rc.remoteUpdate({'stderr': "bar\n"}) |
- self.assertEqual(log.getText(), "foo\nbar\n") |
- self.assertEqual(log.getTextWithHeaders(), |
- "command 'argle bargle' in dir 'murkle'\n\n" |
- "foo\nbar\n") |
- rc.remoteUpdate({'rc': 0}) |
- self.assertEqual(rc.rc, 0) |
- |
- rc.remote_complete() |
- # that should fire the Deferred |
- d = self.poll2() |
- d.addCallback(self._testShellCommand1_3) |
- return d |
- |
- def poll2(self, ignored=None): |
- if not self.finished: |
- d = defer.Deferred() |
- d.addCallback(self.poll2) |
- reactor.callLater(0.1, d.callback, None) |
- return d |
- return defer.succeed(None) |
- |
- def _testShellCommand1_3(self, res): |
- self.assertEqual(self.failed, 0) |
- self.assertEqual(self.results, 0) |
- |
- |
-class MyObserver(buildstep.LogObserver): |
- out = "" |
- def outReceived(self, data): |
- self.out = self.out + data |
- |
-class Steps(unittest.TestCase): |
- def testMultipleStepInstances(self): |
- steps = [ |
- (source.CVS, {'cvsroot': "root", 'cvsmodule': "module"}), |
- (shell.Configure, {'command': "./configure"}), |
- (shell.Compile, {'command': "make"}), |
- (shell.Compile, {'command': "make more"}), |
- (shell.Compile, {'command': "make evenmore"}), |
- (shell.Test, {'command': "make test"}), |
- (shell.Test, {'command': "make testharder"}), |
- ] |
- f = factory.ConfigurableBuildFactory(steps) |
- req = base.BuildRequest("reason", SourceStamp(), 'test_builder') |
- b = f.newBuild([req]) |
- #for s in b.steps: print s.name |
- |
- def failUnlessClones(self, s1, attrnames): |
- f1 = s1.getStepFactory() |
- f,args = f1 |
- s2 = f(**args) |
- for name in attrnames: |
- self.failUnlessEqual(getattr(s1, name), getattr(s2, name)) |
- |
- def clone(self, s1): |
- f1 = s1.getStepFactory() |
- f,args = f1 |
- s2 = f(**args) |
- return s2 |
- |
- def testClone(self): |
- s1 = shell.ShellCommand(command=["make", "test"], |
- timeout=1234, |
- workdir="here", |
- description="yo", |
- descriptionDone="yoyo", |
- env={'key': 'value'}, |
- want_stdout=False, |
- want_stderr=False, |
- logfiles={"name": "filename"}, |
- ) |
- shellparms = (buildstep.BuildStep.parms + |
- ("remote_kwargs description descriptionDone " |
- "command logfiles").split() ) |
- self.failUnlessClones(s1, shellparms) |
- |
- |
- # test the various methods available to buildsteps |
- |
- def test_getProperty(self): |
- s = makeBuildStep("test_steps.Steps.test_getProperty") |
- bs = s.step_status.getBuild() |
- |
- s.setProperty("prop1", "value1", "test") |
- s.setProperty("prop2", "value2", "test") |
- self.failUnlessEqual(s.getProperty("prop1"), "value1") |
- self.failUnlessEqual(bs.getProperty("prop1"), "value1") |
- self.failUnlessEqual(s.getProperty("prop2"), "value2") |
- self.failUnlessEqual(bs.getProperty("prop2"), "value2") |
- s.setProperty("prop1", "value1a", "test") |
- self.failUnlessEqual(s.getProperty("prop1"), "value1a") |
- self.failUnlessEqual(bs.getProperty("prop1"), "value1a") |
- |
- |
- def test_addURL(self): |
- s = makeBuildStep("test_steps.Steps.test_addURL") |
- s.addURL("coverage", "http://coverage.example.org/target") |
- s.addURL("icon", "http://coverage.example.org/icon.png") |
- bs = s.step_status |
- links = bs.getURLs() |
- expected = {"coverage": "http://coverage.example.org/target", |
- "icon": "http://coverage.example.org/icon.png", |
- } |
- self.failUnlessEqual(links, expected) |
- |
- def test_addLog(self): |
- s = makeBuildStep("test_steps.Steps.test_addLog") |
- l = s.addLog("newlog") |
- l.addStdout("some stdout here") |
- l.finish() |
- bs = s.step_status |
- logs = bs.getLogs() |
- self.failUnlessEqual(len(logs), 1) |
- l1 = logs[0] |
- self.failUnlessEqual(l1.getText(), "some stdout here") |
- l1a = s.getLog("newlog") |
- self.failUnlessEqual(l1a.getText(), "some stdout here") |
- |
- def test_addHTMLLog(self): |
- s = makeBuildStep("test_steps.Steps.test_addHTMLLog") |
- l = s.addHTMLLog("newlog", "some html here") |
- bs = s.step_status |
- logs = bs.getLogs() |
- self.failUnlessEqual(len(logs), 1) |
- l1 = logs[0] |
- self.failUnless(isinstance(l1, builder.HTMLLogFile)) |
- self.failUnlessEqual(l1.getText(), "some html here") |
- |
- def test_addCompleteLog(self): |
- s = makeBuildStep("test_steps.Steps.test_addCompleteLog") |
- l = s.addCompleteLog("newlog", "some stdout here") |
- bs = s.step_status |
- logs = bs.getLogs() |
- self.failUnlessEqual(len(logs), 1) |
- l1 = logs[0] |
- self.failUnlessEqual(l1.getText(), "some stdout here") |
- l1a = s.getLog("newlog") |
- self.failUnlessEqual(l1a.getText(), "some stdout here") |
- |
- def test_addLogObserver(self): |
- s = makeBuildStep("test_steps.Steps.test_addLogObserver") |
- bss = s.step_status |
- o1,o2,o3 = MyObserver(), MyObserver(), MyObserver() |
- |
- # add the log before the observer |
- l1 = s.addLog("one") |
- l1.addStdout("onestuff") |
- s.addLogObserver("one", o1) |
- self.failUnlessEqual(o1.out, "onestuff") |
- l1.addStdout(" morestuff") |
- self.failUnlessEqual(o1.out, "onestuff morestuff") |
- |
- # add the observer before the log |
- s.addLogObserver("two", o2) |
- l2 = s.addLog("two") |
- l2.addStdout("twostuff") |
- self.failUnlessEqual(o2.out, "twostuff") |
- |
- # test more stuff about ShellCommands |
- |
- def test_description(self): |
- s = makeBuildStep("test_steps.Steps.test_description.1", |
- step_class=shell.ShellCommand, |
- workdir="dummy", |
- description=["list", "of", "strings"], |
- descriptionDone=["another", "list"]) |
- self.failUnlessEqual(s.description, ["list", "of", "strings"]) |
- self.failUnlessEqual(s.descriptionDone, ["another", "list"]) |
- |
- s = makeBuildStep("test_steps.Steps.test_description.2", |
- step_class=shell.ShellCommand, |
- workdir="dummy", |
- description="single string", |
- descriptionDone="another string") |
- self.failUnlessEqual(s.description, ["single string"]) |
- self.failUnlessEqual(s.descriptionDone, ["another string"]) |
- |
-class VersionCheckingStep(buildstep.BuildStep): |
- def start(self): |
- # give our test a chance to run. It is non-trivial for a buildstep to |
- # claw its way back out to the test case which is currently running. |
- master = self.build.builder.botmaster.parent |
- checker = master._checker |
- checker(self) |
- # then complete |
- self.finished(buildstep.SUCCESS) |
- |
-version_config = """ |
-from buildbot.process import factory |
-from buildbot.test.test_steps import VersionCheckingStep |
-from buildbot.buildslave import BuildSlave |
-from buildbot.config import BuilderConfig |
-BuildmasterConfig = c = {} |
-f1 = factory.BuildFactory([ |
- factory.s(VersionCheckingStep), |
- ]) |
-c['slaves'] = [BuildSlave('bot1', 'sekrit')] |
-c['schedulers'] = [] |
-c['builders'] = [ |
- BuilderConfig(name='quick', slavename='bot1', factory=f1, |
- builddir='quickdir', slavebuilddir='quickslavedir'), |
-] |
-c['slavePortnum'] = 0 |
-""" |
- |
-class SlaveVersion(RunMixin, unittest.TestCase): |
- def setUp(self): |
- RunMixin.setUp(self) |
- self.master.loadConfig(version_config) |
- self.master.startService() |
- d = self.connectSlave(["quick"]) |
- return d |
- |
- def doBuild(self, buildername): |
- br = base.BuildRequest("forced", SourceStamp(), 'test_builder') |
- d = br.waitUntilFinished() |
- self.control.getBuilder(buildername).requestBuild(br) |
- return d |
- |
- |
- def checkCompare(self, s): |
- cver = commands.command_version |
- v = s.slaveVersion("svn", None) |
- # this insures that we are getting the version correctly |
- self.failUnlessEqual(s.slaveVersion("svn", None), cver) |
- # and that non-existent commands do not provide a version |
- self.failUnlessEqual(s.slaveVersion("NOSUCHCOMMAND"), None) |
- # TODO: verify that a <=0.5.0 buildslave (which does not implement |
- # remote_getCommands) handles oldversion= properly. This requires a |
- # mutant slave which does not offer that method. |
- #self.failUnlessEqual(s.slaveVersion("NOSUCHCOMMAND", "old"), "old") |
- |
- # now check the comparison functions |
- self.failIf(s.slaveVersionIsOlderThan("svn", cver)) |
- self.failIf(s.slaveVersionIsOlderThan("svn", "1.1")) |
- self.failUnless(s.slaveVersionIsOlderThan("svn", cver + ".1")) |
- |
- self.failUnlessEqual(s.getSlaveName(), "bot1") |
- |
- def testCompare(self): |
- self.master._checker = self.checkCompare |
- d = self.doBuild("quick") |
- return d |
- |
- |
-class _SimpleBuildStep(buildstep.BuildStep): |
- def start(self): |
- args = {"arg1": "value"} |
- cmd = buildstep.RemoteCommand("simple", args) |
- d = self.runCommand(cmd) |
- d.addCallback(lambda res: self.finished(SUCCESS)) |
- |
-class _SimpleCommand(commands.Command): |
- def start(self): |
- self.builder.flag = True |
- self.builder.flag_args = self.args |
- return defer.succeed(None) |
- |
-class CheckStepTester(StepTester, unittest.TestCase): |
- def testSimple(self): |
- self.slavebase = "testSimple.slave" |
- self.masterbase = "testSimple.master" |
- sb = self.makeSlaveBuilder() |
- sb.flag = False |
- registry.registerSlaveCommand("simple", _SimpleCommand, "1") |
- step = self.makeStep(_SimpleBuildStep) |
- d = self.runStep(step) |
- def _checkSimple(results): |
- self.failUnless(sb.flag) |
- self.failUnlessEqual(sb.flag_args, {"arg1": "value"}) |
- d.addCallback(_checkSimple) |
- return d |
- |
-class Python(StepTester, unittest.TestCase): |
- def testPyFlakes1(self): |
- self.masterbase = "Python.testPyFlakes1" |
- step = self.makeStep(python.PyFlakes) |
- output = \ |
-"""pyflakes buildbot |
-buildbot/changes/freshcvsmail.py:5: 'FCMaildirSource' imported but unused |
-buildbot/clients/debug.py:9: redefinition of unused 'gtk' from line 9 |
-buildbot/clients/debug.py:9: 'gnome' imported but unused |
-buildbot/scripts/runner.py:323: redefinition of unused 'run' from line 321 |
-buildbot/scripts/runner.py:325: redefinition of unused 'run' from line 323 |
-buildbot/scripts/imaginary.py:12: undefined name 'size' |
-buildbot/scripts/imaginary.py:18: 'from buildbot import *' used; unable to detect undefined names |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- desc = step.descriptionDone |
- self.failUnless("unused=2" in desc) |
- self.failUnless("undefined=1" in desc) |
- self.failUnless("redefs=3" in desc) |
- self.failUnless("import*=1" in desc) |
- self.failIf("misc=" in desc) |
- |
- self.failUnlessEqual(step.getProperty("pyflakes-unused"), 2) |
- self.failUnlessEqual(step.getProperty("pyflakes-undefined"), 1) |
- self.failUnlessEqual(step.getProperty("pyflakes-redefs"), 3) |
- self.failUnlessEqual(step.getProperty("pyflakes-import*"), 1) |
- self.failUnlessEqual(step.getProperty("pyflakes-misc"), 0) |
- self.failUnlessEqual(step.getProperty("pyflakes-total"), 7) |
- |
- logs = {} |
- for log in step.step_status.getLogs(): |
- logs[log.getName()] = log |
- |
- for name in ["unused", "undefined", "redefs", "import*"]: |
- self.failUnless(name in logs) |
- self.failIf("misc" in logs) |
- lines = logs["unused"].readlines() |
- self.failUnlessEqual(len(lines), 2) |
- self.failUnlessEqual(lines[0], "buildbot/changes/freshcvsmail.py:5: 'FCMaildirSource' imported but unused\n") |
- |
- cmd = buildstep.RemoteCommand(None, {}) |
- cmd.rc = 0 |
- results = step.evaluateCommand(cmd) |
- self.failUnlessEqual(results, FAILURE) # because of the 'undefined' |
- |
- def testPyFlakes2(self): |
- self.masterbase = "Python.testPyFlakes2" |
- step = self.makeStep(python.PyFlakes) |
- output = \ |
-"""pyflakes buildbot |
-some more text here that should be ignored |
-buildbot/changes/freshcvsmail.py:5: 'FCMaildirSource' imported but unused |
-buildbot/clients/debug.py:9: redefinition of unused 'gtk' from line 9 |
-buildbot/clients/debug.py:9: 'gnome' imported but unused |
-buildbot/scripts/runner.py:323: redefinition of unused 'run' from line 321 |
-buildbot/scripts/runner.py:325: redefinition of unused 'run' from line 323 |
-buildbot/scripts/imaginary.py:12: undefined name 'size' |
-could not compile 'blah/blah.py':3: |
-pretend there was an invalid line here |
-buildbot/scripts/imaginary.py:18: 'from buildbot import *' used; unable to detect undefined names |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- desc = step.descriptionDone |
- self.failUnless("unused=2" in desc) |
- self.failUnless("undefined=1" in desc) |
- self.failUnless("redefs=3" in desc) |
- self.failUnless("import*=1" in desc) |
- self.failUnless("misc=2" in desc) |
- |
- |
- def testPyFlakes3(self): |
- self.masterbase = "Python.testPyFlakes3" |
- step = self.makeStep(python.PyFlakes) |
- output = \ |
-"""buildbot/changes/freshcvsmail.py:5: 'FCMaildirSource' imported but unused |
-buildbot/clients/debug.py:9: redefinition of unused 'gtk' from line 9 |
-buildbot/clients/debug.py:9: 'gnome' imported but unused |
-buildbot/scripts/runner.py:323: redefinition of unused 'run' from line 321 |
-buildbot/scripts/runner.py:325: redefinition of unused 'run' from line 323 |
-buildbot/scripts/imaginary.py:12: undefined name 'size' |
-buildbot/scripts/imaginary.py:18: 'from buildbot import *' used; unable to detect undefined names |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- desc = step.descriptionDone |
- self.failUnless("unused=2" in desc) |
- self.failUnless("undefined=1" in desc) |
- self.failUnless("redefs=3" in desc) |
- self.failUnless("import*=1" in desc) |
- self.failIf("misc" in desc) |
- |
- |
-class OrdinaryCompile(shell.Compile): |
- warningPattern = "ordinary line" |
- |
-class Warnings(StepTester, unittest.TestCase): |
- def testCompile1(self): |
- self.masterbase = "Warnings.testCompile1" |
- step = self.makeStep(shell.Compile) |
- output = \ |
-"""Compile started |
-normal line |
-warning: oh noes! |
-ordinary line |
-error (but we aren't looking for errors now, are we) |
-line 23: warning: we are now on line 23 |
-ending line |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- self.failUnlessEqual(step.getProperty("warnings-count"), 2) |
- logs = {} |
- for log in step.step_status.getLogs(): |
- logs[log.getName()] = log |
- self.failUnless("warnings" in logs) |
- lines = logs["warnings"].readlines() |
- self.failUnlessEqual(len(lines), 2) |
- self.failUnlessEqual(lines[0], "warning: oh noes!\n") |
- self.failUnlessEqual(lines[1], |
- "line 23: warning: we are now on line 23\n") |
- |
- cmd = buildstep.RemoteCommand(None, {}) |
- cmd.rc = 0 |
- results = step.evaluateCommand(cmd) |
- self.failUnlessEqual(results, WARNINGS) |
- |
- def testCompile2(self): |
- self.masterbase = "Warnings.testCompile2" |
- step = self.makeStep(shell.Compile, warningPattern="ordinary line") |
- output = \ |
-"""Compile started |
-normal line |
-warning: oh noes! |
-ordinary line |
-error (but we aren't looking for errors now, are we) |
-line 23: warning: we are now on line 23 |
-ending line |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- self.failUnlessEqual(step.getProperty("warnings-count"), 1) |
- logs = {} |
- for log in step.step_status.getLogs(): |
- logs[log.getName()] = log |
- self.failUnless("warnings" in logs) |
- lines = logs["warnings"].readlines() |
- self.failUnlessEqual(len(lines), 1) |
- self.failUnlessEqual(lines[0], "ordinary line\n") |
- |
- cmd = buildstep.RemoteCommand(None, {}) |
- cmd.rc = 0 |
- results = step.evaluateCommand(cmd) |
- self.failUnlessEqual(results, WARNINGS) |
- |
- def testCompile3(self): |
- self.masterbase = "Warnings.testCompile3" |
- step = self.makeStep(OrdinaryCompile) |
- output = \ |
-"""Compile started |
-normal line |
-warning: oh noes! |
-ordinary line |
-error (but we aren't looking for errors now, are we) |
-line 23: warning: we are now on line 23 |
-ending line |
-""" |
- step.setProperty("warnings-count", 10, "test") |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- self.failUnlessEqual(step.getProperty("warnings-count"), 11) |
- logs = {} |
- for log in step.step_status.getLogs(): |
- logs[log.getName()] = log |
- self.failUnless("warnings" in logs) |
- lines = logs["warnings"].readlines() |
- self.failUnlessEqual(len(lines), 1) |
- self.failUnlessEqual(lines[0], "ordinary line\n") |
- |
- cmd = buildstep.RemoteCommand(None, {}) |
- cmd.rc = 0 |
- results = step.evaluateCommand(cmd) |
- self.failUnlessEqual(results, WARNINGS) |
- |
- def testCompile4(self): |
- # Test suppression of warnings. |
- self.masterbase = "Warnings.testCompile4" |
- step = self.makeStep(shell.Compile, |
- warningPattern="^(.*?):([0-9]+): [Ww]arning: (.*)$", |
- warningExtractor=shell.Compile.warnExtractFromRegexpGroups, |
- directoryEnterPattern="make.*: Entering directory [\"`'](.*)['`\"]", |
- directoryLeavePattern="make.*: Leaving directory") |
- step.addSuppression([(r"/subdir/", r"xyzzy", None, None), |
- (r"foo.c", r".*", None, 20), |
- (r"foo.c", r".*", 200, None), |
- (r"foo.c", r".*", 50, 50), |
- (r"xxx", r".*", None, None), |
- ]) |
- log = step.addLog("stdio") |
- output = \ |
-"""Making all in . |
-make[1]: Entering directory `/abs/path/build' |
-foo.c:10: warning: `bar' defined but not used |
-foo.c:50: warning: `bar' defined but not used |
-make[2]: Entering directory `/abs/path/build/subdir' |
-baz.c:33: warning: `xyzzy' defined but not used |
-baz.c:34: warning: `magic' defined but not used |
-make[2]: Leaving directory `/abs/path/build/subdir' |
-foo.c:100: warning: `xyzzy' defined but not used |
-foo.c:200: warning: `bar' defined but not used |
-make[2]: Leaving directory `/abs/path/build' |
-""" |
- log.addStdout(output) |
- log.finish() |
- step.createSummary(log) |
- self.failUnlessEqual(step.getProperty("warnings-count"), 2) |
- logs = {} |
- for log in step.step_status.getLogs(): |
- logs[log.getName()] = log |
- self.failUnless("warnings" in logs) |
- lines = logs["warnings"].readlines() |
- self.failUnlessEqual(len(lines), 2) |
- self.failUnlessEqual(lines[0], "baz.c:34: warning: `magic' defined but not used\n") |
- self.failUnlessEqual(lines[1], "foo.c:100: warning: `xyzzy' defined but not used\n") |
- |
- cmd = buildstep.RemoteCommand(None, {}) |
- cmd.rc = 0 |
- results = step.evaluateCommand(cmd) |
- self.failUnlessEqual(results, WARNINGS) |
- |
- def filterArgs(self, args): |
- if "writer" in args: |
- args["writer"] = self.wrap(args["writer"]) |
- return args |
- |
- suppressionFileData = """ |
-# Sample suppressions file for testing |
- |
-/subdir/ : xyzzy |
-foo.c: .* : 0-20 |
-foo.c: .*: 200-10000 |
-foo.c :.*: 50 |
-xxx : .* |
-""" |
- def testCompile5(self): |
- # Test downloading warning suppression file from slave. |
- self.slavebase = "Warnings.testCompile5.slave" |
- self.masterbase = "Warnings.testCompile5.master" |
- sb = self.makeSlaveBuilder() |
- os.mkdir(os.path.join(self.slavebase, self.slavebuilderbase, |
- "build")) |
- output = \ |
-"""Making all in . |
-make[1]: Entering directory `/abs/path/build' |
-foo.c:10: warning: `bar' defined but not used |
-foo.c:50: warning: `bar' defined but not used |
-make[2]: Entering directory `/abs/path/build/subdir' |
-baz.c:33: warning: `xyzzy' defined but not used |
-baz.c:34: warning: `magic' defined but not used |
-make[2]: Leaving directory `/abs/path/build/subdir' |
-foo.c:100: warning: `xyzzy' defined but not used |
-foo.c:200: warning: `bar' defined but not used |
-make[2]: Leaving directory `/abs/path/build' |
-""" |
- printStatement = ('print """%s"""' % output) |
- step = self.makeStep(shell.Compile, |
- warningPattern="^(.*?):([0-9]+): [Ww]arning: (.*)$", |
- warningExtractor=shell.Compile.warnExtractFromRegexpGroups, |
- suppressionFile="warnings.supp", |
- command=[sys.executable, "-c", printStatement]) |
- self.failUnlessEqual(step.step_status.getText(), ['compiling']) |
- slavesrc = os.path.join(self.slavebase, |
- self.slavebuilderbase, |
- "build", |
- "warnings.supp") |
- open(slavesrc, "w").write(self.suppressionFileData) |
- |
- d = self.runStep(step) |
- def _checkResult(result): |
- self.failUnlessEqual(step.getProperty("warnings-count"), 2) |
- logs = {} |
- for log in step.step_status.getLogs(): |
- logs[log.getName()] = log |
- self.failUnless("warnings" in logs) |
- lines = logs["warnings"].readlines() |
- self.failUnlessEqual(len(lines), 2) |
- self.failUnlessEqual(lines[0], "baz.c:34: warning: `magic' defined but not used\n") |
- self.failUnlessEqual(lines[1], "foo.c:100: warning: `xyzzy' defined but not used\n") |
- self.failUnlessEqual(step.step_status.getText(), ['compile', |
- 'warnings']) |
- |
- d.addCallback(_checkResult) |
- return d |
- |
-class TreeSize(StepTester, unittest.TestCase): |
- def testTreeSize(self): |
- self.slavebase = "TreeSize.testTreeSize.slave" |
- self.masterbase = "TreeSize.testTreeSize.master" |
- |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(shell.TreeSize) |
- d = self.runStep(step) |
- def _check(results): |
- self.failUnlessEqual(results, SUCCESS) |
- kib = step.getProperty("tree-size-KiB") |
- self.failUnless(isinstance(kib, int)) |
- self.failUnless(kib < 100) # should be empty, I get '4' |
- s = step.step_status |
- self.failUnlessEqual(" ".join(s.getText()), |
- "treesize %d KiB" % kib) |
- d.addCallback(_check) |
- return d |
- |
-class FakeCommand: |
- def __init__(self, rc): |
- self.rc = rc |
- |
-class PerlModuleTest(StepTester, unittest.TestCase): |
- def testAllTestsPassed(self): |
- self.masterbase = "PMT.testAllTestsPassed" |
- step = self.makeStep(shell.PerlModuleTest) |
- output = \ |
-"""ok 1 |
-ok 2 |
-All tests successful |
-Files=1, Tests=123, other stuff |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- rc = step.evaluateCommand(FakeCommand(rc=241)) |
- self.failUnlessEqual(rc, SUCCESS) |
- ss = step.step_status |
- self.failUnlessEqual(ss.getStatistic('tests-failed'), 0) |
- self.failUnlessEqual(ss.getStatistic('tests-total'), 123) |
- self.failUnlessEqual(ss.getStatistic('tests-passed'), 123) |
- |
- def testFailures_OldTestHarness(self): |
- self.masterbase = "PMT.testFailures_OldTestHarness" |
- step = self.makeStep(shell.PerlModuleTest) |
- output = \ |
-""" |
-ok 1 |
-ok 2 |
-3/7 subtests failed |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- rc = step.evaluateCommand(FakeCommand(rc = 123)) |
- self.failUnlessEqual(rc, FAILURE) |
- ss = step.step_status |
- self.failUnlessEqual(ss.getStatistic('tests-failed'), 3) |
- self.failUnlessEqual(ss.getStatistic('tests-total'), 7) |
- self.failUnlessEqual(ss.getStatistic('tests-passed'), 4) |
- |
- def testFailures_UnparseableStdio(self): |
- self.masterbase = "PMT.testFailures_UnparseableStdio" |
- step = self.makeStep(shell.PerlModuleTest) |
- output = \ |
-""" |
-just some random stuff, you know |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- rc = step.evaluateCommand(FakeCommand(rc = 243)) |
- self.failUnlessEqual(rc, 243) |
- ss = step.step_status |
- self.failUnlessEqual(ss.getStatistic('tests-failed'), None) |
- self.failUnlessEqual(ss.getStatistic('tests-total'), None) |
- self.failUnlessEqual(ss.getStatistic('tests-passed'), None) |
- |
- def testFailures_NewTestHarness(self): |
- self.masterbase = "PMT.testFailures_NewTestHarness" |
- step = self.makeStep(shell.PerlModuleTest) |
- output = \ |
-""" |
-# Looks like you failed 15 tests of 18. |
-tests/services.......................... Failed 265/30904 subtests |
- (less 16 skipped subtests: 30623 okay) |
-tests/simple_query_backend..............ok |
-tests/simple_query_middleware...........ok |
-tests/soap_globalcollect................ok |
-tests/three_d_me........................ok |
-tests/three_d_me_callback...............ok |
-tests/transaction_create................ok |
-tests/unique_txid.......................ok |
- |
-Test Summary Report |
-------------------- |
-tests/000policies (Wstat: 5632 Tests: 9078 Failed: 22) |
- Failed tests: 2409, 2896-2897, 2900-2901, 2940-2941, 2944-2945 |
- 2961-2962, 2965-2966, 2969-2970, 2997-2998 |
- 3262, 3281-3282, 3288-3289 |
- Non-zero exit status: 22 |
-tests/services (Wstat: 0 Tests: 30904 Failed: 265) |
- Failed tests: 14, 16-21, 64-69, 71-96, 98, 30157, 30159 |
- 30310, 30316, 30439-30543, 30564, 30566-30577 |
- 30602, 30604-30607, 30609-30612, 30655 |
- 30657-30668, 30675, 30697-30716, 30718-30720 |
- 30722-30736, 30773-30774, 30776-30777, 30786 |
- 30791, 30795, 30797, 30801, 30822-30827 |
- 30830-30831, 30848-30855, 30858-30859, 30888-30899 |
- 30901, 30903-30904 |
-Files=68, Tests=264809, 1944 wallclock secs (17.59 usr 0.63 sys + 470.04 cusr 131.40 csys = 619.66 CPU) |
-Result: FAIL |
-""" |
- log = step.addLog("stdio") |
- log.addStdout(output) |
- log.finish() |
- rc = step.evaluateCommand(FakeCommand(rc=87)) |
- self.failUnlessEqual(rc, FAILURE) |
- ss = step.step_status |
- self.failUnlessEqual(ss.getStatistic('tests-failed'), 287) |
- self.failUnlessEqual(ss.getStatistic('tests-total'), 264809) |
- self.failUnlessEqual(ss.getStatistic('tests-passed'), 264522) |
- |
-class MasterShellCommand(StepTester, unittest.TestCase): |
- def testMasterShellCommand(self): |
- self.slavebase = "testMasterShellCommand.slave" |
- self.masterbase = "testMasterShellCommand.master" |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(master.MasterShellCommand, command=['echo', |
- WithProperties("hi build-%(other)s.tar.gz")]) |
- step.build.setProperty("other", "foo", "test") |
- |
- # we can't invoke runStep until the reactor is started .. hence this |
- # little dance |
- d = defer.Deferred() |
- def _dotest(_): |
- return self.runStep(step) |
- d.addCallback(_dotest) |
- |
- def _check(results): |
- self.failUnlessEqual(results, SUCCESS) |
- logtxt = step.getLog("stdio").getText() |
- self.failUnlessEqual(logtxt.strip(), "hi build-foo.tar.gz") |
- d.addCallback(_check) |
- reactor.callLater(0, d.callback, None) |
- return d |
- |
- def testMasterShellCommand_badexit(self): |
- self.slavebase = "testMasterShellCommand_badexit.slave" |
- self.masterbase = "testMasterShellCommand_badexit.master" |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(master.MasterShellCommand, command="exit 1") |
- |
- # we can't invoke runStep until the reactor is started .. hence this |
- # little dance |
- d = defer.Deferred() |
- def _dotest(_): |
- return self.runStep(step) |
- d.addCallback(_dotest) |
- |
- def _check(results): |
- self.failUnlessEqual(results, FAILURE) |
- d.addCallback(_check) |
- reactor.callLater(0, d.callback, None) |
- return d |
- |
-class SuccessStep(buildstep.BuildStep): |
- def start(self): |
- self.finished(buildstep.SUCCESS) |
- |
-class ConditionalStepTest(StepTester, unittest.TestCase): |
- def testNotSkipped(self): |
- self.slavebase = "testNotSkipped.slave" |
- self.masterbase = "testNotSkipped.master" |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(SuccessStep) |
- d = self.runStep(step) |
- def _checkResults(results): |
- self.failUnlessEqual(SUCCESS, results) |
- d.addCallback(_checkResults) |
- return d |
- |
- def testSkipped(self): |
- self.slavebase = "testSkipped.slave" |
- self.masterbase = "testSkipped.master" |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(SuccessStep, doStepIf=False) |
- d = self.runStep(step) |
- def _checkResults(results): |
- self.failUnlessEqual(SKIPPED, results) |
- d.addCallback(_checkResults) |
- return d |
- |
- def testNotSkippedFunc(self): |
- self.slavebase = "testNotSkippedFunc.slave" |
- self.masterbase = "testNotSkippedFunc.master" |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(SuccessStep, doStepIf=lambda s: True) |
- d = self.runStep(step) |
- def _checkResults(results): |
- self.failUnlessEqual(SUCCESS, results) |
- d.addCallback(_checkResults) |
- return d |
- |
- def testSkippedFunc(self): |
- self.slavebase = "testSkippedFunc.slave" |
- self.masterbase = "testSkippedFunc.master" |
- sb = self.makeSlaveBuilder() |
- step = self.makeStep(SuccessStep, doStepIf=lambda s: False) |
- d = self.runStep(step) |
- def _checkResults(results): |
- self.failUnlessEqual(SKIPPED, results) |
- d.addCallback(_checkResults) |
- return d |