Index: third_party/twisted_8_1/twisted/test/test_paths.py |
diff --git a/third_party/twisted_8_1/twisted/test/test_paths.py b/third_party/twisted_8_1/twisted/test/test_paths.py |
deleted file mode 100644 |
index fe4f925eceec290ab1535e04ffa011f6ebc9354a..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/test/test_paths.py |
+++ /dev/null |
@@ -1,648 +0,0 @@ |
-# Copyright (c) 2001-2008 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-""" |
-Test cases covering L{twisted.python.filepath} and L{twisted.python.zippath}. |
-""" |
- |
-import os, time, pickle, errno, zipfile, stat |
- |
-from twisted.python.win32 import WindowsError, ERROR_DIRECTORY |
-from twisted.python import filepath |
-from twisted.python.zippath import ZipArchive |
-from twisted.python.runtime import platform |
- |
-from twisted.trial import unittest |
- |
- |
-class AbstractFilePathTestCase(unittest.TestCase): |
- |
- f1content = "file 1" |
- f2content = "file 2" |
- |
- def _mkpath(self, *p): |
- x = os.path.abspath(os.path.join(self.cmn, *p)) |
- self.all.append(x) |
- return x |
- |
- def subdir(self, *dirname): |
- os.mkdir(self._mkpath(*dirname)) |
- |
- def subfile(self, *dirname): |
- return open(self._mkpath(*dirname), "wb") |
- |
- def setUp(self): |
- self.now = time.time() |
- cmn = self.cmn = os.path.abspath(self.mktemp()) |
- self.all = [cmn] |
- os.mkdir(cmn) |
- self.subdir("sub1") |
- f = self.subfile("file1") |
- f.write(self.f1content) |
- f = self.subfile("sub1", "file2") |
- f.write(self.f2content) |
- self.subdir('sub3') |
- f = self.subfile("sub3", "file3.ext1") |
- f = self.subfile("sub3", "file3.ext2") |
- f = self.subfile("sub3", "file3.ext3") |
- self.all.sort() |
- |
- self.path = filepath.FilePath(cmn) |
- |
- def test_segmentsFromPositive(self): |
- """ |
- Verify that the segments between two paths are correctly identified. |
- """ |
- self.assertEquals( |
- self.path.child("a").child("b").child("c").segmentsFrom(self.path), |
- ["a", "b", "c"]) |
- |
- def test_segmentsFromNegative(self): |
- """Verify that segmentsFrom notices when the ancestor isn't an ancestor. |
- """ |
- self.assertRaises( |
- ValueError, |
- self.path.child("a").child("b").child("c").segmentsFrom, |
- self.path.child("d").child("c").child("e")) |
- |
- def test_walk(self): |
- """Verify that walking the path gives the same result as the known file |
- hierarchy. |
- """ |
- x = [foo.path for foo in self.path.walk()] |
- x.sort() |
- self.assertEquals(x, self.all) |
- |
- def test_validSubdir(self): |
- """Verify that a valid subdirectory will show up as a directory, but not as a |
- file, not as a symlink, and be listable. |
- """ |
- sub1 = self.path.child('sub1') |
- self.failUnless(sub1.exists(), |
- "This directory does exist.") |
- self.failUnless(sub1.isdir(), |
- "It's a directory.") |
- self.failUnless(not sub1.isfile(), |
- "It's a directory.") |
- self.failUnless(not sub1.islink(), |
- "It's a directory.") |
- self.failUnlessEqual(sub1.listdir(), |
- ['file2']) |
- |
- |
- def test_invalidSubdir(self): |
- """ |
- Verify that a subdirectory that doesn't exist is reported as such. |
- """ |
- sub2 = self.path.child('sub2') |
- self.failIf(sub2.exists(), |
- "This directory does not exist.") |
- |
- def test_validFiles(self): |
- """ |
- Make sure that we can read existent non-empty files. |
- """ |
- f1 = self.path.child('file1') |
- self.failUnlessEqual(f1.open().read(), self.f1content) |
- f2 = self.path.child('sub1').child('file2') |
- self.failUnlessEqual(f2.open().read(), self.f2content) |
- |
- |
- def test_dictionaryKeys(self): |
- """ |
- Verify that path instances are usable as dictionary keys. |
- """ |
- f1 = self.path.child('file1') |
- f1prime = self.path.child('file1') |
- f2 = self.path.child('file2') |
- dictoid = {} |
- dictoid[f1] = 3 |
- dictoid[f1prime] = 4 |
- self.assertEquals(dictoid[f1], 4) |
- self.assertEquals(dictoid.keys(), [f1]) |
- self.assertIdentical(dictoid.keys()[0], f1) |
- self.assertNotIdentical(dictoid.keys()[0], f1prime) # sanity check |
- dictoid[f2] = 5 |
- self.assertEquals(dictoid[f2], 5) |
- self.assertEquals(len(dictoid), 2) |
- |
- |
- def test_dictionaryKeyWithString(self): |
- """ |
- Verify that path instances are usable as dictionary keys which do not clash |
- with their string counterparts. |
- """ |
- f1 = self.path.child('file1') |
- dictoid = {f1: 'hello'} |
- dictoid[f1.path] = 'goodbye' |
- self.assertEquals(len(dictoid), 2) |
- |
- |
- def test_childrenNonexistentError(self): |
- """ |
- Verify that children raises the appropriate exception for non-existent |
- directories. |
- """ |
- self.assertRaises(filepath.UnlistableError, |
- self.path.child('not real').children) |
- |
- def test_childrenNotDirectoryError(self): |
- """ |
- Verify that listdir raises the appropriate exception for attempting to list |
- a file rather than a directory. |
- """ |
- self.assertRaises(filepath.UnlistableError, |
- self.path.child('file1').children) |
- |
- |
- def test_newTimesAreFloats(self): |
- """ |
- Verify that all times returned from the various new time functions are ints |
- (and hopefully therefore 'high precision'). |
- """ |
- for p in self.path, self.path.child('file1'): |
- self.failUnlessEqual(type(p.getAccessTime()), float) |
- self.failUnlessEqual(type(p.getModificationTime()), float) |
- self.failUnlessEqual(type(p.getStatusChangeTime()), float) |
- |
- |
- def test_oldTimesAreInts(self): |
- """ |
- Verify that all times returned from the various time functions are |
- integers, for compatibility. |
- """ |
- for p in self.path, self.path.child('file1'): |
- self.failUnlessEqual(type(p.getatime()), int) |
- self.failUnlessEqual(type(p.getmtime()), int) |
- self.failUnlessEqual(type(p.getctime()), int) |
- |
- |
- |
-class FakeWindowsPath(filepath.FilePath): |
- """ |
- A test version of FilePath which overrides listdir to raise L{WindowsError}. |
- """ |
- |
- def listdir(self): |
- """ |
- @raise WindowsError: always. |
- """ |
- raise WindowsError( |
- ERROR_DIRECTORY, |
- "A directory's validness was called into question") |
- |
- |
-class ListingCompatibilityTests(unittest.TestCase): |
- """ |
- These tests verify compatibility with legacy behavior of directory listing. |
- """ |
- |
- def test_windowsErrorExcept(self): |
- """ |
- Verify that when a WindowsError is raised from listdir, catching |
- WindowsError works. |
- """ |
- fwp = FakeWindowsPath(self.mktemp()) |
- self.assertRaises(filepath.UnlistableError, fwp.children) |
- self.assertRaises(WindowsError, fwp.children) |
- |
- |
- def test_alwaysCatchOSError(self): |
- """ |
- Verify that in the normal case where a directory does not exist, we will |
- get an OSError. |
- """ |
- fp = filepath.FilePath(self.mktemp()) |
- self.assertRaises(OSError, fp.children) |
- |
- |
- def test_keepOriginalAttributes(self): |
- """ |
- Verify that the Unlistable exception raised will preserve the attributes of |
- the previously-raised exception. |
- """ |
- fp = filepath.FilePath(self.mktemp()) |
- ose = self.assertRaises(OSError, fp.children) |
- d1 = ose.__dict__.keys() |
- d1.remove('originalException') |
- d2 = ose.originalException.__dict__.keys() |
- d1.sort() |
- d2.sort() |
- self.assertEquals(d1, d2) |
- |
- |
- |
-def zipit(dirname, zfname): |
- """ |
- create a zipfile on zfname, containing the contents of dirname' |
- """ |
- zf = zipfile.ZipFile(zfname, "w") |
- basedir = os.path.basename(dirname) |
- for root, dirs, files, in os.walk(dirname): |
- for fname in files: |
- fspath = os.path.join(root, fname) |
- arcpath = os.path.join(root, fname)[len(dirname)+1:] |
- # print fspath, '=>', arcpath |
- zf.write(fspath, arcpath) |
- zf.close() |
- |
-class ZipFilePathTestCase(AbstractFilePathTestCase): |
- |
- def setUp(self): |
- AbstractFilePathTestCase.setUp(self) |
- zipit(self.cmn, self.cmn+'.zip') |
- self.path = ZipArchive(self.cmn+'.zip') |
- self.all = [x.replace(self.cmn, self.cmn+'.zip') for x in self.all] |
- |
- |
-class FilePathTestCase(AbstractFilePathTestCase): |
- |
- def test_chmod(self): |
- """ |
- Make sure that calling L{FilePath.chmod} modifies the permissions of |
- the passed file as expected (using C{os.stat} to check). We use some |
- basic modes that should work everywhere (even on Windows). |
- """ |
- for mode in (0555, 0777): |
- self.path.child("sub1").chmod(mode) |
- self.assertEquals( |
- stat.S_IMODE(os.stat(self.path.child("sub1").path).st_mode), |
- mode) |
- |
- |
- def test_getAndSet(self): |
- content = 'newcontent' |
- self.path.child('new').setContent(content) |
- newcontent = self.path.child('new').getContent() |
- self.failUnlessEqual(content, newcontent) |
- content = 'content' |
- self.path.child('new').setContent(content, '.tmp') |
- newcontent = self.path.child('new').getContent() |
- self.failUnlessEqual(content, newcontent) |
- |
- |
- def test_symbolicLink(self): |
- """ |
- Verify the behavior of the C{isLink} method against links and |
- non-links. Also check that the symbolic link shares the directory |
- property with its target. |
- """ |
- s4 = self.path.child("sub4") |
- s3 = self.path.child("sub3") |
- os.symlink(s3.path, s4.path) |
- self.assertTrue(s4.islink()) |
- self.assertFalse(s3.islink()) |
- self.assertTrue(s4.isdir()) |
- self.assertTrue(s3.isdir()) |
- |
- |
- def test_linkTo(self): |
- """ |
- Verify that symlink creates a valid symlink that is both a link and a |
- file if its target is a file, or a directory if its target is a |
- directory. |
- """ |
- targetLinks = [ |
- (self.path.child("sub2"), self.path.child("sub2.link")), |
- (self.path.child("sub2").child("file3.ext1"), |
- self.path.child("file3.ext1.link")) |
- ] |
- for target, link in targetLinks: |
- target.linkTo(link) |
- self.assertTrue(link.islink(), "This is a link") |
- self.assertEquals(target.isdir(), link.isdir()) |
- self.assertEquals(target.isfile(), link.isfile()) |
- |
- |
- def test_linkToErrors(self): |
- """ |
- Verify C{linkTo} fails in the following case: |
- - the target is in a directory that doesn't exist |
- - the target already exists |
- """ |
- self.assertRaises(OSError, self.path.child("file1").linkTo, |
- self.path.child('nosub').child('file1')) |
- self.assertRaises(OSError, self.path.child("file1").linkTo, |
- self.path.child('sub1').child('file2')) |
- |
- |
- if not getattr(os, "symlink", None): |
- skipMsg = "Your platform does not support symbolic links." |
- test_symbolicLink.skip = skipMsg |
- test_linkTo.skip = skipMsg |
- test_linkToErrors.skip = skipMsg |
- |
- |
- def testMultiExt(self): |
- f3 = self.path.child('sub3').child('file3') |
- exts = '.foo','.bar', 'ext1','ext2','ext3' |
- self.failIf(f3.siblingExtensionSearch(*exts)) |
- f3e = f3.siblingExtension(".foo") |
- f3e.touch() |
- self.failIf(not f3.siblingExtensionSearch(*exts).exists()) |
- self.failIf(not f3.siblingExtensionSearch('*').exists()) |
- f3e.remove() |
- self.failIf(f3.siblingExtensionSearch(*exts)) |
- |
- def testPreauthChild(self): |
- fp = filepath.FilePath('.') |
- fp.preauthChild('foo/bar') |
- self.assertRaises(filepath.InsecurePath, fp.child, '/foo') |
- |
- def testStatCache(self): |
- p = self.path.child('stattest') |
- p.touch() |
- self.failUnlessEqual(p.getsize(), 0) |
- self.failUnlessEqual(abs(p.getmtime() - time.time()) // 20, 0) |
- self.failUnlessEqual(abs(p.getctime() - time.time()) // 20, 0) |
- self.failUnlessEqual(abs(p.getatime() - time.time()) // 20, 0) |
- self.failUnlessEqual(p.exists(), True) |
- self.failUnlessEqual(p.exists(), True) |
- # OOB removal: FilePath.remove() will automatically restat |
- os.remove(p.path) |
- # test caching |
- self.failUnlessEqual(p.exists(), True) |
- p.restat(reraise=False) |
- self.failUnlessEqual(p.exists(), False) |
- self.failUnlessEqual(p.islink(), False) |
- self.failUnlessEqual(p.isdir(), False) |
- self.failUnlessEqual(p.isfile(), False) |
- |
- def testPersist(self): |
- newpath = pickle.loads(pickle.dumps(self.path)) |
- self.failUnlessEqual(self.path.__class__, newpath.__class__) |
- self.failUnlessEqual(self.path.path, newpath.path) |
- |
- def testInsecureUNIX(self): |
- self.assertRaises(filepath.InsecurePath, self.path.child, "..") |
- self.assertRaises(filepath.InsecurePath, self.path.child, "/etc") |
- self.assertRaises(filepath.InsecurePath, self.path.child, "../..") |
- |
- def testInsecureWin32(self): |
- self.assertRaises(filepath.InsecurePath, self.path.child, r"..\..") |
- self.assertRaises(filepath.InsecurePath, self.path.child, r"C:randomfile") |
- |
- if platform.getType() != 'win32': |
- testInsecureWin32.skip = "Consider yourself lucky." |
- |
- def testInsecureWin32Whacky(self): |
- """Windows has 'special' filenames like NUL and CON and COM1 and LPR |
- and PRN and ... god knows what else. They can be located anywhere in |
- the filesystem. For obvious reasons, we do not wish to normally permit |
- access to these. |
- """ |
- self.assertRaises(filepath.InsecurePath, self.path.child, "CON") |
- self.assertRaises(filepath.InsecurePath, self.path.child, "C:CON") |
- self.assertRaises(filepath.InsecurePath, self.path.child, r"C:\CON") |
- |
- if platform.getType() != 'win32': |
- testInsecureWin32Whacky.skip = "Consider yourself lucky." |
- |
- def testComparison(self): |
- self.assertEquals(filepath.FilePath('a'), |
- filepath.FilePath('a')) |
- self.failUnless(filepath.FilePath('z') > |
- filepath.FilePath('a')) |
- self.failUnless(filepath.FilePath('z') >= |
- filepath.FilePath('a')) |
- self.failUnless(filepath.FilePath('a') >= |
- filepath.FilePath('a')) |
- self.failUnless(filepath.FilePath('a') <= |
- filepath.FilePath('a')) |
- self.failUnless(filepath.FilePath('a') < |
- filepath.FilePath('z')) |
- self.failUnless(filepath.FilePath('a') <= |
- filepath.FilePath('z')) |
- self.failUnless(filepath.FilePath('a') != |
- filepath.FilePath('z')) |
- self.failUnless(filepath.FilePath('z') != |
- filepath.FilePath('a')) |
- |
- self.failIf(filepath.FilePath('z') != |
- filepath.FilePath('z')) |
- |
- def testSibling(self): |
- p = self.path.child('sibling_start') |
- ts = p.sibling('sibling_test') |
- self.assertEquals(ts.dirname(), p.dirname()) |
- self.assertEquals(ts.basename(), 'sibling_test') |
- ts.createDirectory() |
- self.assertIn(ts, self.path.children()) |
- |
- def testTemporarySibling(self): |
- ts = self.path.temporarySibling() |
- self.assertEquals(ts.dirname(), self.path.dirname()) |
- self.assertNotIn(ts.basename(), self.path.listdir()) |
- ts.createDirectory() |
- self.assertIn(ts, self.path.parent().children()) |
- |
- def testRemove(self): |
- self.path.remove() |
- self.failIf(self.path.exists()) |
- |
- |
- def test_removeWithSymlink(self): |
- """ |
- For a path which is a symbolic link, L{FilePath.remove} just deletes |
- the link, not the target. |
- """ |
- link = self.path.child("sub1.link") |
- # setUp creates the sub1 child |
- os.symlink(self.path.child("sub1").path, link.path) |
- link.remove() |
- self.assertFalse(link.exists()) |
- self.assertTrue(self.path.child("sub1").exists()) |
- |
- if getattr(os, 'symlink', None) is None: |
- test_removeWithSymlink.skip = "Platform doesn't support symbolic links" |
- |
- |
- def testCopyTo(self): |
- self.assertRaises((OSError, IOError), self.path.copyTo, self.path.child('file1')) |
- oldPaths = list(self.path.walk()) # Record initial state |
- fp = filepath.FilePath(self.mktemp()) |
- self.path.copyTo(fp) |
- self.path.remove() |
- fp.copyTo(self.path) |
- newPaths = list(self.path.walk()) # Record double-copy state |
- newPaths.sort() |
- oldPaths.sort() |
- self.assertEquals(newPaths, oldPaths) |
- |
- def testMoveTo(self): |
- self.assertRaises((OSError, IOError), self.path.moveTo, self.path.child('file1')) |
- oldPaths = list(self.path.walk()) # Record initial state |
- fp = filepath.FilePath(self.mktemp()) |
- self.path.moveTo(fp) |
- fp.moveTo(self.path) |
- newPaths = list(self.path.walk()) # Record double-move state |
- newPaths.sort() |
- oldPaths.sort() |
- self.assertEquals(newPaths, oldPaths) |
- |
- |
- def test_crossMountMoveTo(self): |
- """ |
- C{moveTo} should be able to handle C{EXDEV} error raised by |
- C{os.rename} when trying to move a file on a different mounted |
- filesystem. |
- """ |
- # Bit of a whitebox test - force os.rename, which moveTo tries |
- # before falling back to a slower method, to fail, forcing moveTo to |
- # use the slower behavior. |
- invokedWith = [] |
- def faultyRename(src, dest): |
- invokedWith.append((src, dest)) |
- if len(invokedWith) == 2: |
- raise OSError(errno.EXDEV, 'Test-induced failure simulating cross-device rename failure') |
- return originalRename(src, dest) |
- |
- originalRename = os.rename |
- os.rename = faultyRename |
- try: |
- self.testMoveTo() |
- # A bit of a sanity check for this whitebox test - if our rename |
- # was never invoked, the test has probably fallen into |
- # disrepair! |
- self.failUnless(len(invokedWith) >= 2) |
- finally: |
- os.rename = originalRename |
- |
- |
- def testOpen(self): |
- # Opening a file for reading when it does not already exist is an error |
- nonexistent = self.path.child('nonexistent') |
- e = self.assertRaises(IOError, nonexistent.open) |
- self.assertEquals(e.errno, errno.ENOENT) |
- |
- # Opening a file for writing when it does not exist is okay |
- writer = self.path.child('writer') |
- f = writer.open('w') |
- f.write('abc\ndef') |
- f.close() |
- |
- # Make sure those bytes ended up there - and test opening a file for |
- # reading when it does exist at the same time |
- f = writer.open() |
- self.assertEquals(f.read(), 'abc\ndef') |
- f.close() |
- |
- # Re-opening that file in write mode should erase whatever was there. |
- f = writer.open('w') |
- f.close() |
- f = writer.open() |
- self.assertEquals(f.read(), '') |
- f.close() |
- |
- # Put some bytes in a file so we can test that appending does not |
- # destroy them. |
- appender = self.path.child('appender') |
- f = appender.open('w') |
- f.write('abc') |
- f.close() |
- |
- f = appender.open('a') |
- f.write('def') |
- f.close() |
- |
- f = appender.open('r') |
- self.assertEquals(f.read(), 'abcdef') |
- f.close() |
- |
- # read/write should let us do both without erasing those bytes |
- f = appender.open('r+') |
- self.assertEquals(f.read(), 'abcdef') |
- # ANSI C *requires* an fseek or an fgetpos between an fread and an |
- # fwrite or an fwrite and a fread. We can't reliable get Python to |
- # invoke fgetpos, so we seek to a 0 byte offset from the current |
- # position instead. Also, Python sucks for making this seek |
- # relative to 1 instead of a symbolic constant representing the |
- # current file position. |
- f.seek(0, 1) |
- # Put in some new bytes for us to test for later. |
- f.write('ghi') |
- f.close() |
- |
- # Make sure those new bytes really showed up |
- f = appender.open('r') |
- self.assertEquals(f.read(), 'abcdefghi') |
- f.close() |
- |
- # write/read should let us do both, but erase anything that's there |
- # already. |
- f = appender.open('w+') |
- self.assertEquals(f.read(), '') |
- f.seek(0, 1) # Don't forget this! |
- f.write('123') |
- f.close() |
- |
- # super append mode should let us read and write and also position the |
- # cursor at the end of the file, without erasing everything. |
- f = appender.open('a+') |
- |
- # The order of these lines may seem surprising, but it is necessary. |
- # The cursor is not at the end of the file until after the first write. |
- f.write('456') |
- f.seek(0, 1) # Asinine. |
- self.assertEquals(f.read(), '') |
- |
- f.seek(0, 0) |
- self.assertEquals(f.read(), '123456') |
- f.close() |
- |
- # Opening a file exclusively must fail if that file exists already. |
- nonexistent.requireCreate(True) |
- nonexistent.open('w').close() |
- existent = nonexistent |
- del nonexistent |
- self.assertRaises((OSError, IOError), existent.open) |
- |
- |
- def test_existsCache(self): |
- """ |
- Check that C{filepath.FilePath.exists} correctly restat the object if |
- an operation has occurred in the mean time. |
- """ |
- fp = filepath.FilePath(self.mktemp()) |
- self.assertEquals(fp.exists(), False) |
- |
- fp.makedirs() |
- self.assertEquals(fp.exists(), True) |
- |
- |
- |
-from twisted.python import urlpath |
- |
-class URLPathTestCase(unittest.TestCase): |
- def setUp(self): |
- self.path = urlpath.URLPath.fromString("http://example.com/foo/bar?yes=no&no=yes#footer") |
- |
- def testStringConversion(self): |
- self.assertEquals(str(self.path), "http://example.com/foo/bar?yes=no&no=yes#footer") |
- |
- def testChildString(self): |
- self.assertEquals(str(self.path.child('hello')), "http://example.com/foo/bar/hello") |
- self.assertEquals(str(self.path.child('hello').child('')), "http://example.com/foo/bar/hello/") |
- |
- def testSiblingString(self): |
- self.assertEquals(str(self.path.sibling('baz')), 'http://example.com/foo/baz') |
- |
- # The sibling of http://example.com/foo/bar/ |
- # is http://example.comf/foo/bar/baz |
- # because really we are constructing a sibling of |
- # http://example.com/foo/bar/index.html |
- self.assertEquals(str(self.path.child('').sibling('baz')), 'http://example.com/foo/bar/baz') |
- |
- def testParentString(self): |
- # parent should be equivalent to '..' |
- # 'foo' is the current directory, '/' is the parent directory |
- self.assertEquals(str(self.path.parent()), 'http://example.com/') |
- self.assertEquals(str(self.path.child('').parent()), 'http://example.com/foo/') |
- self.assertEquals(str(self.path.child('baz').parent()), 'http://example.com/foo/') |
- self.assertEquals(str(self.path.parent().parent().parent().parent().parent()), 'http://example.com/') |
- |
- def testHereString(self): |
- # here should be equivalent to '.' |
- self.assertEquals(str(self.path.here()), 'http://example.com/foo/') |
- self.assertEquals(str(self.path.child('').here()), 'http://example.com/foo/bar/') |
- |