Hi,

On Tue, Apr 22, 2008 at 02:02:59PM -0600, dann frazier wrote:
> On Tue, Apr 22, 2008 at 08:51:56PM +0200, Robert Hunger wrote:
> > (1) a symbolic link which points to an existing directory when checked out
> > (2) a symbolic link which is broken when checked out
> 
> *sigh* - more symlink fun. Thanks for the patch Robert - at first
> glance, it looks good. Would you mind adding the corresponding tests
> cases?

You are right, testing rocks.

I added some symlink related tests to test.py (see attached
patch). The tests trigger 3 failures when run with svn-load
version 0.9. The other changes to test.py are:

1) Check successful run of BaseLoadCase.loaddir() with
   self.failUnless(self.loaddir(d)). svn-load should run
   successfully, otherwise the subsequent tests don't really
   make sense. For this to work my patch from bugreport 476569
   (see [1]) is needed too.
2) Create a common temporary directory in BaseLoadCase.tempdir.
   This helped me setting up the new tests.
3) unittest.main(defaultTest=defaultTest)
   To be able to run a single test right from the command line.

Robert

[1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=476569
--- svn-load-0.9.orig/test.py   2008-04-09 01:32:56.000000000 +0000
+++ svn-load-0.9/test.py        2008-04-23 13:49:56.000000000 +0000
@@ -50,9 +50,11 @@
 ## to inherit and do more complex things
 class BaseLoadCase(unittest.TestCase):
     def setUp(self):
+        self.tempdir = tempfile.mkdtemp()
         self.importDirSetUp()
         self.loadDirsSetUp()
-        self.exportparent = tempfile.mkdtemp()
+        self.exportparent = os.path.join(self.tempdir, "exportparent")
+        os.mkdir(self.exportparent)
         self.repo = self.createRepository()
         self.url = 'file://' + self.repo
         ## idir is the relative path in repo where things get imported
@@ -60,30 +62,32 @@
         self.extra_args = []
 
     def importDirSetUp(self):
-        self.importdir = tempfile.mkdtemp()
+        self.importdir = os.path.join(self.tempdir, "importdir")
+        os.mkdir(self.importdir)
 
     def loadDirsSetUp(self):
-        self.loaddirs = [tempfile.mkdtemp()]
+        self.loaddirs = [os.path.join(self.tempdir, "loaddir0")]
+        os.mkdir(self.loaddirs[0])
         
     def tearDown(self):
-        for d in self.loaddirs + [self.importdir, self.repo, 
self.exportparent]:
-            if d:
-                shutil.rmtree(d)
+        #print "\nTest working directory: %s" % self.tempdir
+        shutil.rmtree(self.tempdir)
 
     def createRepository(self):
         svnadmin = '/usr/bin/svnadmin'
-        repo = tempfile.mkdtemp()
+        repo = os.path.join(self.tempdir, "repo")
+        os.mkdir(repo)
         os.spawnl(os.P_WAIT, svnadmin, svnadmin, 'create', repo)
         return repo
 
     def exportRepository(self):
         svn = '/usr/bin/svn'
-        ret = os.spawnl(os.P_WAIT, svn, svn, 'export', self.url,
+        ret = os.spawnl(os.P_WAIT, svn, svn, 'export', '--quiet', self.url,
                         os.path.join(self.exportparent, 'export'))
         if ret == 0:
             return True
         else:
-            return None
+            return False
 
     def loaddir(self, ldir):
         svnloaddirs = "./svn-load"
@@ -138,7 +142,7 @@
         client = pysvn.Client()
         client.import_(self.importdir, self.url, 'Initial import')
         for d in self.loaddirs:
-            self.loaddir(d)
+            self.failUnless(self.loaddir(d))
             self.failUnless(self.exportRepository())
             self.failUnless(self.compare_trees(d, 
os.path.join(self.exportparent, 'export')))
 
@@ -241,7 +245,7 @@
         client = pysvn.Client()
         client.import_(self.importdir, self.url, 'Initial import')
         
-        self.loaddir(self.loaddirs[0])
+        self.failUnless(self.loaddir(self.loaddirs[0]))
         log = client.log(os.path.join(self.url, self.idir), limit=1,
                          discover_changed_paths=True)[0]
         changed_paths = log['changed_paths']
@@ -351,6 +355,17 @@
         f.close()
         os.symlink('foo', os.path.join(self.loaddirs[0], 'bar'))
 
+class SingleFileToDirectorySymLink(BaseLoadCase):
+    def importDirSetUp(self):
+        BaseLoadCase.importDirSetUp(self)
+        os.mkdir(os.path.join(self.importdir, 'foo'))
+        open(os.path.join(self.importdir, 'bar'), 'w').close()
+
+    def loadDirsSetUp(self):
+        BaseLoadCase.loadDirsSetUp(self)
+        os.mkdir(os.path.join(self.loaddirs[0], 'foo'))
+        os.symlink('foo', os.path.join(self.loaddirs[0], 'bar'))
+
 class BrokenSymLinkToFile(BaseLoadCase):
     def importDirSetUp(self):
         BaseLoadCase.importDirSetUp(self)
@@ -362,6 +377,70 @@
         f.write("bar\n")
         f.close()
 
+class SymLinkToFile(BaseLoadCase):
+    def importDirSetUp(self):
+        BaseLoadCase.importDirSetUp(self)
+        open(os.path.join(self.importdir, 'foo'), 'w').close()
+        os.symlink('foo', os.path.join(self.importdir, 'bar'))
+
+    def loadDirsSetUp(self):
+        BaseLoadCase.loadDirsSetUp(self)
+        open(os.path.join(self.loaddirs[0], 'foo'), 'w').close()
+        open(os.path.join(self.loaddirs[0], 'bar'), 'w').close()
+
+class DirectorySymLinkToFile(BaseLoadCase):
+    def importDirSetUp(self):
+        BaseLoadCase.importDirSetUp(self)
+        os.mkdir(os.path.join(self.importdir, 'foo'))
+        os.symlink('foo', os.path.join(self.importdir, 'bar'))
+
+    def loadDirsSetUp(self):
+        BaseLoadCase.loadDirsSetUp(self)
+        os.mkdir(os.path.join(self.loaddirs[0], 'foo'))
+        open(os.path.join(self.loaddirs[0], 'bar'), 'w').close()
+
+
+class ReimportSymlinkBase(BaseLoadCase):
+    def _fillDirectory(self, directory):
+        # overwrite in derived class
+        pass
+
+    def importDirSetUp(self):
+        BaseLoadCase.importDirSetUp(self)
+        self._fillDirectory(self.importdir)
+
+    def loadDirsSetUp(self):
+        BaseLoadCase.loadDirsSetUp(self)
+        self._fillDirectory(self.loaddirs[0])
+        # create files one alphabetically before and one after 'bar'
+        open(os.path.join(self.loaddirs[0], 'a-file'), 'w').close()
+        open(os.path.join(self.loaddirs[0], 'zoo-file'), 'w').close()
+        # create a subdirectory hierarchy
+        os.mkdir(os.path.join(self.loaddirs[0], 'zoo'))
+        os.mkdir(os.path.join(self.loaddirs[0], 'zoo', 'subzoo'))
+        os.mkdir(os.path.join(self.loaddirs[0], 'zoo', 'subzoo', 'subsubzoo'))
+        open(os.path.join(self.loaddirs[0], 'zoo', 'subzoo', 'subsubzoo',
+                          'subsubzoo-file'),
+             'w').close()
+
+class ReimportSymlink(ReimportSymlinkBase):
+    def _fillDirectory(self, directory):
+        open(os.path.join(directory, 'foo'), 'w').close()
+        os.symlink('foo', os.path.join(directory, 'bar'))
+
+class ReimportSymlinkToDirectory(ReimportSymlinkBase):
+    """svn-load version 0.9 fails on this and _commits_ an
+    _inconsistent_ content
+    """
+    def _fillDirectory(self, directory):
+        os.mkdir(os.path.join(directory, 'foo'))
+        os.symlink('foo', os.path.join(directory, 'bar'))        
+
+class ReimportBrokenSymlink(ReimportSymlinkBase):
+    def _fillDirectory(self, directory):
+        os.symlink('foo', os.path.join(directory, 'bar'))
+
+
 class SyblingDirSymlink(BaseLoadCase):
     def loadDirsSetUp(self):
         BaseLoadCase.loadDirsSetUp(self)
@@ -388,7 +467,8 @@
 ## On Windows it should work because svn-load expands the glob
 class GlobHandling(BaseLoadCase):
     def loadDirsSetUp(self):
-        self.loaddirparent = tempfile.mkdtemp()
+        self.loaddirparent = os.path.join(self.tempdir, "loaddirparent")
+        os.mkdir(self.loaddirparent)
         self.loaddirs = [os.path.join(self.loaddirparent, 'foo'),
                          os.path.join(self.loaddirparent, 'foo2')]
         for d in self.loaddirs:
@@ -409,4 +489,8 @@
 if __name__ == '__main__':
 #    suite = unittest.TestLoader().loadTestsFromTestCase(GlobHandling)
 #    unittest.TextTestRunner().run(suite)
-    unittest.main()
+     try:
+         defaultTest=sys.argv[1]
+     except:
+         defaultTest=None
+     unittest.main(defaultTest=defaultTest)

Reply via email to