1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4 (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6
7 Copyright (c) 2000-2014 Torus Knot Software Ltd
8
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #include "ZipArchiveTests.h"
29 #include "Threading/OgreThreadHeaders.h"
30 #include "OgreCommon.h"
31 #include "OgreConfigFile.h"
32 #include "OgreFileSystemLayer.h"
33
34 using namespace Ogre;
35
fileId(const String & path)36 static String fileId(const String& path) {
37 #if !OGRE_RESOURCEMANAGER_STRICT
38 String file;
39 String base;
40 StringUtil::splitFilename(path, file, base);
41 return file;
42 #endif
43 return path;
44 }
45
46 //--------------------------------------------------------------------------
SetUp()47 void ZipArchiveTests::SetUp()
48 {
49 Ogre::ConfigFile cf;
50 cf.load(Ogre::FileSystemLayer(OGRE_VERSION_NAME).getConfigFilePath("resources.cfg"));
51 Ogre::String testPath = cf.getSettings("Tests").begin()->second+"/misc/ArchiveTest.zip";
52
53 arch = Ogre::ZipArchiveFactory().createInstance(testPath, true);
54 arch->load();
55 }
56 //--------------------------------------------------------------------------
TearDown()57 void ZipArchiveTests::TearDown()
58 {
59 OGRE_DELETE arch;
60 }
61 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,ListNonRecursive)62 TEST_F(ZipArchiveTests,ListNonRecursive)
63 {
64 StringVectorPtr vec = arch->list(false);
65
66 EXPECT_EQ((size_t)2, vec->size());
67 EXPECT_EQ(String("rootfile.txt"), vec->at(0));
68 EXPECT_EQ(String("rootfile2.txt"), vec->at(1));
69
70
71 }
72 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,ListRecursive)73 TEST_F(ZipArchiveTests,ListRecursive)
74 {
75 StringVectorPtr vec = arch->list(true);
76
77 EXPECT_EQ((size_t)6, vec->size());
78 EXPECT_EQ(fileId("level1/materials/scripts/file.material"), vec->at(0));
79 EXPECT_EQ(fileId("level1/materials/scripts/file2.material"), vec->at(1));
80 EXPECT_EQ(fileId("level2/materials/scripts/file3.material"), vec->at(2));
81 EXPECT_EQ(fileId("level2/materials/scripts/file4.material"), vec->at(3));
82 EXPECT_EQ(String("rootfile.txt"), vec->at(4));
83 EXPECT_EQ(String("rootfile2.txt"), vec->at(5));
84 }
85 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,ListFileInfoNonRecursive)86 TEST_F(ZipArchiveTests,ListFileInfoNonRecursive)
87 {
88 FileInfoListPtr vec = arch->listFileInfo(false);
89
90 EXPECT_EQ((size_t)2, vec->size());
91 FileInfo& fi1 = vec->at(0);
92 EXPECT_EQ(String("rootfile.txt"), fi1.filename);
93 EXPECT_EQ(BLANKSTRING, fi1.path);
94 EXPECT_EQ((size_t)40, fi1.compressedSize);
95 EXPECT_EQ((size_t)130, fi1.uncompressedSize);
96
97 FileInfo& fi2 = vec->at(1);
98 EXPECT_EQ(String("rootfile2.txt"), fi2.filename);
99 EXPECT_EQ(BLANKSTRING, fi2.path);
100 EXPECT_EQ((size_t)45, fi2.compressedSize);
101 EXPECT_EQ((size_t)156, fi2.uncompressedSize);
102 }
103 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,ListFileInfoRecursive)104 TEST_F(ZipArchiveTests,ListFileInfoRecursive)
105 {
106 FileInfoListPtr vec = arch->listFileInfo(true);
107
108 EXPECT_EQ((size_t)6, vec->size());
109 FileInfo& fi3 = vec->at(0);
110 EXPECT_EQ(fileId("level1/materials/scripts/file.material"), fi3.filename);
111 EXPECT_EQ(String("level1/materials/scripts/"), fi3.path);
112 EXPECT_EQ((size_t)0, fi3.compressedSize);
113 EXPECT_EQ((size_t)0, fi3.uncompressedSize);
114
115 FileInfo& fi4 = vec->at(1);
116 EXPECT_EQ(fileId("level1/materials/scripts/file2.material"), fi4.filename);
117 EXPECT_EQ(String("level1/materials/scripts/"), fi4.path);
118 EXPECT_EQ((size_t)0, fi4.compressedSize);
119 EXPECT_EQ((size_t)0, fi4.uncompressedSize);
120
121 FileInfo& fi5 = vec->at(2);
122 EXPECT_EQ(fileId("level2/materials/scripts/file3.material"), fi5.filename);
123 EXPECT_EQ(String("level2/materials/scripts/"), fi5.path);
124 EXPECT_EQ((size_t)0, fi5.compressedSize);
125 EXPECT_EQ((size_t)0, fi5.uncompressedSize);
126
127 FileInfo& fi6 = vec->at(3);
128 EXPECT_EQ(fileId("level2/materials/scripts/file4.material"), fi6.filename);
129 EXPECT_EQ(String("level2/materials/scripts/"), fi6.path);
130 EXPECT_EQ((size_t)0, fi6.compressedSize);
131 EXPECT_EQ((size_t)0, fi6.uncompressedSize);
132
133 FileInfo& fi1 = vec->at(4);
134 EXPECT_EQ(String("rootfile.txt"), fi1.filename);
135 EXPECT_EQ(BLANKSTRING, fi1.path);
136 EXPECT_EQ((size_t)40, fi1.compressedSize);
137 EXPECT_EQ((size_t)130, fi1.uncompressedSize);
138
139 FileInfo& fi2 = vec->at(5);
140 EXPECT_EQ(String("rootfile2.txt"), fi2.filename);
141 EXPECT_EQ(BLANKSTRING, fi2.path);
142 EXPECT_EQ((size_t)45, fi2.compressedSize);
143 EXPECT_EQ((size_t)156, fi2.uncompressedSize);
144 }
145 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,FindNonRecursive)146 TEST_F(ZipArchiveTests,FindNonRecursive)
147 {
148 StringVectorPtr vec = arch->find("*.txt", false);
149
150 EXPECT_EQ((size_t)2, vec->size());
151 EXPECT_EQ(String("rootfile.txt"), vec->at(0));
152 EXPECT_EQ(String("rootfile2.txt"), vec->at(1));
153 }
154 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,FindRecursive)155 TEST_F(ZipArchiveTests,FindRecursive)
156 {
157 StringVectorPtr vec = arch->find("*.material", true);
158
159 EXPECT_EQ((size_t)4, vec->size());
160 EXPECT_EQ(fileId("level1/materials/scripts/file.material"), vec->at(0));
161 EXPECT_EQ(fileId("level1/materials/scripts/file2.material"), vec->at(1));
162 EXPECT_EQ(fileId("level2/materials/scripts/file3.material"), vec->at(2));
163 EXPECT_EQ(fileId("level2/materials/scripts/file4.material"), vec->at(3));
164 }
165 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,FindFileInfoNonRecursive)166 TEST_F(ZipArchiveTests,FindFileInfoNonRecursive)
167 {
168 FileInfoListPtr vec = arch->findFileInfo("*.txt", false);
169
170 EXPECT_EQ((size_t)2, vec->size());
171 FileInfo& fi1 = vec->at(0);
172 EXPECT_EQ(String("rootfile.txt"), fi1.filename);
173 EXPECT_EQ(BLANKSTRING, fi1.path);
174 EXPECT_EQ((size_t)40, fi1.compressedSize);
175 EXPECT_EQ((size_t)130, fi1.uncompressedSize);
176
177 FileInfo& fi2 = vec->at(1);
178 EXPECT_EQ(String("rootfile2.txt"), fi2.filename);
179 EXPECT_EQ(BLANKSTRING, fi2.path);
180 EXPECT_EQ((size_t)45, fi2.compressedSize);
181 EXPECT_EQ((size_t)156, fi2.uncompressedSize);
182 }
183 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,FindFileInfoRecursive)184 TEST_F(ZipArchiveTests,FindFileInfoRecursive)
185 {
186 FileInfoListPtr vec = arch->findFileInfo("*.material", true);
187
188 EXPECT_EQ((size_t)4, vec->size());
189
190 FileInfo& fi3 = vec->at(0);
191 EXPECT_EQ(fileId("level1/materials/scripts/file.material"), fi3.filename);
192 EXPECT_EQ(String("level1/materials/scripts/"), fi3.path);
193 EXPECT_EQ((size_t)0, fi3.compressedSize);
194 EXPECT_EQ((size_t)0, fi3.uncompressedSize);
195
196 FileInfo& fi4 = vec->at(1);
197 EXPECT_EQ(fileId("level1/materials/scripts/file2.material"), fi4.filename);
198 EXPECT_EQ(String("level1/materials/scripts/"), fi4.path);
199 EXPECT_EQ((size_t)0, fi4.compressedSize);
200 EXPECT_EQ((size_t)0, fi4.uncompressedSize);
201
202 FileInfo& fi5 = vec->at(2);
203 EXPECT_EQ(fileId("level2/materials/scripts/file3.material"), fi5.filename);
204 EXPECT_EQ(String("level2/materials/scripts/"), fi5.path);
205 EXPECT_EQ((size_t)0, fi5.compressedSize);
206 EXPECT_EQ((size_t)0, fi5.uncompressedSize);
207
208 FileInfo& fi6 = vec->at(3);
209 EXPECT_EQ(fileId("level2/materials/scripts/file4.material"), fi6.filename);
210 EXPECT_EQ(String("level2/materials/scripts/"), fi6.path);
211 EXPECT_EQ((size_t)0, fi6.compressedSize);
212 EXPECT_EQ((size_t)0, fi6.uncompressedSize);
213 }
214 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,FileRead)215 TEST_F(ZipArchiveTests,FileRead)
216 {
217 DataStreamPtr stream = arch->open("rootfile.txt");
218 EXPECT_EQ(String("this is line 1 in file 1"), stream->getLine());
219 EXPECT_EQ(String("this is line 2 in file 1"), stream->getLine());
220 EXPECT_EQ(String("this is line 3 in file 1"), stream->getLine());
221 EXPECT_EQ(String("this is line 4 in file 1"), stream->getLine());
222 EXPECT_EQ(String("this is line 5 in file 1"), stream->getLine());
223 EXPECT_TRUE(stream->eof());
224 }
225 //--------------------------------------------------------------------------
TEST_F(ZipArchiveTests,ReadInterleave)226 TEST_F(ZipArchiveTests,ReadInterleave)
227 {
228 // Test overlapping reads from same archive
229 // File 1
230 DataStreamPtr stream1 = arch->open("rootfile.txt");
231 EXPECT_EQ(String("this is line 1 in file 1"), stream1->getLine());
232 EXPECT_EQ(String("this is line 2 in file 1"), stream1->getLine());
233
234 // File 2
235 DataStreamPtr stream2 = arch->open("rootfile2.txt");
236 EXPECT_EQ(String("this is line 1 in file 2"), stream2->getLine());
237 EXPECT_EQ(String("this is line 2 in file 2"), stream2->getLine());
238 EXPECT_EQ(String("this is line 3 in file 2"), stream2->getLine());
239
240 // File 1
241 EXPECT_EQ(String("this is line 3 in file 1"), stream1->getLine());
242 EXPECT_EQ(String("this is line 4 in file 1"), stream1->getLine());
243 EXPECT_EQ(String("this is line 5 in file 1"), stream1->getLine());
244 EXPECT_TRUE(stream1->eof());
245
246 // File 2
247 EXPECT_EQ(String("this is line 4 in file 2"), stream2->getLine());
248 EXPECT_EQ(String("this is line 5 in file 2"), stream2->getLine());
249 EXPECT_EQ(String("this is line 6 in file 2"), stream2->getLine());
250 EXPECT_TRUE(stream2->eof());
251 }
252 //--------------------------------------------------------------------------
253