diff options
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_changes_svnpoller.py')
-rw-r--r-- | lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_changes_svnpoller.py | 627 |
1 files changed, 0 insertions, 627 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_changes_svnpoller.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_changes_svnpoller.py deleted file mode 100644 index be288d8d..00000000 --- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_changes_svnpoller.py +++ /dev/null @@ -1,627 +0,0 @@ -# This file is part of Buildbot. Buildbot is free software: you can -# redistribute it and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Copyright Buildbot Team Members - -from __future__ import with_statement - -import os -import xml.dom.minidom -from twisted.internet import defer -from twisted.trial import unittest -from buildbot.test.util import changesource, gpo, compat -from buildbot.changes import svnpoller - -# this is the output of "svn info --xml -# svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk" -prefix_output = """\ -<?xml version="1.0"?> -<info> -<entry - kind="dir" - path="trunk" - revision="18354"> -<url>svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk</url> -<repository> -<root>svn+ssh://svn.twistedmatrix.com/svn/Twisted</root> -<uuid>bbbe8e31-12d6-0310-92fd-ac37d47ddeeb</uuid> -</repository> -<commit - revision="18352"> -<author>jml</author> -<date>2006-10-01T02:37:34.063255Z</date> -</commit> -</entry> -</info> -""" - -# and this is "svn info --xml svn://svn.twistedmatrix.com/svn/Twisted". I -# think this is kind of a degenerate case.. it might even be a form of error. -prefix_output_2 = """\ -<?xml version="1.0"?> -<info> -</info> -""" - -# this is the svn info output for a local repository, svn info --xml -# file:///home/warner/stuff/Projects/BuildBot/trees/svnpoller/_trial_temp/test_vc/repositories/SVN-Repository -prefix_output_3 = """\ -<?xml version="1.0"?> -<info> -<entry - kind="dir" - path="SVN-Repository" - revision="3"> -<url>file:///home/warner/stuff/Projects/BuildBot/trees/svnpoller/_trial_temp/test_vc/repositories/SVN-Repository</url> -<repository> -<root>file:///home/warner/stuff/Projects/BuildBot/trees/svnpoller/_trial_temp/test_vc/repositories/SVN-Repository</root> -<uuid>c0f47ff4-ba1e-0410-96b5-d44cc5c79e7f</uuid> -</repository> -<commit - revision="3"> -<author>warner</author> -<date>2006-10-01T07:37:04.182499Z</date> -</commit> -</entry> -</info> -""" - -# % svn info --xml file:///home/warner/stuff/Projects/BuildBot/trees/svnpoller/_trial_temp/test_vc/repositories/SVN-Repository/sample/trunk - -prefix_output_4 = """\ -<?xml version="1.0"?> -<info> -<entry - kind="dir" - path="trunk" - revision="3"> -<url>file:///home/warner/stuff/Projects/BuildBot/trees/svnpoller/_trial_temp/test_vc/repositories/SVN-Repository/sample/trunk</url> -<repository> -<root>file:///home/warner/stuff/Projects/BuildBot/trees/svnpoller/_trial_temp/test_vc/repositories/SVN-Repository</root> -<uuid>c0f47ff4-ba1e-0410-96b5-d44cc5c79e7f</uuid> -</repository> -<commit - revision="1"> -<author>warner</author> -<date>2006-10-01T07:37:02.286440Z</date> -</commit> -</entry> -</info> -""" - - - -# output from svn log on .../SVN-Repository/sample -# (so it includes trunk and branches) -sample_base = ("file:///usr/home/warner/stuff/Projects/BuildBot/trees/misc/" + - "_trial_temp/test_vc/repositories/SVN-Repository/sample") -sample_logentries = [None] * 6 - -sample_logentries[5] = """\ -<logentry - revision="6"> -<author>warner</author> -<date>2006-10-01T19:35:16.165664Z</date> -<paths> -<path - action="D">/sample/branch/version.c</path> -</paths> -<msg>revised_to_2</msg> -</logentry> -""" - -sample_logentries[4] = """\ -<logentry - revision="5"> -<author>warner</author> -<date>2006-10-01T19:35:16.165664Z</date> -<paths> -<path - action="D">/sample/branch</path> -</paths> -<msg>revised_to_2</msg> -</logentry> -""" - -sample_logentries[3] = """\ -<logentry - revision="4"> -<author>warner</author> -<date>2006-10-01T19:35:16.165664Z</date> -<paths> -<path - action="M">/sample/trunk/version.c</path> -</paths> -<msg>revised_to_2</msg> -</logentry> -""" - -sample_logentries[2] = """\ -<logentry - revision="3"> -<author>warner</author> -<date>2006-10-01T19:35:10.215692Z</date> -<paths> -<path - action="M">/sample/branch/main.c</path> -</paths> -<msg>commit_on_branch</msg> -</logentry> -""" - -sample_logentries[1] = """\ -<logentry - revision="2"> -<author>warner</author> -<date>2006-10-01T19:35:09.154973Z</date> -<paths> -<path - copyfrom-path="/sample/trunk" - copyfrom-rev="1" - action="A">/sample/branch</path> -</paths> -<msg>make_branch</msg> -</logentry> -""" - -sample_logentries[0] = """\ -<logentry - revision="1"> -<author>warner</author> -<date>2006-10-01T19:35:08.642045Z</date> -<paths> -<path - action="A">/sample</path> -<path - action="A">/sample/trunk</path> -<path - action="A">/sample/trunk/subdir/subdir.c</path> -<path - action="A">/sample/trunk/main.c</path> -<path - action="A">/sample/trunk/version.c</path> -<path - action="A">/sample/trunk/subdir</path> -</paths> -<msg>sample_project_files</msg> -</logentry> -""" - -sample_info_output = """\ -<?xml version="1.0"?> -<info> -<entry - kind="dir" - path="sample" - revision="4"> -<url>file:///usr/home/warner/stuff/Projects/BuildBot/trees/misc/_trial_temp/test_vc/repositories/SVN-Repository/sample</url> -<repository> -<root>file:///usr/home/warner/stuff/Projects/BuildBot/trees/misc/_trial_temp/test_vc/repositories/SVN-Repository</root> -<uuid>4f94adfc-c41e-0410-92d5-fbf86b7c7689</uuid> -</repository> -<commit - revision="4"> -<author>warner</author> -<date>2006-10-01T19:35:16.165664Z</date> -</commit> -</entry> -</info> -""" - - -changes_output_template = """\ -<?xml version="1.0"?> -<log> -%s</log> -""" - -def make_changes_output(maxrevision): - # return what 'svn log' would have just after the given revision was - # committed - logs = sample_logentries[0:maxrevision] - assert len(logs) == maxrevision - logs.reverse() - output = changes_output_template % ("".join(logs)) - return output - -def make_logentry_elements(maxrevision): - "return the corresponding logentry elements for the given revisions" - doc = xml.dom.minidom.parseString(make_changes_output(maxrevision)) - return doc.getElementsByTagName("logentry") - -def split_file(path): - pieces = path.split("/") - if pieces[0] == "branch": - return dict(branch="branch", path="/".join(pieces[1:])) - if pieces[0] == "trunk": - return dict(path="/".join(pieces[1:])) - raise RuntimeError("there shouldn't be any files like %r" % path) - - -class TestSVNPoller(gpo.GetProcessOutputMixin, - changesource.ChangeSourceMixin, - unittest.TestCase): - - def setUp(self): - self.setUpGetProcessOutput() - return self.setUpChangeSource() - - def tearDown(self): - return self.tearDownChangeSource() - - def attachSVNPoller(self, *args, **kwargs): - s = svnpoller.SVNPoller(*args, **kwargs) - self.attachChangeSource(s) - return s - - def add_svn_command_result(self, command, result): - self.expectCommands( - gpo.Expect('svn', command).stdout(result)) - - - # tests - - def test_describe(self): - s = self.attachSVNPoller('file://') - self.assertSubstring("SVNPoller", s.describe()) - - def test_strip_svnurl(self): - base = "svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk" - s = self.attachSVNPoller(base + "/") - self.failUnlessEqual(s.svnurl, base) - - def do_test_get_prefix(self, base, output, expected): - s = self.attachSVNPoller(base) - self.expectCommands(gpo.Expect('svn', 'info', '--xml', '--non-interactive', base).stdout(output)) - d = s.get_prefix() - def check(prefix): - self.failUnlessEqual(prefix, expected) - self.assertAllCommandsRan() - d.addCallback(check) - return d - - def test_get_prefix_1(self): - base = "svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk" - return self.do_test_get_prefix(base, prefix_output, 'trunk') - - def test_get_prefix_2(self): - base = "svn+ssh://svn.twistedmatrix.com/svn/Twisted" - return self.do_test_get_prefix(base, prefix_output_2, '') - - def test_get_prefix_3(self): - base = ("file:///home/warner/stuff/Projects/BuildBot/trees/" + - "svnpoller/_trial_temp/test_vc/repositories/SVN-Repository") - return self.do_test_get_prefix(base, prefix_output_3, '') - - def test_get_prefix_4(self): - base = ("file:///home/warner/stuff/Projects/BuildBot/trees/" + - "svnpoller/_trial_temp/test_vc/repositories/SVN-Repository/sample/trunk") - return self.do_test_get_prefix(base, prefix_output_3, 'sample/trunk') - - def test_log_parsing(self): - s = self.attachSVNPoller('file:///foo') - output = make_changes_output(4) - entries = s.parse_logs(output) - # no need for elaborate assertions here; this is minidom's logic - self.assertEqual(len(entries), 4) - - def test_get_new_logentries(self): - s = self.attachSVNPoller('file:///foo') - entries = make_logentry_elements(4) - - s.last_change = 4 - new = s.get_new_logentries(entries) - self.assertEqual(s.last_change, 4) - self.assertEqual(len(new), 0) - - s.last_change = 3 - new = s.get_new_logentries(entries) - self.assertEqual(s.last_change, 4) - self.assertEqual(len(new), 1) - - s.last_change = 1 - new = s.get_new_logentries(entries) - self.assertEqual(s.last_change, 4) - self.assertEqual(len(new), 3) - - # special case: if last_change is None, then no new changes are queued - s.last_change = None - new = s.get_new_logentries(entries) - self.assertEqual(s.last_change, 4) - self.assertEqual(len(new), 0) - - def test_create_changes(self): - base = ("file:///home/warner/stuff/Projects/BuildBot/trees/" + - "svnpoller/_trial_temp/test_vc/repositories/SVN-Repository/sample") - s = self.attachSVNPoller(base, split_file=split_file) - s._prefix = "sample" - - logentries = dict(zip(xrange(1, 7), reversed(make_logentry_elements(6)))) - changes = s.create_changes(reversed([ logentries[3], logentries[2] ])) - self.failUnlessEqual(len(changes), 2) - # note that parsing occurs in reverse - self.failUnlessEqual(changes[0]['branch'], "branch") - self.failUnlessEqual(changes[0]['revision'], '2') - self.failUnlessEqual(changes[0]['project'], '') - self.failUnlessEqual(changes[0]['repository'], base) - self.failUnlessEqual(changes[1]['branch'], "branch") - self.failUnlessEqual(changes[1]['files'], ["main.c"]) - self.failUnlessEqual(changes[1]['revision'], '3') - self.failUnlessEqual(changes[1]['project'], '') - self.failUnlessEqual(changes[1]['repository'], base) - - changes = s.create_changes([ logentries[4] ]) - self.failUnlessEqual(len(changes), 1) - self.failUnlessEqual(changes[0]['branch'], None) - self.failUnlessEqual(changes[0]['revision'], '4') - self.failUnlessEqual(changes[0]['files'], ["version.c"]) - - # r5 should *not* create a change as it's a branch deletion - changes = s.create_changes([ logentries[5] ]) - self.failUnlessEqual(len(changes), 0) - - # r6 should create a change as it's not deleting an entire branch - changes = s.create_changes([ logentries[6] ]) - self.failUnlessEqual(len(changes), 1) - self.failUnlessEqual(changes[0]['branch'], 'branch') - self.failUnlessEqual(changes[0]['revision'], '6') - self.failUnlessEqual(changes[0]['files'], ["version.c"]) - - def makeInfoExpect(self): - return gpo.Expect('svn', 'info', '--xml', '--non-interactive', sample_base, - '--username=dustin', '--password=bbrocks') - - def makeLogExpect(self): - return gpo.Expect('svn', 'log', '--xml', '--verbose', '--non-interactive', - '--username=dustin', '--password=bbrocks', - '--limit=100', sample_base) - def test_create_changes_overriden_project(self): - def custom_split_file(path): - f = split_file(path) - if f: - f["project"] = "overriden-project" - f["repository"] = "overriden-repository" - f["codebase"] = "overriden-codebase" - return f - - base = ("file:///home/warner/stuff/Projects/BuildBot/trees/" + - "svnpoller/_trial_temp/test_vc/repositories/SVN-Repository/sample") - s = self.attachSVNPoller(base, split_file=custom_split_file) - s._prefix = "sample" - - logentries = dict(zip(xrange(1, 7), reversed(make_logentry_elements(6)))) - changes = s.create_changes(reversed([ logentries[3], logentries[2] ])) - self.failUnlessEqual(len(changes), 2) - - # note that parsing occurs in reverse - self.failUnlessEqual(changes[0]['branch'], "branch") - self.failUnlessEqual(changes[0]['revision'], '2') - self.failUnlessEqual(changes[0]['project'], "overriden-project") - self.failUnlessEqual(changes[0]['repository'], "overriden-repository") - self.failUnlessEqual(changes[0]['codebase'], "overriden-codebase") - - self.failUnlessEqual(changes[1]['branch'], "branch") - self.failUnlessEqual(changes[1]['files'], ["main.c"]) - self.failUnlessEqual(changes[1]['revision'], '3') - self.failUnlessEqual(changes[1]['project'], "overriden-project") - self.failUnlessEqual(changes[1]['repository'], "overriden-repository") - self.failUnlessEqual(changes[1]['codebase'], "overriden-codebase") - - def test_poll(self): - s = self.attachSVNPoller(sample_base, split_file=split_file, - svnuser='dustin', svnpasswd='bbrocks') - - d = defer.succeed(None) - - - self.expectCommands( - self.makeInfoExpect().stdout(sample_info_output), - self.makeLogExpect().stdout(make_changes_output(1)), - self.makeLogExpect().stdout(make_changes_output(1)), - self.makeLogExpect().stdout(make_changes_output(2)), - self.makeLogExpect().stdout(make_changes_output(4)), - ) - # fire it the first time; it should do nothing - d.addCallback(lambda _ : s.poll()) - def check_first(_): - # no changes generated on the first iteration - self.assertEqual(self.changes_added, []) - self.failUnlessEqual(s.last_change, 1) - d.addCallback(check_first) - - # now fire it again, nothing changing - d.addCallback(lambda _ : s.poll()) - def check_second(_): - self.assertEqual(self.changes_added, []) - self.failUnlessEqual(s.last_change, 1) - d.addCallback(check_second) - - # and again, with r2 this time - d.addCallback(lambda _ : s.poll()) - def check_third(_): - self.assertEqual(len(self.changes_added), 1) - c = self.changes_added[0] - self.failUnlessEqual(c['branch'], "branch") - self.failUnlessEqual(c['revision'], '2') - self.failUnlessEqual(c['files'], ['']) # signals a new branch - self.failUnlessEqual(c['comments'], "make_branch") - self.failUnlessEqual(c['src'], "svn") - self.failUnlessEqual(s.last_change, 2) - d.addCallback(check_third) - - # and again with both r3 and r4 appearing together - def setup_fourth(_): - self.changes_added = [] - d.addCallback(setup_fourth) - d.addCallback(lambda _ : s.poll()) - def check_fourth(_): - self.assertEqual(len(self.changes_added), 2) - c = self.changes_added[0] - self.failUnlessEqual(c['branch'], "branch") - self.failUnlessEqual(c['revision'], '3') - self.failUnlessEqual(c['files'], ["main.c"]) - self.failUnlessEqual(c['comments'], "commit_on_branch") - self.failUnlessEqual(c['src'], "svn") - c = self.changes_added[1] - self.failUnlessEqual(c['branch'], None) - self.failUnlessEqual(c['revision'], '4') - self.failUnlessEqual(c['files'], ["version.c"]) - self.failUnlessEqual(c['comments'], "revised_to_2") - self.failUnlessEqual(c['src'], "svn") - self.failUnlessEqual(s.last_change, 4) - self.assertAllCommandsRan() - d.addCallback(check_fourth) - - return d - - @compat.usesFlushLoggedErrors - def test_poll_get_prefix_exception(self): - s = self.attachSVNPoller(sample_base, split_file=split_file, - svnuser='dustin', svnpasswd='bbrocks') - - self.expectCommands( - self.makeInfoExpect().stderr("error")) - d = s.poll() - @d.addCallback - def check(_): - # should have logged the RuntimeError, but not errback'd from poll - self.assertEqual(len(self.flushLoggedErrors(IOError)), 1) - self.assertAllCommandsRan() - return d - - @compat.usesFlushLoggedErrors - def test_poll_get_logs_exception(self): - s = self.attachSVNPoller(sample_base, split_file=split_file, - svnuser='dustin', svnpasswd='bbrocks') - s._prefix = "abc" # skip the get_prefix stuff - - self.expectCommands( - self.makeLogExpect().stderr("some error")) - d = s.poll() - @d.addCallback - def check(_): - # should have logged the RuntimeError, but not errback'd from poll - self.assertEqual(len(self.flushLoggedErrors(IOError)), 1) - self.assertAllCommandsRan() - return d - - def test_cachepath_empty(self): - cachepath = os.path.abspath('revcache') - if os.path.exists(cachepath): - os.unlink(cachepath) - s = self.attachSVNPoller(sample_base, cachepath=cachepath) - self.assertEqual(s.last_change, None) - - def test_cachepath_full(self): - cachepath = os.path.abspath('revcache') - with open(cachepath, "w") as f: - f.write('33') - s = self.attachSVNPoller(sample_base, cachepath=cachepath) - self.assertEqual(s.last_change, 33) - - s.last_change = 44 - s.finished_ok(None) - with open(cachepath) as f: - self.assertEqual(f.read().strip(), '44') - - @compat.usesFlushLoggedErrors - def test_cachepath_bogus(self): - cachepath = os.path.abspath('revcache') - with open(cachepath, "w") as f: - f.write('nine') - s = self.attachSVNPoller(sample_base, cachepath=cachepath) - self.assertEqual(s.last_change, None) - self.assertEqual(s.cachepath, None) - # it should have called log.err once with a ValueError - self.assertEqual(len(self.flushLoggedErrors(ValueError)), 1) - - def test_constructor_pollinterval(self): - self.attachSVNPoller(sample_base, pollinterval=100) # just don't fail! - - def test_extra_args(self): - extra_args = ['--no-auth-cache',] - base = "svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk" - - s = self.attachSVNPoller(svnurl=base, extra_args=extra_args) - self.failUnlessEqual(s.extra_args, extra_args) - -class TestSplitFile(unittest.TestCase): - def test_split_file_alwaystrunk(self): - self.assertEqual(svnpoller.split_file_alwaystrunk('foo'), dict(path='foo')) - - def test_split_file_branches_trunk(self): - self.assertEqual( - svnpoller.split_file_branches('trunk/'), - (None, '')) - - def test_split_file_branches_trunk_subdir(self): - self.assertEqual( - svnpoller.split_file_branches('trunk/subdir/'), - (None, 'subdir/')) - - def test_split_file_branches_trunk_subfile(self): - self.assertEqual( - svnpoller.split_file_branches('trunk/subdir/file.c'), - (None, 'subdir/file.c')) - - def test_split_file_branches_trunk_invalid(self): - # file named trunk (not a directory): - self.assertEqual( - svnpoller.split_file_branches('trunk'), - None) - - def test_split_file_branches_branch(self): - self.assertEqual( - svnpoller.split_file_branches('branches/1.5.x/'), - ('branches/1.5.x', '')) - - def test_split_file_branches_branch_subdir(self): - self.assertEqual( - svnpoller.split_file_branches('branches/1.5.x/subdir/'), - ('branches/1.5.x', 'subdir/')) - - def test_split_file_branches_branch_subfile(self): - self.assertEqual( - svnpoller.split_file_branches('branches/1.5.x/subdir/file.c'), - ('branches/1.5.x', 'subdir/file.c')) - - def test_split_file_branches_branch_invalid(self): - # file named branches/1.5.x (not a directory): - self.assertEqual( - svnpoller.split_file_branches('branches/1.5.x'), - None) - - def test_split_file_branches_otherdir(self): - # other dirs are ignored: - self.assertEqual( - svnpoller.split_file_branches('tags/testthis/subdir/'), - None) - - def test_split_file_branches_otherfile(self): - # other files are ignored: - self.assertEqual( - svnpoller.split_file_branches('tags/testthis/subdir/file.c'), - None) - - def test_split_file_projects_branches(self): - self.assertEqual( - svnpoller.split_file_projects_branches('buildbot/trunk/subdir/file.c'), - dict(project='buildbot', path='subdir/file.c')) - self.assertEqual( - svnpoller.split_file_projects_branches('buildbot/branches/1.5.x/subdir/file.c'), - dict(project='buildbot', branch='branches/1.5.x', path='subdir/file.c')) - # tags are ignored: - self.assertEqual( - svnpoller.split_file_projects_branches('buildbot/tags/testthis/subdir/file.c'), - None) - |