diff --git a/test/data/corner_cases.zim b/test/data/corner_cases.zim new file mode 100644 index 000000000..650c1d962 Binary files /dev/null and b/test/data/corner_cases.zim differ diff --git a/test/data/corner_cases/empty.css b/test/data/corner_cases/empty.css new file mode 100644 index 000000000..e69de29bb diff --git a/test/data/corner_cases/empty.html b/test/data/corner_cases/empty.html new file mode 100644 index 000000000..e69de29bb diff --git a/test/data/corner_cases/empty.js b/test/data/corner_cases/empty.js new file mode 100644 index 000000000..e69de29bb diff --git a/test/data/corner_cases/empty.png b/test/data/corner_cases/empty.png new file mode 100644 index 000000000..e69de29bb diff --git a/test/data/create_corner_cases_zim_file b/test/data/create_corner_cases_zim_file new file mode 100755 index 000000000..9462a63ea --- /dev/null +++ b/test/data/create_corner_cases_zim_file @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +cd "$(dirname "$0")" +rm -f corner_cases.zim +zimwriterfs -w empty.html \ + -f empty.png \ + -l=en \ + -t="ZIM corner cases" \ + -d="" \ + -c="" \ + -p="" \ + corner_cases \ + corner_cases.zim \ +&& echo 'corner_cases.zim was successfully created' \ +|| echo '!!! Failed to create corner_cases.zim !!!' >&2 diff --git a/test/meson.build b/test/meson.build index bfbe9a7a3..eefd351d3 100644 --- a/test/meson.build +++ b/test/meson.build @@ -29,6 +29,9 @@ if gtest_dep.found() and not meson.is_cross_build() configure_file(input : 'data/wikipedia_en_ray_charles_mini_2020-03.zim', output : 'zimfile.zim', copy: true ) + configure_file(input : 'data/corner_cases.zim', + output : 'corner_cases.zim', + copy: true ) foreach test_name : tests # XXX: implicit_include_directories must be set to false, otherwise diff --git a/test/server.cpp b/test/server.cpp index 16718b5dc..51243024b 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -50,9 +50,10 @@ class ZimFileServer { public: // types typedef std::shared_ptr Response; + typedef std::vector FilePathCollection; public: // functions - ZimFileServer(int serverPort, std::string zimpath); + ZimFileServer(int serverPort, const FilePathCollection& zimpaths); ~ZimFileServer(); Response GET(const char* path, const Headers& headers = Headers()) @@ -73,11 +74,13 @@ private: // data std::unique_ptr client; }; -ZimFileServer::ZimFileServer(int serverPort, std::string zimpath) +ZimFileServer::ZimFileServer(int serverPort, const FilePathCollection& zimpaths) : manager(&this->library) { - if (!manager.addBookFromPath(zimpath, zimpath, "", false)) - throw std::runtime_error("Unable to add the ZIM file '" + zimpath + "'"); + for ( const auto zimpath : zimpaths ) { + if (!manager.addBookFromPath(zimpath, zimpath, "", false)) + throw std::runtime_error("Unable to add the ZIM file '" + zimpath + "'"); + } const std::string address = "127.0.0.1"; nameMapper.reset(new kiwix::HumanReadableNameMapper(library, false)); @@ -104,11 +107,14 @@ protected: std::unique_ptr zfs1_; const int PORT = 8001; - const std::string ZIMFILE = "./test/zimfile.zim"; + const ZimFileServer::FilePathCollection ZIMFILES { + "./test/zimfile.zim", + "./test/corner_cases.zim" + }; protected: void SetUp() override { - zfs1_.reset(new ZimFileServer(PORT, ZIMFILE)); + zfs1_.reset(new ZimFileServer(PORT, ZIMFILES)); } void TearDown() override { @@ -174,6 +180,10 @@ const ResourceCollection resources200Uncompressible{ { WITH_ETAG, "/meta?content=zimfile&name=favicon" }, { WITH_ETAG, "/zimfile/I/m/Ray_Charles_classic_piano_pose.jpg" }, + + { WITH_ETAG, "/corner_cases/A/empty.html" }, + { WITH_ETAG, "/corner_cases/-/empty.css" }, + { WITH_ETAG, "/corner_cases/-/empty.js" }, }; ResourceCollection all200Resources() @@ -307,7 +317,7 @@ TEST_F(ServerTest, ETagIsTheSameAcrossHeadAndGet) TEST_F(ServerTest, DifferentServerInstancesProduceDifferentETags) { - ZimFileServer zfs2(PORT + 1, ZIMFILE); + ZimFileServer zfs2(PORT + 1, ZIMFILES); for ( const Resource& res : all200Resources() ) { if ( !res.etag_expected ) continue; const auto h1 = zfs1_->HEAD(res.url);