Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Unified Diff: tools/telemetry/third_party/pyfakefs/pyfakefs/fake_filesystem_vs_real_test.py

Issue 1310343005: [Telemetry] Add pyfakefs to telemetry/third_party (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add license header to setup.py Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()

Powered by Google App Engine
This is Rietveld 408576698