Index: mergebot/trunk/utils/test.py
===================================================================
--- mergebot/trunk/utils/test.py	(revision 63)
+++ mergebot/trunk/utils/test.py	(revision 64)
@@ -5,4 +5,10 @@
 to be reworked to be less cumbersome.)
 """
+
+# TODO: The testcases need to be extended to cover the following:
+# - using a ticket #number as a version
+# - using a release version number as a version
+# - verify inter-ticket dependency checking
+# - verify failure cascades through inter-ticket dependencies
 
 import os
@@ -214,4 +220,7 @@
         self.assertEqual(retval, 0, "svn checkout failed with error %s" % (retval))
 
+    def cleanup(self):
+        shutil.rmtree(self.get_workdir())
+
     def switch(self, ticket_id=None):
         if ticket_id is None:
@@ -326,4 +335,5 @@
         self._tester.merge(ticket_id, 'stuff')
 
+        self.cleanup()
 
 class MergeBotTestMergeWithChangeAndTrunkChange(FunctionalSvnTestCaseSetup):
@@ -374,4 +384,6 @@
         self._tester.merge_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestMergeWithPropertyConflict(FunctionalSvnTestCaseSetup):
@@ -401,4 +413,6 @@
         self._tester.merge_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestMergeWithPropertyBranchDeleteConflict(FunctionalSvnTestCaseSetup):
@@ -428,4 +442,6 @@
         self._tester.merge_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestMergeWithPropertyTrunkDeleteConflict(FunctionalSvnTestCaseSetup):
@@ -455,4 +471,6 @@
         self._tester.merge_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestMergeWithBranchRenameConflict(FunctionalSvnTestCaseSetup):
@@ -481,4 +499,6 @@
 
         self._tester.merge_conflict(ticket_id, 'stuff')
+
+        self.cleanup()
 
 
@@ -509,4 +529,6 @@
         # make sure it finds the conflict
         self._tester.merge_conflict(ticket_id, 'stuff')
+
+        self.cleanup()
 
 
@@ -534,4 +556,5 @@
 
         self._tester.rebranch(ticket_id, 'stuff')
+        self.cleanup()
 
 
@@ -554,4 +577,5 @@
 
         self._tester.rebranch(ticket_id, 'stuff')
+        self.cleanup()
 
 
@@ -582,4 +606,6 @@
         # rebranch, make sure it shows a conflict
         self._tester.rebranch_conflict(ticket_id, 'stuff')
+
+        self.cleanup()
 
 
@@ -610,4 +636,6 @@
         self._tester.rebranch_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestRebranchWithPropertyBranchDeleteConflict(FunctionalSvnTestCaseSetup):
@@ -637,4 +665,6 @@
         self._tester.rebranch_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestRebranchWithPropertyTrunkDeleteConflict(FunctionalSvnTestCaseSetup):
@@ -664,4 +694,6 @@
         self._tester.rebranch_conflict(ticket_id, 'stuff')
 
+        self.cleanup()
+
 
 class MergeBotTestRebranchWithBranchRenameConflict(FunctionalSvnTestCaseSetup):
@@ -690,4 +722,6 @@
 
         self._tester.rebranch_conflict(ticket_id, 'stuff')
+
+        self.cleanup()
 
 
@@ -719,6 +753,8 @@
         self._tester.rebranch_conflict(ticket_id, 'stuff')
 
-
-class MergeBotTestSingleUseCase(FunctionalTwillTestCaseSetup):
+        self.cleanup()
+
+
+class MergeBotTestSingleUseCase(FunctionalSvnTestCaseSetup):
     def runTest(self):
         """Create a branch, make a change, checkmerge, and merge it."""
@@ -727,25 +763,36 @@
         self._tester.branch(ticket_id, 'stuff')
         # checkout a working copy & make a change
-        svnurl = self._testenv.repo_url()
-        workdir = os.path.join(self._testenv.dirname, self.__class__.__name__)
-        retval = call(['svn', 'checkout', svnurl + '/stuff/branches/ticket-%s' % ticket_id, workdir],
-            stdout=logfile, stderr=logfile)
-        self.assertEqual(retval, 0, "svn checkout failed with error %s" % (retval))
+        self.checkout(ticket_id)
         # Create & add a new file
-        newfile = os.path.join(workdir, self.__class__.__name__)
-        open(newfile, 'w').write(random_page())
-        retval = call(['svn', 'add', self.__class__.__name__],
-            cwd=workdir,
-            stdout=logfile, stderr=logfile)
-        self.assertEqual(retval, 0, "svn add failed with error %s" % (retval))
-        retval = call(['svn', 'commit', '-m', 'Add a new file', self.__class__.__name__],
-            cwd=workdir,
-            stdout=logfile, stderr=logfile)
-        self.assertEqual(retval, 0, "svn commit failed with error %s" % (retval))
-
+        self.add_new_file()
+        self.commit('Add a new file')
         self._tester.checkmerge(ticket_id, 'stuff')
         self._tester.merge(ticket_id, 'stuff')
-
-        shutil.rmtree(workdir) # cleanup working copy
+        self.cleanup()
+
+
+class MergeBotTestBranchReuse(FunctionalSvnTestCaseSetup):
+    def runTest(self):
+        """Merge a branch, branch it again, and merge it a second time."""
+        ticket_id = self._tester.create_ticket(summary=self.__class__.__name__,
+            info={'component':'stuff', 'version':'trunk'})
+        basename = self.__class__.__name__
+
+        self.checkout()
+        self.add_new_file(basename)
+        self.commit('Add a new file')
+
+        self._tester.branch(ticket_id, 'stuff')
+        self.switch(ticket_id)
+        open(os.path.join(self.get_workdir(), basename), 'a').write(random_sentence())
+        self.commit('Make a modification')
+        self._tester.merge(ticket_id, 'stuff')
+
+        self._tester.branch(ticket_id, 'stuff')
+        self.switch(ticket_id)
+        open(os.path.join(self.get_workdir(), basename), 'a').write(random_sentence())
+        self.commit('Make a second modification')
+        self._tester.merge(ticket_id, 'stuff')
+        self.cleanup()
 
 
@@ -775,4 +822,5 @@
     suite.addTest(MergeBotTestMergeWithPropertyTrunkDeleteConflict())
     suite.addTest(MergeBotTestSingleUseCase())
+    suite.addTest(MergeBotTestBranchReuse())
     return suite
 
