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