• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_FILEUTILS_MOCK_H_
12 #define WEBRTC_BASE_FILEUTILS_MOCK_H_
13 
14 #include <string>
15 #include <utility>
16 #include <vector>
17 
18 #include "webrtc/base/fileutils.h"
19 #include "webrtc/base/gunit.h"
20 #include "webrtc/base/pathutils.h"
21 #include "webrtc/base/stream.h"
22 
23 namespace rtc {
24 
25 class FakeFileStream : public FileStream {
26   public:
FakeFileStream(const std::string & contents)27     explicit FakeFileStream(const std::string & contents) :
28       string_stream_(contents)
29     {}
30 
Read(void * buffer,size_t buffer_len,size_t * read,int * error)31     virtual StreamResult Read(void* buffer, size_t buffer_len,
32                               size_t* read, int* error) {
33       return string_stream_.Read(buffer, buffer_len, read, error);
34     }
35 
Close()36     virtual void Close() {
37       return string_stream_.Close();
38     }
GetSize(size_t * size)39     virtual bool GetSize(size_t* size) const {
40       return string_stream_.GetSize(size);
41     }
42 
43   private:
44     StringStream string_stream_;
45 };
46 
47 class FakeDirectoryIterator : public DirectoryIterator {
48   public:
49     typedef std::pair<std::string, std::string> File;
50 
51     /*
52      * files should be sorted by directory
53      * put '/' at the end of file if you want it to be a directory
54      *
55      * Sample list:
56      *  /var/dir/file1
57      *  /var/dir/file2
58      *  /var/dir/subdir1/
59      *  /var/dir/subdir2/
60      *  /var/dir2/file2
61      *  /var/dir3/
62      *
63      *  you can call Iterate for any path: /var, /var/dir, /var/dir2
64      *  unrelated files will be ignored
65      */
FakeDirectoryIterator(const std::vector<File> & all_files)66     explicit FakeDirectoryIterator(const std::vector<File>& all_files) :
67       all_files_(all_files) {}
68 
Iterate(const Pathname & path)69     virtual bool Iterate(const Pathname& path) {
70       path_iterator_ = all_files_.begin();
71       path_ = path.pathname();
72 
73       // make sure path ends end with '/'
74       if (path_.rfind(Pathname::DefaultFolderDelimiter()) != path_.size() - 1)
75         path_ += Pathname::DefaultFolderDelimiter();
76 
77       return  FakeDirectoryIterator::Search(std::string(""));
78     }
79 
Next()80     virtual bool Next() {
81       std::string current_name = Name();
82       path_iterator_++;
83       return FakeDirectoryIterator::Search(current_name);
84     }
85 
Search(const std::string & current_name)86     bool Search(const std::string& current_name) {
87       for (; path_iterator_ != all_files_.end(); path_iterator_++) {
88         if (path_iterator_->first.find(path_) == 0
89             && Name().compare(current_name) != 0) {
90           return true;
91         }
92       }
93 
94       return false;
95     }
96 
IsDirectory()97     virtual bool IsDirectory() const {
98       std::string sub_path = path_iterator_->first;
99 
100       return std::string::npos !=
101         sub_path.find(Pathname::DefaultFolderDelimiter(), path_.size());
102     }
103 
Name()104     virtual std::string Name() const {
105       std::string sub_path = path_iterator_->first;
106 
107       // path     - top level path  (ex. /var/lib)
108       // sub_path - subpath under top level path (ex. /var/lib/dir/dir/file )
109       // find shortest non-trivial common path. (ex. /var/lib/dir)
110       size_t start  = path_.size();
111       size_t end    = sub_path.find(Pathname::DefaultFolderDelimiter(), start);
112 
113       if (end != std::string::npos) {
114         return sub_path.substr(start, end - start);
115       } else {
116         return sub_path.substr(start);
117       }
118     }
119 
120   private:
121     const std::vector<File> all_files_;
122 
123     std::string path_;
124     std::vector<File>::const_iterator path_iterator_;
125 };
126 
127 class FakeFileSystem : public FilesystemInterface {
128   public:
129     typedef std::pair<std::string, std::string> File;
130 
FakeFileSystem(const std::vector<File> & all_files)131     explicit FakeFileSystem(const std::vector<File>& all_files) :
132      all_files_(all_files) {}
133 
IterateDirectory()134     virtual DirectoryIterator *IterateDirectory() {
135      return new FakeDirectoryIterator(all_files_);
136     }
137 
OpenFile(const Pathname & filename,const std::string & mode)138     virtual FileStream * OpenFile(
139        const Pathname &filename,
140        const std::string &mode) {
141      std::vector<File>::const_iterator i_files = all_files_.begin();
142      std::string path = filename.pathname();
143 
144      for (; i_files != all_files_.end(); i_files++) {
145        if (i_files->first.compare(path) == 0) {
146          return new FakeFileStream(i_files->second);
147        }
148      }
149 
150      return NULL;
151     }
152 
CreatePrivateFile(const Pathname & filename)153     bool CreatePrivateFile(const Pathname &filename) {
154       EXPECT_TRUE(false) << "Unsupported operation";
155       return false;
156     }
DeleteFile(const Pathname & filename)157     bool DeleteFile(const Pathname &filename) {
158       EXPECT_TRUE(false) << "Unsupported operation";
159       return false;
160     }
DeleteEmptyFolder(const Pathname & folder)161     bool DeleteEmptyFolder(const Pathname &folder) {
162       EXPECT_TRUE(false) << "Unsupported operation";
163       return false;
164     }
DeleteFolderContents(const Pathname & folder)165     bool DeleteFolderContents(const Pathname &folder) {
166       EXPECT_TRUE(false) << "Unsupported operation";
167       return false;
168     }
DeleteFolderAndContents(const Pathname & folder)169     bool DeleteFolderAndContents(const Pathname &folder) {
170       EXPECT_TRUE(false) << "Unsupported operation";
171       return false;
172     }
CreateFolder(const Pathname & pathname)173     bool CreateFolder(const Pathname &pathname) {
174       EXPECT_TRUE(false) << "Unsupported operation";
175       return false;
176     }
MoveFolder(const Pathname & old_path,const Pathname & new_path)177     bool MoveFolder(const Pathname &old_path, const Pathname &new_path) {
178       EXPECT_TRUE(false) << "Unsupported operation";
179       return false;
180     }
MoveFile(const Pathname & old_path,const Pathname & new_path)181     bool MoveFile(const Pathname &old_path, const Pathname &new_path) {
182       EXPECT_TRUE(false) << "Unsupported operation";
183       return false;
184     }
CopyFile(const Pathname & old_path,const Pathname & new_path)185     bool CopyFile(const Pathname &old_path, const Pathname &new_path) {
186       EXPECT_TRUE(false) << "Unsupported operation";
187       return false;
188     }
IsFolder(const Pathname & pathname)189     bool IsFolder(const Pathname &pathname) {
190       EXPECT_TRUE(false) << "Unsupported operation";
191       return false;
192     }
IsFile(const Pathname & pathname)193     bool IsFile(const Pathname &pathname) {
194       EXPECT_TRUE(false) << "Unsupported operation";
195       return false;
196     }
IsAbsent(const Pathname & pathname)197     bool IsAbsent(const Pathname &pathname) {
198       EXPECT_TRUE(false) << "Unsupported operation";
199       return false;
200     }
IsTemporaryPath(const Pathname & pathname)201     bool IsTemporaryPath(const Pathname &pathname) {
202       EXPECT_TRUE(false) << "Unsupported operation";
203       return false;
204     }
GetTemporaryFolder(Pathname & path,bool create,const std::string * append)205     bool GetTemporaryFolder(Pathname &path, bool create,
206                             const std::string *append) {
207       EXPECT_TRUE(false) << "Unsupported operation";
208       return false;
209     }
TempFilename(const Pathname & dir,const std::string & prefix)210     std::string TempFilename(const Pathname &dir, const std::string &prefix) {
211       EXPECT_TRUE(false) << "Unsupported operation";
212       return std::string();
213     }
GetFileSize(const Pathname & path,size_t * size)214     bool GetFileSize(const Pathname &path, size_t *size) {
215       EXPECT_TRUE(false) << "Unsupported operation";
216       return false;
217     }
GetFileTime(const Pathname & path,FileTimeType which,time_t * time)218     bool GetFileTime(const Pathname &path, FileTimeType which,
219                      time_t* time) {
220       EXPECT_TRUE(false) << "Unsupported operation";
221       return false;
222     }
GetAppPathname(Pathname * path)223     bool GetAppPathname(Pathname *path) {
224       EXPECT_TRUE(false) << "Unsupported operation";
225       return false;
226     }
GetAppDataFolder(Pathname * path,bool per_user)227     bool GetAppDataFolder(Pathname *path, bool per_user) {
228       EXPECT_TRUE(per_user) << "Unsupported operation";
229 #if defined(WEBRTC_WIN)
230       path->SetPathname("c:\\Users\\test_user", "");
231 #else
232       path->SetPathname("/home/user/test_user", "");
233 #endif
234       return true;
235     }
GetAppTempFolder(Pathname * path)236     bool GetAppTempFolder(Pathname *path) {
237       EXPECT_TRUE(false) << "Unsupported operation";
238       return false;
239     }
GetDiskFreeSpace(const Pathname & path,int64_t * freebytes)240     bool GetDiskFreeSpace(const Pathname& path, int64_t* freebytes) {
241       EXPECT_TRUE(false) << "Unsupported operation";
242       return false;
243     }
GetCurrentDirectory()244     Pathname GetCurrentDirectory() {
245       return Pathname();
246     }
247 
248   private:
249     const std::vector<File> all_files_;
250 };
251 }  // namespace rtc
252 
253 #endif  // WEBRTC_BASE_FILEUTILS_MOCK_H_
254