# Copyright (C) 2010 # Red Hat, Inc. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Author(s): Martin Sivak from StringIO import StringIO import fnmatch import os class DiskIO(object): """Simple object to simplify mocking of file operations in Mock based testing""" class TestFile(StringIO): def __init__(self, store, path, content = ""): StringIO.__init__(self, content) self._store = store self._path = path self._ro = False def flush(self): self._store[self._path] = self.getvalue() def close(self): self.flush() return StringIO.close(self) def __del__(self): try: self.close() except (AttributeError, ValueError): pass def __enter__(self): return self def __exit__(self, *_): self.close() class Dir(object): pass class Link(object): pass def __init__(self): self.reset() def __getitem__(self, key): return self.fs[key] def __setitem__(self, key, value): self.fs[key] = value def reset(self): self.fs = { "/proc": self.Dir, "/proc/cmdline": "linux", } self._pwd = "/" #Emulate file objects def open(self, filename, mode = "r"): path = os.path.join(self._pwd, filename) content = self.fs.get(path, None) if content == self.Dir: raise IOError("[Errno 21] Is a directory: '%s'" % (path)) elif mode.startswith("w"): self.fs[path] = "" f = self.TestFile(self.fs, path, self.fs[path]) elif mode.endswith("a"): if not path in self.fs: self.fs[path] = "" f = self.TestFile(self.fs, path, self.fs[path]) f.seek(0, os.SEEK_END) elif content == None: raise IOError("[Errno 2] No such file or directory: '%s'" % (path,)) elif mode.endswith("+"): f = self.TestFile(self.fs, path, content) if mode.startswith('r'): f.seek(0, os.SEEK_SET) else: f.seek(0, os.SEEK_END) else: f = self.TestFile(self.fs, path, content) return f #Emulate os calls def glob_glob(self, pattern): return fnmatch.filter(self.fs.keys(), pattern) def os_listdir(self, path): return [entry[len(path):].lstrip('/') for entry in self.fs.keys()\ if entry.startswith(path) and entry != path] def os_path_exists(self, path): path = os.path.join(self._pwd, path) return self.fs.has_key(path) def os_path_isdir(self, path): if not path.endswith("/"): path += "/" path += "*" return len(fnmatch.filter(self.fs.keys(), path)) > 0 def os_remove(self, path): path = os.path.join(self._pwd, path) try: del self.fs[path] except KeyError: raise OSError("[Errno 2] No such file or directory: '%s'" % (path,)) def os_access(self, path, mode): return self.os_path_exists(path)