From 5a9155696e4bc53f7a82aae0754d35d0d923c20f Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 5 Sep 2021 01:41:07 +0100 Subject: Add initial performance test --- icespider/unittests/Jamfile.jam | 19 +++++++++++ icespider/unittests/fixtures/env1 | 32 +++++++++++++++++++ icespider/unittests/testPerf.cpp | 67 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 icespider/unittests/fixtures/env1 create mode 100644 icespider/unittests/testPerf.cpp diff --git a/icespider/unittests/Jamfile.jam b/icespider/unittests/Jamfile.jam index 1011a8f..877c1df 100644 --- a/icespider/unittests/Jamfile.jam +++ b/icespider/unittests/Jamfile.jam @@ -21,6 +21,7 @@ lib slicer : : : : /usr/include/slicer ; lib slicer-json : : : : /usr/include/slicer ; lib slicer-xml : : : : /usr/include/slicer ; lib boost_utf : : boost_unit_test_framework ; +lib benchmark ; lib stdc++fs ; lib dl ; path-constant me : . ; @@ -98,6 +99,24 @@ run . : testApp ; +run + testPerf.cpp + ../fcgi/cgiRequestBase.cpp + : : : + pure + benchmark + ROOT=\"$(me)\" + ../common//icespider-common + ../core//icespider-core + ../core//icespider-core + test-fcgi + stdc++fs + slicer + slicer-json + adhocutil + ../fcgi + : testPerf ; + obj test-fcgi : test-fcgi.ice : tidy:none ; run testFcgi.cpp diff --git a/icespider/unittests/fixtures/env1 b/icespider/unittests/fixtures/env1 new file mode 100644 index 0000000..32d47c8 --- /dev/null +++ b/icespider/unittests/fixtures/env1 @@ -0,0 +1,32 @@ +CONTEXT_DOCUMENT_ROOT=/var/www/shared/vhosts/sys.randomdan.homeip.net +CONTEXT_PREFIX= +DOCUMENT_ROOT=/var/www/shared/vhosts/sys.randomdan.homeip.net +GATEWAY_INTERFACE=CGI/1.1 +HTTPS=on +HTTP_ACCEPT=*/* +HTTP_ACCEPT_ENCODING=identity +HTTP_CONNECTION=Keep-Alive +HTTP_COOKIE=s=08dc25d6-34d0-4fe9-a2eb-04c392441d06 +HTTP_HOST=sys.randomdan.homeip.net +HTTP_PROXY_CONNECTION=Keep-Alive +HTTP_USER_AGENT=Wget/1.21.1 +PATH=/usr/lib/ccache/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/12/bin +PWD=/var/www/shared/files/localhost +QUERY_STRING=q=long+search+string&m=47&utm_source=mail +REMOTE_ADDR=10.10.0.3 +REMOTE_PORT=35448 +REQUEST_METHOD=GET +REQUEST_SCHEME=https +REQUEST_URI=/env.cgi +SCRIPT_FILENAME=/var/www/shared/vhosts/sys.randomdan.homeip.net/env.cgi +SCRIPT_NAME=/env.cgi +SERVER_ADDR=fdc7:602:e9c5:b8f0::3 +SERVER_ADMIN=dan.goodliffe@randomdan.homeip.net +SERVER_NAME=sys.randomdan.homeip.net +SERVER_PORT=443 +SERVER_PROTOCOL=HTTP/1.1 +SERVER_SIGNATURE=
Apache/2.4.48 (Gentoo) mod_fcgid/2.3.9 OpenSSL/1.1.1l mod_perl/2.0.11 Perl/v5.34.0 Server at sys.randomdan.homeip.net Port 443
+SERVER_SOFTWARE=Apache/2.4.48 (Gentoo) mod_fcgid/2.3.9 OpenSSL/1.1.1l mod_perl/2.0.11 Perl/v5.34.0 +SHLVL=0 +SSL_TLS_SNI=sys.randomdan.homeip.net +_=/usr/bin/env diff --git a/icespider/unittests/testPerf.cpp b/icespider/unittests/testPerf.cpp new file mode 100644 index 0000000..d16b52d --- /dev/null +++ b/icespider/unittests/testPerf.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include + +class TestRequest : public IceSpider::CgiRequestBase { +public: + TestRequest(IceSpider::Core * c, char ** env) : IceSpider::CgiRequestBase(c, env) + { + initialize(); + } + + std::ostream & + getOutputStream() const override + { + return out; + } + + // LCOV_EXCL_START we never actually read or write anything here + std::istream & + getInputStream() const override + { + return std::cin; + } + // LCOV_EXCL_STOP + + // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes) + mutable std::stringstream out; +}; + +// NOLINTNEXTLINE(hicpp-special-member-functions) +class CharPtrPtrArray : public std::vector { +public: + explicit CharPtrPtrArray(const std::filesystem::path & p) + { + reserve(40); + std::ifstream f(p); + while (f.good()) { + std::string line; + std::getline(f, line, '\n'); + push_back(strdup(line.c_str())); + } + push_back(nullptr); + } + + ~CharPtrPtrArray() + { + for (const auto & e : *this) { + // NOLINTNEXTLINE(hicpp-no-malloc) + free(e); + } + } +}; + +class CoreFixture : public IceSpider::CoreWithDefaultRouter, public benchmark::Fixture { +}; + +BENCHMARK_F(CoreFixture, script_name_root)(benchmark::State & state) +{ + CharPtrPtrArray env(XSTR(ROOT) "/fixtures/env1"); + for (auto _ : state) { + TestRequest r(this, &env.front()); + } +} + +BENCHMARK_MAIN(); -- cgit v1.2.3