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)