1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
3 | #include "Private/UnitTests/BsFileSystemTestSuite.h" |
4 | |
5 | #include "Debug/BsDebug.h" |
6 | #include "Error/BsException.h" |
7 | #include "FileSystem/BsFileSystem.h" |
8 | |
9 | #include <algorithm> |
10 | #include <fstream> |
11 | |
12 | namespace bs |
13 | { |
14 | const String testDirectoryName = "FileSystemTestDirectory/" ; |
15 | |
16 | void createFile(Path path, String content) |
17 | { |
18 | std::ofstream fs; |
19 | fs.open(path.toPlatformString().c_str()); |
20 | fs << content; |
21 | fs.close(); |
22 | } |
23 | |
24 | void createEmptyFile(Path path) |
25 | { |
26 | createFile(path, "" ); |
27 | } |
28 | |
29 | String readFile(Path path) |
30 | { |
31 | String content; |
32 | std::ifstream fs; |
33 | fs.open(path.toPlatformString().c_str()); |
34 | fs >> content; |
35 | fs.close(); |
36 | return content; |
37 | } |
38 | |
39 | void FileSystemTestSuite::startUp() |
40 | { |
41 | mTestDirectory = FileSystem::getWorkingDirectoryPath() + testDirectoryName; |
42 | if (FileSystem::exists(mTestDirectory)) |
43 | { |
44 | BS_EXCEPT(InternalErrorException, |
45 | String("Directory '" ) + testDirectoryName |
46 | + "' should not already exist; you should remove it manually." ); |
47 | } |
48 | else |
49 | { |
50 | FileSystem::createDir(mTestDirectory); |
51 | BS_TEST_ASSERT_MSG(FileSystem::exists(mTestDirectory), "FileSystemTestSuite::startUp(): test directory creation failed" ); |
52 | } |
53 | } |
54 | |
55 | void FileSystemTestSuite::shutDown() |
56 | { |
57 | FileSystem::remove(mTestDirectory, true); |
58 | if (FileSystem::exists(mTestDirectory)) |
59 | { |
60 | LOGERR("FileSystemTestSuite failed to delete '" + mTestDirectory.toString() |
61 | + "', you should remove it manually." ); |
62 | } |
63 | } |
64 | |
65 | FileSystemTestSuite::FileSystemTestSuite() |
66 | { |
67 | BS_ADD_TEST(FileSystemTestSuite::testExists_yes_file); |
68 | BS_ADD_TEST(FileSystemTestSuite::testExists_yes_dir); |
69 | BS_ADD_TEST(FileSystemTestSuite::testExists_no); |
70 | BS_ADD_TEST(FileSystemTestSuite::testGetFileSize_zero); |
71 | BS_ADD_TEST(FileSystemTestSuite::testGetFileSize_not_zero); |
72 | BS_ADD_TEST(FileSystemTestSuite::testIsFile_yes); |
73 | BS_ADD_TEST(FileSystemTestSuite::testIsFile_no); |
74 | BS_ADD_TEST(FileSystemTestSuite::testIsDirectory_yes); |
75 | BS_ADD_TEST(FileSystemTestSuite::testIsDirectory_no); |
76 | BS_ADD_TEST(FileSystemTestSuite::testRemove_file); |
77 | BS_ADD_TEST(FileSystemTestSuite::testRemove_directory); |
78 | BS_ADD_TEST(FileSystemTestSuite::testMove); |
79 | BS_ADD_TEST(FileSystemTestSuite::testMove_overwrite_existing); |
80 | BS_ADD_TEST(FileSystemTestSuite::testMove_no_overwrite_existing); |
81 | BS_ADD_TEST(FileSystemTestSuite::testCopy); |
82 | BS_ADD_TEST(FileSystemTestSuite::testCopy_overwrite_existing); |
83 | BS_ADD_TEST(FileSystemTestSuite::testCopy_no_overwrite_existing); |
84 | BS_ADD_TEST(FileSystemTestSuite::testGetChildren); |
85 | BS_ADD_TEST(FileSystemTestSuite::testGetLastModifiedTime); |
86 | BS_ADD_TEST(FileSystemTestSuite::testGetTempDirectoryPath); |
87 | } |
88 | |
89 | void FileSystemTestSuite::testExists_yes_file() |
90 | { |
91 | Path path = mTestDirectory + "plop" ; |
92 | createEmptyFile(path); |
93 | BS_TEST_ASSERT(FileSystem::exists(path)); |
94 | FileSystem::remove(path); |
95 | } |
96 | |
97 | void FileSystemTestSuite::testExists_yes_dir() |
98 | { |
99 | Path path = mTestDirectory + "plop/" ; |
100 | FileSystem::createDir(path); |
101 | BS_TEST_ASSERT(FileSystem::exists(path)); |
102 | FileSystem::remove(path); |
103 | } |
104 | |
105 | void FileSystemTestSuite::testExists_no() |
106 | { |
107 | BS_TEST_ASSERT(!FileSystem::exists(Path("this-file-does-not-exist" ))); |
108 | } |
109 | |
110 | void FileSystemTestSuite::testGetFileSize_zero() |
111 | { |
112 | Path path = mTestDirectory + "file-size-test-1" ; |
113 | createEmptyFile(path); |
114 | BS_TEST_ASSERT(FileSystem::getFileSize(path) == 0); |
115 | FileSystem::remove(path); |
116 | } |
117 | |
118 | void FileSystemTestSuite::testGetFileSize_not_zero() |
119 | { |
120 | Path path = mTestDirectory + "file-size-test-2" ; |
121 | createFile(path, "0123456789" ); |
122 | BS_TEST_ASSERT(FileSystem::getFileSize(path) == 10); |
123 | FileSystem::remove(path); |
124 | } |
125 | |
126 | void FileSystemTestSuite::testIsFile_yes() |
127 | { |
128 | Path path = mTestDirectory + "some-file-1" ; |
129 | createEmptyFile(path); |
130 | BS_TEST_ASSERT(FileSystem::isFile(path)); |
131 | } |
132 | |
133 | void FileSystemTestSuite::testIsFile_no() |
134 | { |
135 | Path path = mTestDirectory + "some-directory-1/" ; |
136 | FileSystem::createDir(path); |
137 | BS_TEST_ASSERT(!FileSystem::isFile(path)); |
138 | } |
139 | |
140 | void FileSystemTestSuite::testIsDirectory_yes() |
141 | { |
142 | Path path = mTestDirectory + "some-directory-2/" ; |
143 | FileSystem::createDir(path); |
144 | BS_TEST_ASSERT(FileSystem::isDirectory(path)); |
145 | } |
146 | |
147 | void FileSystemTestSuite::testIsDirectory_no() |
148 | { |
149 | Path path = mTestDirectory + "some-file-2" ; |
150 | createEmptyFile(path); |
151 | BS_TEST_ASSERT(!FileSystem::isDirectory(path)); |
152 | } |
153 | |
154 | void FileSystemTestSuite::testRemove_file() |
155 | { |
156 | Path path = mTestDirectory + "file-to-remove" ; |
157 | createEmptyFile(path); |
158 | BS_TEST_ASSERT(FileSystem::exists(path)); |
159 | FileSystem::remove(path); |
160 | BS_TEST_ASSERT(!FileSystem::exists(path)); |
161 | } |
162 | |
163 | void FileSystemTestSuite::testRemove_directory() |
164 | { |
165 | Path path = mTestDirectory + "directory-to-remove/" ; |
166 | FileSystem::createDir(path); |
167 | BS_TEST_ASSERT(FileSystem::exists(path)); |
168 | FileSystem::remove(path, true); |
169 | BS_TEST_ASSERT(!FileSystem::exists(path)); |
170 | } |
171 | |
172 | void FileSystemTestSuite::testMove() |
173 | { |
174 | Path source = mTestDirectory + "move-source-1" ; |
175 | Path destination = mTestDirectory + "move-destination-1" ; |
176 | createFile(source, "move-data-source-1" ); |
177 | BS_TEST_ASSERT(FileSystem::exists(source)); |
178 | BS_TEST_ASSERT(!FileSystem::exists(destination)); |
179 | FileSystem::move(source, destination); |
180 | BS_TEST_ASSERT(!FileSystem::exists(source)); |
181 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
182 | BS_TEST_ASSERT(readFile(destination) == "move-data-source-1" ); |
183 | } |
184 | |
185 | void FileSystemTestSuite::testMove_overwrite_existing() |
186 | { |
187 | Path source = mTestDirectory + "move-source-2" ; |
188 | Path destination = mTestDirectory + "move-destination-2" ; |
189 | createFile(source, "move-data-source-2" ); |
190 | createFile(destination, "move-data-destination-2" ); |
191 | BS_TEST_ASSERT(FileSystem::exists(source)); |
192 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
193 | FileSystem::move(source, destination, true); |
194 | BS_TEST_ASSERT(!FileSystem::exists(source)); |
195 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
196 | BS_TEST_ASSERT(readFile(destination) == "move-data-source-2" ); |
197 | } |
198 | |
199 | void FileSystemTestSuite::testMove_no_overwrite_existing() |
200 | { |
201 | Path source = mTestDirectory + "move-source-3" ; |
202 | Path destination = mTestDirectory + "move-destination-3" ; |
203 | createFile(source, "move-data-source-3" ); |
204 | createFile(destination, "move-data-destination-3" ); |
205 | BS_TEST_ASSERT(FileSystem::exists(source)); |
206 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
207 | FileSystem::move(source, destination, false); |
208 | BS_TEST_ASSERT(FileSystem::exists(source)); |
209 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
210 | BS_TEST_ASSERT(readFile(destination) == "move-data-destination-3" ); |
211 | } |
212 | |
213 | void FileSystemTestSuite::testCopy() |
214 | { |
215 | Path source = mTestDirectory + "copy-source-1" ; |
216 | Path destination = mTestDirectory + "copy-destination-1" ; |
217 | createFile(source, "copy-data-source-1" ); |
218 | BS_TEST_ASSERT(FileSystem::exists(source)); |
219 | BS_TEST_ASSERT(!FileSystem::exists(destination)); |
220 | FileSystem::copy(source, destination); |
221 | BS_TEST_ASSERT(FileSystem::exists(source)); |
222 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
223 | BS_TEST_ASSERT(readFile(source) == "copy-data-source-1" ); |
224 | BS_TEST_ASSERT(readFile(destination) == "copy-data-source-1" ); |
225 | } |
226 | |
227 | void FileSystemTestSuite::testCopy_overwrite_existing() |
228 | { |
229 | Path source = mTestDirectory + "copy-source-2" ; |
230 | Path destination = mTestDirectory + "copy-destination-2" ; |
231 | createFile(source, "copy-data-source-2" ); |
232 | createFile(destination, "copy-data-destination-2" ); |
233 | BS_TEST_ASSERT(FileSystem::exists(source)); |
234 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
235 | FileSystem::copy(source, destination, true); |
236 | BS_TEST_ASSERT(FileSystem::exists(source)); |
237 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
238 | BS_TEST_ASSERT(readFile(source) == "copy-data-source-2" ); |
239 | BS_TEST_ASSERT(readFile(destination) == "copy-data-source-2" ); |
240 | } |
241 | |
242 | void FileSystemTestSuite::testCopy_no_overwrite_existing() |
243 | { |
244 | Path source = mTestDirectory + "copy-source-3" ; |
245 | Path destination = mTestDirectory + "copy-destination-3" ; |
246 | createFile(source, "copy-data-source-3" ); |
247 | createFile(destination, "copy-data-destination-3" ); |
248 | BS_TEST_ASSERT(FileSystem::exists(source)); |
249 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
250 | FileSystem::copy(source, destination, false); |
251 | BS_TEST_ASSERT(FileSystem::exists(source)); |
252 | BS_TEST_ASSERT(FileSystem::exists(destination)); |
253 | BS_TEST_ASSERT(readFile(source) == "copy-data-source-3" ); |
254 | BS_TEST_ASSERT(readFile(destination) == "copy-data-destination-3" ); |
255 | } |
256 | |
257 | |
258 | #define CONTAINS(v, e) (std::find(v.begin(), v.end(), e) != v.end()) |
259 | |
260 | void FileSystemTestSuite::testGetChildren() |
261 | { |
262 | Path path = mTestDirectory + "get-children-test/" ; |
263 | FileSystem::createDir(path); |
264 | FileSystem::createDir(path + "foo/" ); |
265 | FileSystem::createDir(path + "bar/" ); |
266 | FileSystem::createDir(path + "baz/" ); |
267 | createEmptyFile(path + "ga" ); |
268 | createEmptyFile(path + "bu" ); |
269 | createEmptyFile(path + "zo" ); |
270 | createEmptyFile(path + "meu" ); |
271 | Vector<Path> files, directories; |
272 | FileSystem::getChildren(path, files, directories); |
273 | BS_TEST_ASSERT(files.size() == 4); |
274 | BS_TEST_ASSERT(CONTAINS(files, path + "ga" )); |
275 | BS_TEST_ASSERT(CONTAINS(files, path + "bu" )); |
276 | BS_TEST_ASSERT(CONTAINS(files, path + "zo" )); |
277 | BS_TEST_ASSERT(CONTAINS(files, path + "meu" )); |
278 | BS_TEST_ASSERT(directories.size() == 3); |
279 | BS_TEST_ASSERT(CONTAINS(directories, path + "foo" )); |
280 | BS_TEST_ASSERT(CONTAINS(directories, path + "bar" )); |
281 | BS_TEST_ASSERT(CONTAINS(directories, path + "baz" )); |
282 | } |
283 | |
284 | void FileSystemTestSuite::testGetLastModifiedTime() |
285 | { |
286 | std::time_t beforeTime; |
287 | time(&beforeTime); |
288 | |
289 | Path path = mTestDirectory + "blah1234" ; |
290 | createFile(path, "blah" ); |
291 | std::time_t mtime = FileSystem::getLastModifiedTime(path); |
292 | BS_TEST_ASSERT(mtime >= beforeTime); |
293 | BS_TEST_ASSERT(mtime <= beforeTime + 10); |
294 | } |
295 | |
296 | void FileSystemTestSuite::testGetTempDirectoryPath() |
297 | { |
298 | Path path = FileSystem::getTempDirectoryPath(); |
299 | /* No judging. */ |
300 | BS_TEST_ASSERT(!path.toString().empty()); |
301 | } |
302 | } |
303 | |