| Index: tools/telemetry/third_party/pyfakefs/pyfakefs/fake_filesystem_vs_real_test.py
|
| diff --git a/tools/telemetry/third_party/pyfakefs/pyfakefs/fake_filesystem_vs_real_test.py b/tools/telemetry/third_party/pyfakefs/pyfakefs/fake_filesystem_vs_real_test.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..9da1bc8f977183e9753cb5cf4b6b7e93c630a07e
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/pyfakefs/pyfakefs/fake_filesystem_vs_real_test.py
|
| @@ -0,0 +1,612 @@
|
| +#! /usr/bin/env python
|
| +#
|
| +# Copyright 2009 Google Inc. All Rights Reserved.
|
| +#
|
| +# Licensed under the Apache License, Version 2.0 (the "License");
|
| +# you may not use this file except in compliance with the License.
|
| +# You may obtain a copy of the License at
|
| +#
|
| +# http://www.apache.org/licenses/LICENSE-2.0
|
| +#
|
| +# Unless required by applicable law or agreed to in writing, software
|
| +# distributed under the License is distributed on an "AS IS" BASIS,
|
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +# See the License for the specific language governing permissions and
|
| +# limitations under the License.
|
| +
|
| +"""Test that FakeFilesystem calls work identically to a real filesystem."""
|
| +
|
| +#pylint: disable-all
|
| +
|
| +import os #@UnusedImport
|
| +import os.path
|
| +import shutil
|
| +import sys
|
| +import tempfile
|
| +import time
|
| +import sys
|
| +if sys.version_info < (2, 7):
|
| + import unittest2 as unittest
|
| +else:
|
| + import unittest
|
| +
|
| +import fake_filesystem
|
| +
|
| +
|
| +def Sep(path):
|
| + """Converts slashes in the path to the architecture's path seperator."""
|
| + if isinstance(path, str):
|
| + return path.replace('/', os.sep)
|
| + return path
|
| +
|
| +
|
| +class TestCase(unittest.TestCase):
|
| + is_windows = sys.platform.startswith('win')
|
| + is_cygwin = sys.platform == 'cygwin'
|
| + _FAKE_FS_BASE = Sep('/fakefs')
|
| +
|
| +
|
| +class FakeFilesystemVsRealTest(TestCase):
|
| +
|
| + def _Paths(self, path):
|
| + """For a given path, return paths in the real and fake filesystems."""
|
| + if not path:
|
| + return (None, None)
|
| + return (os.path.join(self.real_base, path),
|
| + os.path.join(self.fake_base, path))
|
| +
|
| + def _CreateTestFile(self, file_type, path, contents=None):
|
| + """Create a dir, file, or link in both the real fs and the fake."""
|
| + path = Sep(path)
|
| + self._created_files.append([file_type, path, contents])
|
| + real_path, fake_path = self._Paths(path)
|
| + if file_type == 'd':
|
| + os.mkdir(real_path)
|
| + self.fake_os.mkdir(fake_path)
|
| + if file_type == 'f':
|
| + fh = open(real_path, 'w')
|
| + fh.write(contents or '')
|
| + fh.close()
|
| + fh = self.fake_open(fake_path, 'w')
|
| + fh.write(contents or '')
|
| + fh.close()
|
| + # b for binary file
|
| + if file_type == 'b':
|
| + fh = open(real_path, 'wb')
|
| + fh.write(contents or '')
|
| + fh.close()
|
| + fh = self.fake_open(fake_path, 'wb')
|
| + fh.write(contents or '')
|
| + fh.close()
|
| + # l for symlink, h for hard link
|
| + if file_type in ('l', 'h'):
|
| + real_target, fake_target = (contents, contents)
|
| + # If it begins with '/', make it relative to the base. You can't go
|
| + # creating files in / for the real file system.
|
| + if contents.startswith(os.sep):
|
| + real_target, fake_target = self._Paths(contents[1:])
|
| + if file_type == 'l':
|
| + os.symlink(real_target, real_path)
|
| + self.fake_os.symlink(fake_target, fake_path)
|
| + elif file_type == 'h':
|
| + os.link(real_target, real_path)
|
| + self.fake_os.link(fake_target, fake_path)
|
| +
|
| + def setUp(self):
|
| + # Base paths in the real and test file systems. We keep them different
|
| + # so that missing features in the fake don't fall through to the base
|
| + # operations and magically succeed.
|
| + tsname = 'fakefs.%s' % time.time()
|
| + # Fully expand the base_path - required on OS X.
|
| + self.real_base = os.path.realpath(
|
| + os.path.join(tempfile.gettempdir(), tsname))
|
| + os.chdir(tempfile.gettempdir())
|
| + if os.path.isdir(self.real_base):
|
| + shutil.rmtree(self.real_base)
|
| + os.mkdir(self.real_base)
|
| + self.fake_base = self._FAKE_FS_BASE
|
| +
|
| + # Make sure we can write to the physical testing temp directory.
|
| + self.assertTrue(os.access(self.real_base, os.W_OK))
|
| +
|
| + self.fake_filesystem = fake_filesystem.FakeFilesystem()
|
| + self.fake_filesystem.CreateDirectory(self.fake_base)
|
| + self.fake_os = fake_filesystem.FakeOsModule(self.fake_filesystem)
|
| + self.fake_open = fake_filesystem.FakeFileOpen(self.fake_filesystem)
|
| + self._created_files = []
|
| +
|
| + os.chdir(self.real_base)
|
| + self.fake_os.chdir(self.fake_base)
|
| +
|
| + def tearDown(self):
|
| + # We have to remove all the files from the real FS. Doing the same for the
|
| + # fake FS is optional, but doing it is an extra sanity check.
|
| + os.chdir(tempfile.gettempdir())
|
| + try:
|
| + rev_files = self._created_files[:]
|
| + rev_files.reverse()
|
| + for info in rev_files:
|
| + real_path, fake_path = self._Paths(info[1])
|
| + if info[0] == 'd':
|
| + try:
|
| + os.rmdir(real_path)
|
| + except OSError as e:
|
| + if 'Directory not empty' in e:
|
| + self.fail('Real path %s not empty: %s : %s' % (
|
| + real_path, e, os.listdir(real_path)))
|
| + else:
|
| + raise
|
| + self.fake_os.rmdir(fake_path)
|
| + if info[0] == 'f' or info[0] == 'l':
|
| + os.remove(real_path)
|
| + self.fake_os.remove(fake_path)
|
| + finally:
|
| + shutil.rmtree(self.real_base)
|
| +
|
| + def _GetErrno(self, raised_error):
|
| + try:
|
| + return (raised_error and raised_error.errno) or None
|
| + except AttributeError:
|
| + return None
|
| +
|
| + def _CompareBehaviors(self, method_name, path, real, fake,
|
| + method_returns_path=False):
|
| + """Invoke an os method in both real and fake contexts and compare results.
|
| +
|
| + Invoke a real filesystem method with a path to a real file and invoke a fake
|
| + filesystem method with a path to a fake file and compare the results. We
|
| + expect some calls to throw Exceptions, so we catch those and compare them.
|
| +
|
| + Args:
|
| + method_name: Name of method being tested, for use in error messages.
|
| + path: potential path to a file in the real and fake file systems, passing
|
| + an empty tuple indicates that no arguments to pass to method.
|
| + real: built-in system library or method from the built-in system library
|
| + which takes a path as an arg and returns some value.
|
| + fake: fake_filsystem object or method from a fake_filesystem class
|
| + which takes a path as an arg and returns some value.
|
| + method_returns_path: True if the method returns a path, and thus we must
|
| + compensate for expected difference between real and fake.
|
| +
|
| + Returns:
|
| + A description of the difference in behavior, or None.
|
| + """
|
| + # pylint: disable=C6403
|
| +
|
| + def _ErrorClass(e):
|
| + return (e and e.__class__.__name__) or 'None'
|
| +
|
| + real_value = None
|
| + fake_value = None
|
| + real_err = None
|
| + fake_err = None
|
| + method_call = '%s' % method_name
|
| + method_call += '()' if path == () else '(%s)' % path
|
| + # Catching Exception below gives a lint warning, but it's what we need.
|
| + try:
|
| + args = [] if path == () else [path]
|
| + real_method = real
|
| + if not callable(real):
|
| + real_method = getattr(real, method_name)
|
| + real_value = str(real_method(*args))
|
| + except Exception as e: # pylint: disable-msg=W0703
|
| + real_err = e
|
| + try:
|
| + fake_method = fake
|
| + if not callable(fake):
|
| + fake_method = getattr(fake, method_name)
|
| + args = [] if path == () else [path]
|
| + fake_value = str(fake_method(*args))
|
| + except Exception as e: # pylint: disable-msg=W0703
|
| + fake_err = e
|
| + # We only compare on the error class because the acutal error contents
|
| + # is almost always different because of the file paths.
|
| + if _ErrorClass(real_err) != _ErrorClass(fake_err):
|
| + if real_err is None:
|
| + return '%s: real version returned %s, fake raised %s' % (
|
| + method_call, real_value, _ErrorClass(fake_err))
|
| + if fake_err is None:
|
| + return '%s: real version raised %s, fake returned %s' % (
|
| + method_call, _ErrorClass(real_err), fake_value)
|
| + return '%s: real version raised %s, fake raised %s' % (
|
| + method_call, _ErrorClass(real_err), _ErrorClass(fake_err))
|
| + real_errno = self._GetErrno(real_err)
|
| + fake_errno = self._GetErrno(fake_err)
|
| + if real_errno != fake_errno:
|
| + return '%s(%s): both raised %s, real errno %s, fake errno %s' % (
|
| + method_name, path, _ErrorClass(real_err), real_errno, fake_errno)
|
| + # If the method is supposed to return a full path AND both values
|
| + # begin with the expected full path, then trim it off.
|
| + if method_returns_path:
|
| + if (real_value and fake_value
|
| + and real_value.startswith(self.real_base)
|
| + and fake_value.startswith(self.fake_base)):
|
| + real_value = real_value[len(self.real_base):]
|
| + fake_value = fake_value[len(self.fake_base):]
|
| + if real_value != fake_value:
|
| + return '%s: real return %s, fake returned %s' % (
|
| + method_call, real_value, fake_value)
|
| + return None
|
| +
|
| + def assertOsMethodBehaviorMatches(self, method_name, path,
|
| + method_returns_path=False):
|
| + """Invoke an os method in both real and fake contexts and compare.
|
| +
|
| + For a given method name (from the os module) and a path, compare the
|
| + behavior of the system provided module against the fake_filesytem module.
|
| + We expect results and/or Exceptions raised to be identical.
|
| +
|
| + Args:
|
| + method_name: Name of method being tested.
|
| + path: potential path to a file in the real and fake file systems.
|
| + method_returns_path: True if the method returns a path, and thus we must
|
| + compensate for expected difference between real and fake.
|
| +
|
| + Returns:
|
| + A description of the difference in behavior, or None.
|
| + """
|
| + path = Sep(path)
|
| + return self._CompareBehaviors(method_name, path, os, self.fake_os,
|
| + method_returns_path)
|
| +
|
| + def DiffOpenMethodBehavior(self, method_name, path, mode, data,
|
| + method_returns_data=True):
|
| + """Invoke an open method in both real and fkae contexts and compare.
|
| +
|
| + Args:
|
| + method_name: Name of method being tested.
|
| + path: potential path to a file in the real and fake file systems.
|
| + mode: how to open the file.
|
| + data: any data to pass to the method.
|
| + method_returns_data: True if a method returns some sort of data.
|
| +
|
| + For a given method name (from builtin open) and a path, compare the
|
| + behavior of the system provided module against the fake_filesytem module.
|
| + We expect results and/or Exceptions raised to be identical.
|
| +
|
| + Returns:
|
| + A description of the difference in behavior, or None.
|
| + """
|
| + with open(path, mode) as real_fh:
|
| + with self.fake_open(path, mode) as fake_fh:
|
| + return self._CompareBehaviors(method_name, data, real_fh, fake_fh,
|
| + method_returns_data)
|
| +
|
| + def DiffOsPathMethodBehavior(self, method_name, path,
|
| + method_returns_path=False):
|
| + """Invoke an os.path method in both real and fake contexts and compare.
|
| +
|
| + For a given method name (from the os.path module) and a path, compare the
|
| + behavior of the system provided module against the fake_filesytem module.
|
| + We expect results and/or Exceptions raised to be identical.
|
| +
|
| + Args:
|
| + method_name: Name of method being tested.
|
| + path: potential path to a file in the real and fake file systems.
|
| + method_returns_path: True if the method returns a path, and thus we must
|
| + compensate for expected difference between real and fake.
|
| +
|
| + Returns:
|
| + A description of the difference in behavior, or None.
|
| + """
|
| + return self._CompareBehaviors(method_name, path, os.path, self.fake_os.path,
|
| + method_returns_path)
|
| +
|
| + def assertOsPathMethodBehaviorMatches(self, method_name, path,
|
| + method_returns_path=False):
|
| + """Assert that an os.path behaves the same in both real and fake contexts.
|
| +
|
| + Wraps DiffOsPathMethodBehavior, raising AssertionError if any differences
|
| + are reported.
|
| +
|
| + Args:
|
| + method_name: Name of method being tested.
|
| + path: potential path to a file in the real and fake file systems.
|
| + method_returns_path: True if the method returns a path, and thus we must
|
| + compensate for expected difference between real and fake.
|
| +
|
| + Raises:
|
| + AssertionError if there is any difference in behavior.
|
| + """
|
| + path = Sep(path)
|
| + diff = self.DiffOsPathMethodBehavior(method_name, path, method_returns_path)
|
| + if diff:
|
| + self.fail(diff)
|
| +
|
| + def assertAllOsBehaviorsMatch(self, path):
|
| + path = Sep(path)
|
| + os_method_names = [] if self.is_windows else ['readlink']
|
| + os_method_names_no_args = ['getcwd']
|
| + if sys.version_info < (3, 0):
|
| + os_method_names_no_args.append('getcwdu')
|
| + os_path_method_names = ['isabs',
|
| + 'isdir',
|
| + 'isfile',
|
| + 'exists'
|
| + ]
|
| + if not self.is_windows:
|
| + os_path_method_names.append('islink')
|
| + os_path_method_names.append('lexists')
|
| + wrapped_methods = [['access', self._AccessReal, self._AccessFake],
|
| + ['stat.size', self._StatSizeReal, self._StatSizeFake],
|
| + ['lstat.size', self._LstatSizeReal, self._LstatSizeFake]
|
| + ]
|
| +
|
| + differences = []
|
| + for method_name in os_method_names:
|
| + diff = self.assertOsMethodBehaviorMatches(method_name, path)
|
| + if diff:
|
| + differences.append(diff)
|
| + for method_name in os_method_names_no_args:
|
| + diff = self.assertOsMethodBehaviorMatches(method_name, (),
|
| + method_returns_path=True)
|
| + if diff:
|
| + differences.append(diff)
|
| + for method_name in os_path_method_names:
|
| + diff = self.DiffOsPathMethodBehavior(method_name, path)
|
| + if diff:
|
| + differences.append(diff)
|
| + for m in wrapped_methods:
|
| + diff = self._CompareBehaviors(m[0], path, m[1], m[2])
|
| + if diff:
|
| + differences.append(diff)
|
| + if differences:
|
| + self.fail('Behaviors do not match for %s:\n %s' %
|
| + (path, '\n '.join(differences)))
|
| +
|
| + def assertFileHandleBehaviorsMatch(self, path, mode, data):
|
| + path = Sep(path)
|
| + write_method_names = ['write', 'writelines']
|
| + read_method_names = ['read', 'readlines']
|
| + other_method_names = ['truncate', 'flush', 'close']
|
| + differences = []
|
| + for method_name in write_method_names:
|
| + diff = self.DiffOpenMethodBehavior(method_name, path, mode, data)
|
| + if diff:
|
| + differences.append(diff)
|
| + for method_name in read_method_names + other_method_names:
|
| + diff = self.DiffOpenMethodBehavior(method_name, path, mode, ())
|
| + if diff:
|
| + differences.append(diff)
|
| + if differences:
|
| + self.fail('Behaviors do not match for %s:\n %s' %
|
| + (path, '\n '.join(differences)))
|
| +
|
| + # Helpers for checks which are not straight method calls.
|
| +
|
| + def _AccessReal(self, path):
|
| + return os.access(path, os.R_OK)
|
| +
|
| + def _AccessFake(self, path):
|
| + return self.fake_os.access(path, os.R_OK)
|
| +
|
| + def _StatSizeReal(self, path):
|
| + real_path, unused_fake_path = self._Paths(path)
|
| + # fake_filesystem.py does not implement stat().st_size for directories
|
| + if os.path.isdir(real_path):
|
| + return None
|
| + return os.stat(real_path).st_size
|
| +
|
| + def _StatSizeFake(self, path):
|
| + unused_real_path, fake_path = self._Paths(path)
|
| + # fake_filesystem.py does not implement stat().st_size for directories
|
| + if self.fake_os.path.isdir(fake_path):
|
| + return None
|
| + return self.fake_os.stat(fake_path).st_size
|
| +
|
| + def _LstatSizeReal(self, path):
|
| + real_path, unused_fake_path = self._Paths(path)
|
| + if os.path.isdir(real_path):
|
| + return None
|
| + size = os.lstat(real_path).st_size
|
| + # Account for the difference in the lengths of the absolute paths.
|
| + if os.path.islink(real_path):
|
| + if os.readlink(real_path).startswith(os.sep):
|
| + size -= len(self.real_base)
|
| + return size
|
| +
|
| + def _LstatSizeFake(self, path):
|
| + unused_real_path, fake_path = self._Paths(path)
|
| + #size = 0
|
| + if self.fake_os.path.isdir(fake_path):
|
| + return None
|
| + size = self.fake_os.lstat(fake_path).st_size
|
| + # Account for the difference in the lengths of the absolute paths.
|
| + if self.fake_os.path.islink(fake_path):
|
| + if self.fake_os.readlink(fake_path).startswith(os.sep):
|
| + size -= len(self.fake_base)
|
| + return size
|
| +
|
| + def testIsabs(self):
|
| + # We do not have to create any files for isabs.
|
| + self.assertOsPathMethodBehaviorMatches('isabs', None)
|
| + self.assertOsPathMethodBehaviorMatches('isabs', '')
|
| + self.assertOsPathMethodBehaviorMatches('isabs', '/')
|
| + self.assertOsPathMethodBehaviorMatches('isabs', '/a')
|
| + self.assertOsPathMethodBehaviorMatches('isabs', 'a')
|
| +
|
| + def testNonePath(self):
|
| + self.assertAllOsBehaviorsMatch(None)
|
| +
|
| + def testEmptyPath(self):
|
| + self.assertAllOsBehaviorsMatch('')
|
| +
|
| + def testRootPath(self):
|
| + self.assertAllOsBehaviorsMatch('/')
|
| +
|
| + def testNonExistantFile(self):
|
| + self.assertAllOsBehaviorsMatch('foo')
|
| +
|
| + def testEmptyFile(self):
|
| + self._CreateTestFile('f', 'aFile')
|
| + self.assertAllOsBehaviorsMatch('aFile')
|
| +
|
| + def testFileWithContents(self):
|
| + self._CreateTestFile('f', 'aFile', 'some contents')
|
| + self.assertAllOsBehaviorsMatch('aFile')
|
| +
|
| + def testFileWithBinaryContents(self):
|
| + self._CreateTestFile('b', 'aFile', b'some contents')
|
| + self.assertAllOsBehaviorsMatch('aFile')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testSymLinkToEmptyFile(self):
|
| + self._CreateTestFile('f', 'aFile')
|
| + self._CreateTestFile('l', 'link_to_empty', 'aFile')
|
| + self.assertAllOsBehaviorsMatch('link_to_empty')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def TBD_testHardLinkToEmptyFile(self):
|
| + self._CreateTestFile('f', 'aFile')
|
| + self._CreateTestFile('h', 'link_to_empty', 'aFile')
|
| + self.assertAllOsBehaviorsMatch('link_to_empty')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testSymLinkToRealFile(self):
|
| + self._CreateTestFile('f', 'aFile', 'some contents')
|
| + self._CreateTestFile('l', 'link_to_file', 'aFile')
|
| + self.assertAllOsBehaviorsMatch('link_to_file')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def TBD_testHardLinkToRealFile(self):
|
| + self._CreateTestFile('f', 'aFile', 'some contents')
|
| + self._CreateTestFile('h', 'link_to_file', 'aFile')
|
| + self.assertAllOsBehaviorsMatch('link_to_file')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testBrokenSymLink(self):
|
| + self._CreateTestFile('l', 'broken_link', 'broken')
|
| + self._CreateTestFile('l', 'loop', '/a/loop')
|
| + self.assertAllOsBehaviorsMatch('broken_link')
|
| +
|
| + def testFileInAFolder(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('f', 'a/b/file', 'contents')
|
| + self.assertAllOsBehaviorsMatch('a/b/file')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testAbsoluteSymLinkToFolder(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('f', 'a/b/file', 'contents')
|
| + self._CreateTestFile('l', 'a/link', '/a/b')
|
| + self.assertAllOsBehaviorsMatch('a/link/file')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testLinkToFolderAfterChdir(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('f', 'a/b/file', 'contents')
|
| + self._CreateTestFile('l', 'a/link', '/a/b')
|
| +
|
| + real_dir, fake_dir = self._Paths('a/b')
|
| + os.chdir(real_dir)
|
| + self.fake_os.chdir(fake_dir)
|
| + self.assertAllOsBehaviorsMatch('file')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testRelativeSymLinkToFolder(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('f', 'a/b/file', 'contents')
|
| + self._CreateTestFile('l', 'a/link', 'b')
|
| + self.assertAllOsBehaviorsMatch('a/link/file')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testSymLinkToParent(self):
|
| + # Soft links on HFS+ / OS X behave differently.
|
| + if os.uname()[0] != 'Darwin':
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('l', 'a/b/c', '..')
|
| + self.assertAllOsBehaviorsMatch('a/b/c')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testPathThroughSymLinkToParent(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('f', 'a/target', 'contents')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('l', 'a/b/c', '..')
|
| + self.assertAllOsBehaviorsMatch('a/b/c/target')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testSymLinkToSiblingDirectory(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('d', 'a/sibling_of_b')
|
| + self._CreateTestFile('f', 'a/sibling_of_b/target', 'contents')
|
| + self._CreateTestFile('l', 'a/b/c', '../sibling_of_b')
|
| + self.assertAllOsBehaviorsMatch('a/b/c/target')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testSymLinkToSiblingDirectoryNonExistantFile(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('d', 'a/sibling_of_b')
|
| + self._CreateTestFile('f', 'a/sibling_of_b/target', 'contents')
|
| + self._CreateTestFile('l', 'a/b/c', '../sibling_of_b')
|
| + self.assertAllOsBehaviorsMatch('a/b/c/file_does_not_exist')
|
| +
|
| + @unittest.skipIf(TestCase.is_windows, 'no symlink in Windows')
|
| + def testBrokenSymLinkToSiblingDirectory(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('d', 'a/sibling_of_b')
|
| + self._CreateTestFile('f', 'a/sibling_of_b/target', 'contents')
|
| + self._CreateTestFile('l', 'a/b/c', '../broken_sibling_of_b')
|
| + self.assertAllOsBehaviorsMatch('a/b/c/target')
|
| +
|
| + def testRelativePath(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('d', 'a/sibling_of_b')
|
| + self._CreateTestFile('f', 'a/sibling_of_b/target', 'contents')
|
| + self.assertAllOsBehaviorsMatch('a/b/../sibling_of_b/target')
|
| +
|
| + def testBrokenRelativePath(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('d', 'a/sibling_of_b')
|
| + self._CreateTestFile('f', 'a/sibling_of_b/target', 'contents')
|
| + self.assertAllOsBehaviorsMatch('a/b/../broken/target')
|
| +
|
| + def testBadRelativePath(self):
|
| + self._CreateTestFile('d', 'a')
|
| + self._CreateTestFile('f', 'a/target', 'contents')
|
| + self._CreateTestFile('d', 'a/b')
|
| + self._CreateTestFile('d', 'a/sibling_of_b')
|
| + self._CreateTestFile('f', 'a/sibling_of_b/target', 'contents')
|
| + self.assertAllOsBehaviorsMatch('a/b/../broken/../target')
|
| +
|
| + def testGetmtimeNonexistantPath(self):
|
| + self.assertOsPathMethodBehaviorMatches('getmtime', 'no/such/path')
|
| +
|
| + def testBuiltinOpenModes(self):
|
| + self._CreateTestFile('f', 'read', 'some contents')
|
| + self._CreateTestFile('f', 'write', 'some contents')
|
| + self._CreateTestFile('f', 'append', 'some contents')
|
| + self.assertFileHandleBehaviorsMatch('read', 'r', 'other contents')
|
| + self.assertFileHandleBehaviorsMatch('write', 'w', 'other contents')
|
| + self.assertFileHandleBehaviorsMatch('append', 'a', 'other contents')
|
| + self._CreateTestFile('f', 'readplus', 'some contents')
|
| + self._CreateTestFile('f', 'writeplus', 'some contents')
|
| + self.assertFileHandleBehaviorsMatch('readplus', 'r+', 'other contents')
|
| + self.assertFileHandleBehaviorsMatch('writeplus', 'w+', 'other contents')
|
| + self._CreateTestFile('b', 'binaryread', b'some contents')
|
| + self._CreateTestFile('b', 'binarywrite', b'some contents')
|
| + self._CreateTestFile('b', 'binaryappend', b'some contents')
|
| + self.assertFileHandleBehaviorsMatch('binaryread', 'rb', b'other contents')
|
| + self.assertFileHandleBehaviorsMatch('binarywrite', 'wb', b'other contents')
|
| + self.assertFileHandleBehaviorsMatch('binaryappend', 'ab', b'other contents')
|
| + self.assertFileHandleBehaviorsMatch('read', 'rb', 'other contents')
|
| + self.assertFileHandleBehaviorsMatch('write', 'wb', 'other contents')
|
| + self.assertFileHandleBehaviorsMatch('append', 'ab', 'other contents')
|
| +
|
| +
|
| +def main(unused_argv):
|
| + unittest.main()
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|