Index: chrome/test/pyautolib/pyauto_utils.py |
diff --git a/chrome/test/pyautolib/pyauto_utils.py b/chrome/test/pyautolib/pyauto_utils.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4d3a3d1f5f14d31a51fb21639a85982ee6579b3f |
--- /dev/null |
+++ b/chrome/test/pyautolib/pyauto_utils.py |
@@ -0,0 +1,79 @@ |
+#!/usr/bin/python |
+ |
+# Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Utilities for PyAuto.""" |
+ |
+import logging |
+import os |
+import shutil |
+import tempfile |
+ |
+ |
+class ExistingPathReplacer(object): |
+ """Facilitates backing up a given path (file or dir).. |
+ |
+ Often you want to manipulate a directory or file for testing but don't want to |
+ meddle with the existing contents. This class lets you make a backup, and |
+ reinstate the backup when done. A backup is made in an adjacent directory, |
+ so you need to make sure you have write permissions to the parent directory. |
+ |
+ Works seemlessly in cases where the requested path already exists, or not. |
+ |
+ Automatically reinstates the backed up path (if any) when object is deleted. |
+ """ |
+ _path = '' |
+ _backup_dir = None # dir to which existing content is backed up |
+ _backup_basename = '' |
+ |
+ def __init__(self, path, path_type='dir'): |
+ """Initialize the object, making backups if necessary. |
+ |
+ Args: |
+ path: the requested path to file or directory |
+ path_type: path type. Options: 'file', 'dir'. Default: 'dir' |
+ """ |
+ assert path_type in ('file', 'dir'), 'Invalid path_type: %s' % path_type |
+ self._path_type = path_type |
+ self._path = path |
+ if os.path.exists(self._path): |
+ if 'dir' == self._path_type: |
+ assert os.path.isdir(self._path), '%s is not a directory' % self._path |
+ else: |
+ assert os.path.isfile(self._path), '%s is not a file' % self._path |
+ # take a backup |
+ self._backup_basename = os.path.basename(self._path) |
+ self._backup_dir = tempfile.mkdtemp(dir=os.path.dirname(self._path), |
+ prefix='bkp-' + self._backup_basename) |
+ logging.info('Backing up %s in %s' % (self._path, self._backup_dir)) |
+ shutil.move(self._path, |
+ os.path.join(self._backup_dir, self._backup_basename)) |
+ self._CreateRequestedPath() |
+ |
+ def __del__(self): |
+ """Cleanup. Reinstate backup.""" |
+ self._CleanupRequestedPath() |
+ if self._backup_dir: # Reinstate, if backed up. |
+ from_path = os.path.join(self._backup_dir, self._backup_basename) |
+ logging.info('Reinstating backup from %s to %s' % (from_path, self._path)) |
+ shutil.move(from_path, self._path) |
+ self._RemoveBackupDir() |
+ |
+ def _CreateRequestedPath(self): |
+ if 'dir' == self._path_type: |
+ os.mkdir(self._path) |
+ else: |
+ open(self._path, 'w').close() |
+ |
+ def _CleanupRequestedPath(self): |
+ if os.path.exists(self._path): |
+ if os.path.isdir(self._path): |
+ shutil.rmtree(self._path, ignore_errors=True) |
+ else: |
+ os.remove(self._path) |
+ |
+ def _RemoveBackupDir(self): |
+ if self._backup_dir and os.path.isdir(self._backup_dir): |
+ shutil.rmtree(self._backup_dir, ignore_errors=True) |