From 0b48ab20bb48f42a3cc114351444b3979aecb6c2 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Wed, 3 Jun 2020 13:45:31 +0400 Subject: [PATCH] Enhanced the server unit-test with corner cases --- test/data/corner_cases.zim | Bin 0 -> 75741 bytes test/data/corner_cases/empty.css | 0 test/data/corner_cases/empty.html | 0 test/data/corner_cases/empty.js | 0 test/data/corner_cases/empty.png | 0 test/data/create_corner_cases_zim_file | 15 +++++++++++++++ test/meson.build | 3 +++ test/server.cpp | 24 +++++++++++++++++------- 8 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 test/data/corner_cases.zim create mode 100644 test/data/corner_cases/empty.css create mode 100644 test/data/corner_cases/empty.html create mode 100644 test/data/corner_cases/empty.js create mode 100644 test/data/corner_cases/empty.png create mode 100755 test/data/create_corner_cases_zim_file diff --git a/test/data/corner_cases.zim b/test/data/corner_cases.zim new file mode 100644 index 0000000000000000000000000000000000000000..650c1d9622d8729c5d6912e38935194c4c6842dd GIT binary patch literal 75741 zcmeI*eTWog9KiA4?CtHnZ1)-kVl`K&A#!(~f23GfT!xpWCV1c_1~cuA>*Vh2b~}4s zC0R*tSYWRQ{ZXO>6%}e3MiduRRFqkPU65r~q+v<*N0G?&duB&D@9z!_zY8IdrGo?}`u`bN#Dyd@5^@F%m0s;v9Cj!Zn^Y83mEn@kXeS1YhF10SwW}83j z|KyPDlJYImCUa{y?c2C@Uh=WO#0;y$j|){)OCg&CKRYHotK4vnT#;=|23%UH6V`*z)IVn|92;q3^++Gwyi(f`M1I z-rutCzTa0meGBS8-?Dl7=A-{ipTF|R(%;7R{WS8_-tOqc4!ktus929$yY;@a?85E8 zTs^m8i@70*b@OVg*$mQb+jMKQq^Y4lx{tK==G;;#8T|eJTi+&rxas1@=UnyBz?Zkq zwk)YhO3I2FNQjkeOj=j@< z-X58v?r0VP1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmdVrM!-o|d--B` zht8kx63eMg$RRy1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5IB1UoJL*1zo#>Lv7p2JKZp~JRiFQVWq&0t(ft1-XYcSC z83G6(fB*srAbK_o) zB_(Ag%*pAy1IgBuRb|puk}&C{N$VFAb>ABAEp1(Uhzi*ufB*srAbrcj+NArc>rC2Rf-L*{=)rcR6(lO~je)X&D`Ib7ilTcZ;DP=DdY- zuiQ`=9LN;PLAbE%%B)xDC>Bb7=of;8^PGly8O^ytw(MrTZZB{eQ!={V4+hqjbGgtP z4xI>4pZ_1U4@T?%AB!^BA%Fk^2q1s}0tg_000IagfB*srAbBR=l2o<%m>?w4cIh&_w0s zfJ~_rWu7iN?{v{^S~5Ofsg%^*weFCgDFh<=r6;PSyY%V9&1(jgMkOJ##2jG8VLp|v zia}PST4Y%zQ>0N7i_Cfk-r$)9T3;3odTv;lR8X%4*SVp0=HX^=*LkJPps!0Mm;p}g zq(%!D=iH$}c~V=NFH7Sk6V9xn)n&PxpVW&vnHA+*bAD;vQ;qn&0PU6?o!M^%s&pv(`f-*RS6qL8EbM9f!_gx9Gcp^hcp>alE`k+mc|w8#YIu zu4RTBEgUhaO4LDo{0B2CztHz_JQ2s{nU(ymI4+H&7stEf_+%V+#qr}f{usx9;&{QV zN_!n~TpY(WaV*90#W+qpbAw`jV1*LHX?{=RZ3xZfU@ky&&6-QvTu@EAHS5-*TdQtS dWes~wBl_vt-SWg`?~Pxwzi-vFcdh##_!pV~iE;n{ literal 0 HcmV?d00001 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);