Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / WebKitTools / Scripts / webkitpy / common / system / filesystem_mock.py
1 # Copyright (C) 2009 Google Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
5 # met:
6 #
7 #    * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 #    * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer
11 # in the documentation and/or other materials provided with the
12 # distribution.
13 #    * Neither the name of Google Inc. nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 import errno
30 import os
31 import path
32
33
34 class MockFileSystem(object):
35     def __init__(self, files=None):
36         """Initializes a "mock" filesystem that can be used to completely
37         stub out a filesystem.
38
39         Args:
40             files: a dict of filenames -> file contents. A file contents
41                 value of None is used to indicate that the file should
42                 not exist.
43         """
44         self.files = files or {}
45
46     def exists(self, path):
47         return self.isfile(path) or self.isdir(path)
48
49     def isfile(self, path):
50         return path in self.files and self.files[path] is not None
51
52     def isdir(self, path):
53         if path in self.files:
54             return False
55         if not path.endswith('/'):
56             path += '/'
57         return any(f.startswith(path) for f in self.files)
58
59     def join(self, *comps):
60         return '/'.join(comps)
61
62     def listdir(self, path):
63         if not self.isdir(path):
64             raise OSError("%s is not a directory" % path)
65
66         if not path.endswith('/'):
67             path += '/'
68
69         dirs = []
70         files = []
71         for f in self.files:
72             if self.exists(f) and f.startswith(path):
73                 remaining = f[len(path):]
74                 if '/' in remaining:
75                     dir = remaining[:remaining.index('/')]
76                     if not dir in dirs:
77                         dirs.append(dir)
78                 else:
79                     files.append(remaining)
80         return dirs + files
81
82     def maybe_make_directory(self, *path):
83         # FIXME: Implement such that subsequent calls to isdir() work?
84         pass
85
86     def read_text_file(self, path):
87         return self.read_binary_file(path)
88
89     def read_binary_file(self, path):
90         if path in self.files:
91             if self.files[path] is None:
92                 raise IOError(errno.ENOENT, path, os.strerror(errno.ENOENT))
93             return self.files[path]
94
95     def write_text_file(self, path, contents):
96         return self.write_binary_file(path, contents)
97
98     def write_binary_file(self, path, contents):
99         self.files[path] = contents
100
101     def copyfile(self, source, destination):
102         if not self.exists(source):
103             raise IOError(errno.ENOENT, source, os.strerror(errno.ENOENT))
104         if self.isdir(source):
105             raise IOError(errno.EISDIR, source, os.strerror(errno.ISDIR))
106         if self.isdir(destination):
107             raise IOError(errno.EISDIR, destination, os.strerror(errno.ISDIR))
108
109         self.files[destination] = self.files[source]