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

Unified Diff: chrome/test/pyautolib/pyauto_utils.py

Issue 3083028: PyAuto test for renderer crash reporting (Closed)
Patch Set: jrg Created 10 years, 4 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
« no previous file with comments | « chrome/test/pyautolib/pyauto.py ('k') | chrome/test/pyautolib/pyauto_utils_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « chrome/test/pyautolib/pyauto.py ('k') | chrome/test/pyautolib/pyauto_utils_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698