Rebased ref, commits from common ancestor: commit b04fa41fd8130a99e9453088f97806a47788f4cd Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Tue Jan 21 13:36:30 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000
Clobber gio in the configuration. Otherwise activation fails for http:// or https:// since the core mis-identifies the (disabled via core: 1c081112714e) gio provider still and won't load via the ucpdav1 provider. Change-Id: I66a58da3f94a4479729a3e39ed5070e4a05dcf69 diff --git a/loolkitconfig.xcu b/loolkitconfig.xcu index 666b6a6cc..539186947 100644 --- a/loolkitconfig.xcu +++ b/loolkitconfig.xcu @@ -28,4 +28,7 @@ <!-- Use the colibre_svg theme for the sidebar --> <item oor:path="/org.openoffice.Office.Common/Misc"><prop oor:name="SymbolStyle" oor:op="fuse"><value>colibre_svg</value></prop></item> +<!-- Disable GIO UCP we don't want --> +<item oor:path="/org.openoffice.ucb.Configuration/ContentProviders/Local/SecondaryKeys/Office/ProviderData/Provider999"><prop oor:name="URLTemplate" oor:op="fuse"><value>NeverMatchAnyUrlSuffix</value></prop></item> + </oor:items> commit c7e3d29fa687c5f412438b7e493f8d3c19e07745 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Tue Jan 21 13:36:14 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 kit: show the correct documentLoad URL when a template is used. Change-Id: Ib9b3ac3e166dfbece8c7212fc239d517ce1c0bba diff --git a/kit/Kit.cpp b/kit/Kit.cpp index 78eea14eb..34d5b86a5 100644 --- a/kit/Kit.cpp +++ b/kit/Kit.cpp @@ -54,6 +54,7 @@ #include "ChildSession.hpp" #include <Common.hpp> +#include <FileUtil.hpp> #include <IoUtil.hpp> #include "KitHelper.hpp" #include "Kit.hpp" @@ -1636,13 +1637,14 @@ private: _jailedUrl = uri; _isDocPasswordProtected = false; - LOG_DBG("Calling lokit::documentLoad(" << uriAnonym << ", \"" << options << "\")."); + const char *pURL = docTemplate.empty() ? uri.c_str() : docTemplate.c_str(); + LOG_DBG("Calling lokit::documentLoad(" << FileUtil::anonymizeUrl(pURL) << ", \"" << options << "\")."); const auto start = std::chrono::system_clock::now(); - _loKitDocument.reset(_loKit->documentLoad(docTemplate.empty() ? uri.c_str() : docTemplate.c_str(), options.c_str())); + _loKitDocument.reset(_loKit->documentLoad(pURL, options.c_str())); const auto duration = std::chrono::system_clock::now() - start; const auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(duration).count(); const double totalTime = elapsed/1000.; - LOG_DBG("Returned lokit::documentLoad(" << uriAnonym << ") in " << totalTime << "ms."); + LOG_DBG("Returned lokit::documentLoad(" << FileUtil::anonymizeUrl(pURL) << ") in " << totalTime << "ms."); #ifdef IOS // The iOS app (and the Android one) has max one document open at a time, so we can keep // a pointer to it in a global. commit b6903c1b531cf01360059fe7e50a11cba6da8985 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Tue Jan 21 12:08:06 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: forcibly serialize more. Change-Id: I2fd370c5bdd440e3be2c065f9b834ffa4e7f856b diff --git a/test/Makefile.am b/test/Makefile.am index a31e557b6..7f15ef069 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -240,6 +240,7 @@ unit-wopi-documentconflict.log : unit-wopi-versionrestore.log unit_wopi_renamefile.log : unit-wopi-documentconflict.log unit_wopi_watermark.log : unit_wopi_renamefile.log +# parallelize a couple at least. unit-http.log : unit_wopi_watermark.log unit-tiff-load.log : unit_wopi_watermark.log @@ -248,12 +249,10 @@ unit-paste.log : unit-large-paste.log unit-load-torture.log : unit-paste.log unit-rendering-options.log : unit-load-torture.log unit-password-protected.log : unit-rendering-options.log - unit-render-shape.log : unit-password-protected.log -unit-each-view.log : unit-password-protected.log -unit-session.log : unit-password-protected.log -unit-uno-command.log : unit-password-protected.log - +unit-each-view.log : unit-render-shape.log +unit-session.log : unit-each-view.log +unit-uno-command.log : unit-session.log unit-load.log : unit-uno-command.log unit-cursor.log : unit-load.log unit-calc.log : unit-cursor.log commit cecbc9a390c6b589e24704e76e0505917e181ed2 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Tue Jan 21 11:21:08 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: simplify and remove obsolete /proc grokking code. Change-Id: I482c56dd76067019d83196aa305d14703e25bb44 diff --git a/test/Makefile.am b/test/Makefile.am index e4b621755..a31e557b6 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -81,7 +81,7 @@ test_base_source = \ DeltaTests.cpp \ $(wsd_sources) -unittest_CPPFLAGS = -I$(top_srcdir) -DBUILDING_TESTS +unittest_CPPFLAGS = -I$(top_srcdir) -DBUILDING_TESTS -DSTANDALONE_CPPUNIT unittest_SOURCES = $(test_base_source) test.cpp unittest_LDADD = $(CPPUNIT_LIBS) diff --git a/test/UnitClient.cpp b/test/UnitClient.cpp index 03682fdc5..bd2378eb3 100644 --- a/test/UnitClient.cpp +++ b/test/UnitClient.cpp @@ -72,7 +72,9 @@ UnitBase *unit_create_wsd(void) } // Allows re-use of UnitClient in test.cpp impls. -#define UNIT_CLIENT_TESTS +#ifdef STANDALONE_CPPUNIT +# error "Should never be compiled this way"; +#endif #include <test.cpp> /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/test/test.cpp b/test/test.cpp index 57a7c8ff9..6613fb9b2 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -30,6 +30,9 @@ #include <Poco/FileStream.h> #include <Poco/StreamCopier.h> +#include <Unit.hpp> +#include <wsd/LOOLWSD.hpp> + #include <Log.hpp> #include "common/Protocol.hpp" @@ -172,16 +175,10 @@ bool runClientTests(bool standalone, bool verbose) if (!envar && failures.size() > 0) { std::cerr << "\nTo reproduce the first test failure use:\n\n"; -#ifndef UNIT_CLIENT_TESTS - const char *cmd = "./run_unit.sh --verbose"; - if (getenv("UNITTEST")) - cmd = "./unittest"; - std::cerr << " (cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << "\" " << cmd << ")\n\n"; - if (getenv("UNITTEST")) - { - std::cerr << "To debug:\n\n"; - std::cerr << " (cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << "\" gdb --args " << cmd << ")\n\n"; - } +#ifdef STANDALONE_CPPUNIT // unittest + const char *cmd = "./unittest"; + std::cerr << "To debug:\n\n"; + std::cerr << " (cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << "\" gdb --args " << cmd << ")\n\n"; #else std::string aLib = UnitBase::get().getUnitLibPath(); size_t lastSlash = aLib.rfind('/'); @@ -195,108 +192,8 @@ bool runClientTests(bool standalone, bool verbose) return result.wasSuccessful(); } -// Versions assuming a single user, on a single machine -#ifndef UNIT_CLIENT_TESTS - -std::vector<int> getProcPids(const char* exec_filename) -{ - std::vector<int> pids; - - // Ensure we're in the same group. - const int grp = getpgrp(); - - // Get all lokit processes. - for (auto it = Poco::DirectoryIterator(std::string("/proc")); it != Poco::DirectoryIterator(); ++it) - { - try - { - const Poco::Path& procEntry = it.path(); - const std::string& fileName = procEntry.getFileName(); - int pid; - std::size_t endPos = 0; - try - { - pid = std::stoi(fileName, &endPos); - } - catch (const std::invalid_argument&) - { - pid = 0; - } - - if (pid > 1 && endPos == fileName.length()) - { - Poco::FileInputStream stat(procEntry.toString() + "/stat"); - std::string statString; - Poco::StreamCopier::copyToString(stat, statString); - std::vector<std::string> tokens(LOOLProtocol::tokenize(statString, ' ')); - if (tokens.size() > 6 && tokens[1].find(exec_filename) == 0) - { - // We could have several make checks running at once. - int kidGrp = std::atoi(tokens[4].c_str()); - // Don't require matching grp for --debugrun invocations. - if (kidGrp != grp && !IsDebugrun) - continue; - - switch (tokens[2].c_str()[0]) - { - // Dead & zombie markers for old and new kernels. - case 'x': - case 'X': - case 'Z': - break; - default: - pids.push_back(pid); - break; - } - } - } - } - catch (const Poco::Exception&) - { - } - } - return pids; -} - -std::vector<int> getSpareKitPids() -{ - return getProcPids("(kit_spare_"); -} - -std::vector<int> getDocKitPids() -{ - return getProcPids("(kitbroker_"); -} - -std::vector<int> getKitPids() -{ - std::vector<int> pids = getSpareKitPids(); - for (int pid : getDocKitPids()) - pids.push_back(pid); - - return pids; -} - -int getLoolKitProcessCount() -{ - return getKitPids().size(); -} - -std::vector<int> getForKitPids() -{ - std::vector<int> pids, pids2; - - pids = getProcPids("(loolforkit)"); - pids2 = getProcPids("(forkit)"); - pids.insert(pids.end(), pids2.begin(), pids2.end()); - - return pids; -} - -#else // UNIT_CLIENT_TESTS - -// Here we are compiled inside UnitClient.cpp and we have -// full access to the WSD process internals. +// Standalone tests don't really use WSD +#ifndef STANDALONE_CPPUNIT std::vector<int> getKitPids() { @@ -317,12 +214,6 @@ int getLoolKitProcessCount() { return getKitPids().size(); } - -int getClientPort() -{ - return LOOLWSD::getClientPortNumber(); -} - -#endif // UNIT_CLIENT_TESTS +#endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 01fbe88c1fc09e17b75b0c54493e31e8a8d5dc2d Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Tue Jan 21 09:00:52 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: switch to using ClientPortNumber to allow parallelism. Change-Id: Ifef3bce1b217605000300b240ea74df4d264e0df diff --git a/test/DeltaTests.cpp b/test/DeltaTests.cpp index 6e230e17b..9c3eef273 100644 --- a/test/DeltaTests.cpp +++ b/test/DeltaTests.cpp @@ -14,7 +14,6 @@ #include <Delta.hpp> #include <Util.hpp> #include <Png.hpp> -#include <helpers.hpp> /// Delta unit-tests. class DeltaTests : public CPPUNIT_NS::TestFixture diff --git a/test/Makefile.am b/test/Makefile.am index f5804139e..e4b621755 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -194,7 +194,7 @@ TESTS = \ unit-wopi-documentconflict.la unit_wopi_renamefile.la unit_wopi_watermark.la \ unit-http.la \ unit-tiff-load.la \ - unit.large-paste.la \ + unit-large-paste.la \ unit-paste.la \ unit-load-torture.la \ unit-rendering-options.la \ @@ -214,7 +214,7 @@ TESTS = \ # TESTS += unit-admin.test # TESTS += unit-storage.test -# force serialization for now: +# mostly force serialization for now: # unit-base.log unit-tiletest.log : unit-base.log @@ -226,8 +226,11 @@ unit-copy-paste.log : unit-crash.log unit-typing.log : unit-copy-paste.log unit-convert.log : unit-typing.log unit-prefork.log : unit-convert.log + +# try a couple in parallel unit-tilecache.log : unit-prefork.log -unit-timeout.log : unit-tilecache.log +unit-timeout.log : unit-prefork.log + unit-oauth.log : unit-timeout.log unit-wopi.log : unit-oauth.log unit-wopi-saveas.log : unit-wopi.log @@ -236,17 +239,21 @@ unit-wopi-versionrestore.log : unit-wopi-ownertermination.log unit-wopi-documentconflict.log : unit-wopi-versionrestore.log unit_wopi_renamefile.log : unit-wopi-documentconflict.log unit_wopi_watermark.log : unit_wopi_renamefile.log + unit-http.log : unit_wopi_watermark.log -unit-tiff-load.log : unit-http.log -unit.logrge-paste.log : unit-tiff-load.log -unit-paste.log : unit.logrge-paste.log +unit-tiff-load.log : unit_wopi_watermark.log + +unit-large-paste.log : unit-tiff-load.log +unit-paste.log : unit-large-paste.log unit-load-torture.log : unit-paste.log unit-rendering-options.log : unit-load-torture.log unit-password-protected.log : unit-rendering-options.log + unit-render-shape.log : unit-password-protected.log -unit-each-view.log : unit-render-shape.log -unit-session.log : unit-each-view.log -unit-uno-command.log : unit-session.log +unit-each-view.log : unit-password-protected.log +unit-session.log : unit-password-protected.log +unit-uno-command.log : unit-password-protected.log + unit-load.log : unit-uno-command.log unit-cursor.log : unit-load.log unit-calc.log : unit-cursor.log @@ -257,10 +264,8 @@ unit-hosting.log : unit-bad-doc-load.log unit-wopi-loadencoded.log : unit-hosting.log unit-wopi-temp.log : unit-wopi-loadencoded.log -# end force serialization +# end forced serialization -else -TESTS = ${top_builddir}/test/test endif TEST_EXTENSIONS = .la diff --git a/test/UnitWOPITemplate.cpp b/test/UnitWOPITemplate.cpp index d133178ec..efe4574be 100644 --- a/test/UnitWOPITemplate.cpp +++ b/test/UnitWOPITemplate.cpp @@ -46,7 +46,7 @@ public: Poco::LocalDateTime now; Poco::JSON::Object::Ptr fileInfo = new Poco::JSON::Object(); fileInfo->set("BaseFileName", "test.odt"); - fileInfo->set("TemplateSource", std::string("http://127.0.0.1:") + std::to_string(helpers::getClientPort()) + "/test.ott"); // must be http, otherwise Neon in the core complains + fileInfo->set("TemplateSource", std::string("http://127.0.0.1:") + std::to_string(ClientPortNumber) + "/test.ott"); // must be http, otherwise Neon in the core complains fileInfo->set("Size", getFileContent().size()); fileInfo->set("Version", "1.0"); fileInfo->set("OwnerId", "test"); diff --git a/test/helpers.hpp b/test/helpers.hpp index 32608b5a2..9aa15d518 100644 --- a/test/helpers.hpp +++ b/test/helpers.hpp @@ -31,6 +31,7 @@ #include <Common.hpp> #include "common/FileUtil.hpp" +#include "test/test.hpp" #include <LOOLWebSocket.hpp> #include <Util.hpp> @@ -187,15 +188,6 @@ Poco::Net::HTTPClientSession* createSession(const Poco::URI& uri) return new Poco::Net::HTTPClientSession(uri.getHost(), uri.getPort()); } -#ifndef UNIT_CLIENT_TESTS - -inline int getClientPort() -{ - return DEFAULT_CLIENT_PORT_NUMBER; -} - -#endif - inline std::shared_ptr<Poco::Net::StreamSocket> createRawSocket() { return @@ -204,7 +196,7 @@ inline std::shared_ptr<Poco::Net::StreamSocket> createRawSocket() #else std::make_shared<Poco::Net::StreamSocket> #endif - (Poco::Net::SocketAddress("127.0.0.1", getClientPort())); + (Poco::Net::SocketAddress("127.0.0.1", ClientPortNumber)); } inline @@ -216,7 +208,7 @@ std::string const & getTestServerURI() #else "http://127.0.0.1:" #endif - + std::to_string(getClientPort())); + + std::to_string(ClientPortNumber)); return serverURI; } diff --git a/test/httpcrashtest.cpp b/test/httpcrashtest.cpp index 1d271725b..904b4330e 100644 --- a/test/httpcrashtest.cpp +++ b/test/httpcrashtest.cpp @@ -39,9 +39,9 @@ #include <Util.hpp> #include <Protocol.hpp> #include <LOOLWebSocket.hpp> +#include <test.hpp> #include <helpers.hpp> #include <countloolkits.hpp> -#include <test.hpp> using namespace helpers; diff --git a/tools/Stress.cpp b/tools/Stress.cpp index 1a4d17124..b298951db 100644 --- a/tools/Stress.cpp +++ b/tools/Stress.cpp @@ -34,6 +34,8 @@ #include <TraceFile.hpp> #include <test/helpers.hpp> +int ClientPortNumber = DEFAULT_CLIENT_PORT_NUMBER; + /// Stress testing and performance/scalability benchmarking tool. class Stress: public Poco::Util::Application { diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index 090cde1c0..bcb0ca141 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -3254,7 +3254,6 @@ private: LOG_INF("Listening to prisoner connections on " << location); MasterLocation = location; #else - // TESTME ... constexpr int DEFAULT_MASTER_PORT_NUMBER = 9981; std::shared_ptr<ServerSocket> socket = getServerSocket( ServerSocket::Type::Public, DEFAULT_MASTER_PORT_NUMBER, PrisonerPoll, factory); commit ef05f699e995e95e6f66d807d4e08742975d379c Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Mon Jan 20 15:26:54 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: serialize tests for now. Change-Id: I6309976f324a66a57baf4678e49c0c1e09b9dc48 diff --git a/test/Makefile.am b/test/Makefile.am index e10cb7d8c..f5804139e 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -213,6 +213,52 @@ TESTS = \ unit-wopi-loadencoded.la unit-wopi-temp.la # TESTS += unit-admin.test # TESTS += unit-storage.test + +# force serialization for now: + +# unit-base.log +unit-tiletest.log : unit-base.log +unit-integration.log : unit-tiletest.log +unit-httpws.log : unit-integration.log +unit-crash.log : unit-httpws.log + +unit-copy-paste.log : unit-crash.log +unit-typing.log : unit-copy-paste.log +unit-convert.log : unit-typing.log +unit-prefork.log : unit-convert.log +unit-tilecache.log : unit-prefork.log +unit-timeout.log : unit-tilecache.log +unit-oauth.log : unit-timeout.log +unit-wopi.log : unit-oauth.log +unit-wopi-saveas.log : unit-wopi.log +unit-wopi-ownertermination.log : unit-wopi-saveas.log +unit-wopi-versionrestore.log : unit-wopi-ownertermination.log +unit-wopi-documentconflict.log : unit-wopi-versionrestore.log +unit_wopi_renamefile.log : unit-wopi-documentconflict.log +unit_wopi_watermark.log : unit_wopi_renamefile.log +unit-http.log : unit_wopi_watermark.log +unit-tiff-load.log : unit-http.log +unit.logrge-paste.log : unit-tiff-load.log +unit-paste.log : unit.logrge-paste.log +unit-load-torture.log : unit-paste.log +unit-rendering-options.log : unit-load-torture.log +unit-password-protected.log : unit-rendering-options.log +unit-render-shape.log : unit-password-protected.log +unit-each-view.log : unit-render-shape.log +unit-session.log : unit-each-view.log +unit-uno-command.log : unit-session.log +unit-load.log : unit-uno-command.log +unit-cursor.log : unit-load.log +unit-calc.log : unit-cursor.log +unit-insert-delete.log : unit-calc.log +unit-close.log : unit-insert-delete.log +unit-bad-doc-load.log : unit-close.log +unit-hosting.log : unit-bad-doc-load.log +unit-wopi-loadencoded.log : unit-hosting.log +unit-wopi-temp.log : unit-wopi-loadencoded.log + +# end force serialization + else TESTS = ${top_builddir}/test/test endif commit c7fb1f31b2cf3c3c256aeda499b1858e1820337a Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Mon Jan 20 15:16:36 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: simplify the timeout logic. Change-Id: I0c253629b983f2813237536e6e2c6d04d5b97dd1 diff --git a/test/data/convert-to.xlsx b/test/data/convert-to.xlsx index 7af9e7063..344ee0d13 100644 Binary files a/test/data/convert-to.xlsx and b/test/data/convert-to.xlsx differ diff --git a/test/helpers.hpp b/test/helpers.hpp index 19bd8804d..32608b5a2 100644 --- a/test/helpers.hpp +++ b/test/helpers.hpp @@ -261,22 +261,22 @@ std::vector<char> getResponseMessage(LOOLWebSocket& ws, const std::string& prefi try { int flags = 0; - int retries = timeoutMs / 500; - const Poco::Timespan waitTime(retries ? timeoutMs * 1000 / retries : timeoutMs * 1000); std::vector<char> response; - bool timedout = false; + auto endTime = std::chrono::steady_clock::now() + std::chrono::milliseconds(timeoutMs); + ws.setReceiveTimeout(0); do { - if (ws.poll(waitTime, Poco::Net::Socket::SELECT_READ)) + auto now = std::chrono::steady_clock::now(); + if (now > endTime) // timedout + { + TST_LOG("Timeout."); + break; + } + long waitTimeUs = std::chrono::duration_cast<std::chrono::microseconds>(endTime - now).count(); + if (ws.poll(Poco::Timespan(waitTimeUs), Poco::Net::Socket::SELECT_READ)) { - if (timedout) - { - TST_LOG_END; - timedout = false; - } - response.resize(READ_BUFFER_SIZE * 8); const int bytes = ws.receiveFrame(response.data(), response.size(), flags); response.resize(std::max(bytes, 0)); @@ -312,31 +312,11 @@ std::vector<char> getResponseMessage(LOOLWebSocket& ws, const std::string& prefi LOOLProtocol::getAbbreviatedFrameDump(response.data(), bytes, flags)); } } - else - { - if (!timedout) - { - TST_LOG_BEGIN("Timeout (" << (retries > 1 ? "retrying" : "giving up") << ") "); - } - else - { - TST_LOG_APPEND(retries << ' '); - } - - --retries; - timedout = true; - } - } - while (retries > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE); - - if (timedout) - { - TST_LOG_END; } + while ((flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE); } catch (const Poco::Net::WebSocketException& exc) { - TST_LOG_END; TST_LOG(exc.message()); } commit 0edf084c5da2dd600851134d4327734925e379df Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Fri Jan 17 21:18:42 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: dung out redundant LOOL_TEST_CLIENT_PORT. And cleanup other related oddities. Change-Id: I2d179a2ece6a8553e10e406ad4e5da08a2ff58e5 diff --git a/kit/ForKit.cpp b/kit/ForKit.cpp index 164489589..ac0191e33 100644 --- a/kit/ForKit.cpp +++ b/kit/ForKit.cpp @@ -396,15 +396,6 @@ int main(int argc, char** argv) std::string sysTemplate; std::string loTemplate; -#if ENABLE_DEBUG - static const char* clientPort = std::getenv("LOOL_TEST_CLIENT_PORT"); - if (clientPort) - ClientPortNumber = std::stoi(clientPort); - static const char* masterPort = std::getenv("LOOL_TEST_MASTER_PORT"); - if (masterPort) - MasterLocation = masterPort; -#endif - for (int i = 0; i < argc; ++i) { char *cmd = argv[i]; diff --git a/test/Makefile.am b/test/Makefile.am index 2b369465a..e10cb7d8c 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2,12 +2,10 @@ export MAX_CONCURRENCY=4 AUTOMAKE_OPTION = serial-tests -# unittest: tests that do not need loolwsd running, and that are run during a -# normal build -# test: tests that need loolwsd running, and that are run via 'make check' -check_PROGRAMS = test fakesockettest +# unittest: tests that run a captive loolwsd as part of themselves. +check_PROGRAMS = fakesockettest -noinst_PROGRAMS = test fakesockettest unittest +noinst_PROGRAMS = fakesockettest unittest AM_CXXFLAGS = $(CPPUNIT_CFLAGS) -DTDOC=\"$(abs_top_srcdir)/test/data\" \ -I${top_srcdir}/common -I${top_srcdir}/net -I${top_srcdir}/wsd -I${top_srcdir}/kit @@ -87,10 +85,6 @@ unittest_CPPFLAGS = -I$(top_srcdir) -DBUILDING_TESTS unittest_SOURCES = $(test_base_source) test.cpp unittest_LDADD = $(CPPUNIT_LIBS) -test_CPPFLAGS = -I$(top_srcdir) -DBUILDING_TESTS -test_SOURCES = $(test_all_source) test.cpp -test_LDADD = $(CPPUNIT_LIBS) - fakesockettest_SOURCES = fakesockettest.cpp ../net/FakeSocket.cpp fakesockettest_LDADD = $(CPPUNIT_LIBS) diff --git a/test/TileCacheTests.cpp b/test/TileCacheTests.cpp index 7dc7d1500..a69099bd5 100644 --- a/test/TileCacheTests.cpp +++ b/test/TileCacheTests.cpp @@ -432,6 +432,8 @@ void TileCacheTests::testUnresponsiveClient() { const std::string testname = "unresponsiveClient-"; + TST_LOG("testUnresponsiveClient."); + std::string documentPath, documentURL; getDocumentPathAndURL("hello.odt", documentPath, documentURL, testname); diff --git a/test/helpers.hpp b/test/helpers.hpp index dd638d191..19bd8804d 100644 --- a/test/helpers.hpp +++ b/test/helpers.hpp @@ -187,12 +187,15 @@ Poco::Net::HTTPClientSession* createSession(const Poco::URI& uri) return new Poco::Net::HTTPClientSession(uri.getHost(), uri.getPort()); } +#ifndef UNIT_CLIENT_TESTS + inline int getClientPort() { - static const char* clientPort = std::getenv("LOOL_TEST_CLIENT_PORT"); - return clientPort? atoi(clientPort) : DEFAULT_CLIENT_PORT_NUMBER; + return DEFAULT_CLIENT_PORT_NUMBER; } +#endif + inline std::shared_ptr<Poco::Net::StreamSocket> createRawSocket() { return diff --git a/test/integration-http-server.cpp b/test/integration-http-server.cpp index 4db04737a..8c0c87ac2 100644 --- a/test/integration-http-server.cpp +++ b/test/integration-http-server.cpp @@ -92,15 +92,13 @@ public: // A server URI which was not added to loolwsd.xml as post_allow IP or a wopi storage host Poco::URI getNotAllowedTestServerURI() { - static const char* clientPort = std::getenv("LOOL_TEST_CLIENT_PORT"); - static std::string serverURI( #if ENABLE_SSL - "https://165.227.162.232:" + "https://165.227.162.232:9980" #else - "http://165.227.162.232:" + "http://165.227.162.232:9980" #endif - + (clientPort? std::string(clientPort) : std::to_string(DEFAULT_CLIENT_PORT_NUMBER))); + ); return Poco::URI(serverURI); } @@ -236,9 +234,12 @@ void HTTPServerTest::testScriptsAndLinksPost() void HTTPServerTest::testConvertTo() { + const char *testname = "testConvertTo"; const std::string srcPath = FileUtil::getTempFilePath(TDOC, "hello.odt", "convertTo_"); std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(_uri)); - session->setTimeout(Poco::Timespan(2, 0)); // 2 seconds. + session->setTimeout(Poco::Timespan(5, 0)); // 5 seconds. + + TST_LOG("Convert-to odt -> txt"); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/lool/convert-to"); Poco::Net::HTMLForm form; @@ -253,7 +254,7 @@ void HTTPServerTest::testConvertTo() catch (const std::exception& ex) { // In case the server is still starting up. - sleep(2); + sleep(5); form.write(session->sendRequest(request)); } @@ -279,9 +280,12 @@ void HTTPServerTest::testConvertTo() void HTTPServerTest::testConvertTo2() { + const char *testname = "testConvertTo2"; const std::string srcPath = FileUtil::getTempFilePath(TDOC, "convert-to.xlsx", "convertTo_"); std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(_uri)); - session->setTimeout(Poco::Timespan(5, 0)); // 5 seconds. + session->setTimeout(Poco::Timespan(10, 0)); // 10 seconds. + + TST_LOG("Convert-to #2 xlsx -> png"); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/lool/convert-to"); Poco::Net::HTMLForm form; @@ -296,7 +300,7 @@ void HTTPServerTest::testConvertTo2() catch (const std::exception& ex) { // In case the server is still starting up. - sleep(2); + sleep(5); form.write(session->sendRequest(request)); } diff --git a/test/run_unit.sh.in b/test/run_unit.sh.in index 5fb8a6936..4b893f23c 100755 --- a/test/run_unit.sh.in +++ b/test/run_unit.sh.in @@ -70,55 +70,10 @@ fi echo "Test output is '$test_output'" echo > $test_output -if test "z$tst" == "z"; then - # run the test on a dedicated port - export LOOL_TEST_CLIENT_PORT=9984 - export LOOL_TEST_MASTER_PORT=9985 - - echo "Executing external tests" - ${trace} \ - ${abs_top_builddir}/loolwsd --o:sys_template_path="$systemplate_path" \ - --o:child_root_path="$jails_path" \ - --o:storage.filesystem[@allow]=true \ - --o:logging.level=trace \ - --o:logging.file[@enable]=false \ - --o:ssl.key_file_path="${abs_top_builddir}/etc/key.pem" \ - --o:ssl.cert_file_path="${abs_top_builddir}/etc/cert.pem" \ - --o:ssl.ca_file_path="${abs_top_builddir}/etc/ca-chain.cert.pem" \ - --o:admin_console.username=admin --o:admin_console.password=admin \ - --o:storage.ssl.enable=false \ - > "$tst_log" 2>&1 & - if test "z${SLEEPFORDEBUGGER}${SLEEPKITFORDEBUGGER}" != "z"; then - echo "sleeping for debugger" - sleep ${SLEEPFORDEBUGGER:-0} - sleep ${SLEEPKITFORDEBUGGER:-0} - fi - - echo " executing test" - - oldpath=`pwd` - cd "${abs_top_builddir}/test" - if eval ${trace} ./test ${verbose}; then - echo "Test run_test.sh passed." - echo ":test-result: PASS run_test.sh" >> $oldpath/$test_output - retval=0 - else - echo ":test-result: FAIL run_test.sh" >> $oldpath/$test_output - retval=1 - fi - - if test "z${SLEEPFORDEBUGGER}${SLEEPKITFORDEBUGGER}" == "z"; then - echo "killing $!" - kill $! - fi - - exit $retval - -else # newer unit tests. - echo "Running $tst | $tst_log ..."; - if ${trace} \ +echo "Running $tst | $tst_log ..."; +if ${trace} \ ${abs_top_builddir}/loolwsd --o:sys_template_path="$systemplate_path" \ - --o:child_root_path="$jails_path" \ + --o:child_root_path="$jails_path" \ --o:storage.filesystem[@allow]=true \ --o:logging.level=trace \ --o:ssl.key_file_path="${abs_top_builddir}/etc/key.pem" \ @@ -129,7 +84,7 @@ else # newer unit tests. --unitlib="${abs_top_builddir}/test/.libs/$tst.so" 2> "$tst_log"; then echo "Test $tst passed." echo ":test-result: PASS $tst" >> $test_output - else +else cat $tst_log echo "=============================================================" echo "Test failed on unit: $tst re-run with:" @@ -147,7 +102,6 @@ else # newer unit tests. echo " $ less $tst_log # for detailed failure log files" echo "=============================================================" echo ":test-result: FAIL $tst" >> $test_output - fi fi # vim:set shiftwidth=4 expandtab: diff --git a/test/test.cpp b/test/test.cpp index 4a5b0f6d0..57a7c8ff9 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -183,8 +183,12 @@ bool runClientTests(bool standalone, bool verbose) std::cerr << " (cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << "\" gdb --args " << cmd << ")\n\n"; } #else + std::string aLib = UnitBase::get().getUnitLibPath(); + size_t lastSlash = aLib.rfind('/'); + if (lastSlash != std::string::npos) + aLib = aLib.substr(lastSlash + 1, aLib.length() - lastSlash - 4) + ".la"; std::cerr << "(cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << - "\" ./run_unit.sh --test-name " << UnitBase::get().getUnitLibPath() << ")\n\n"; + "\" ./run_unit.sh --test-name " << aLib << ")\n\n"; #endif } @@ -314,6 +318,11 @@ int getLoolKitProcessCount() return getKitPids().size(); } +int getClientPort() +{ + return LOOLWSD::getClientPortNumber(); +} + #endif // UNIT_CLIENT_TESTS /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/test/test.hpp b/test/test.hpp index 29b6e76d3..a5a2b2280 100644 --- a/test/test.hpp +++ b/test/test.hpp @@ -31,6 +31,9 @@ std::vector<int> getDocKitPids(); /// Get the PID of the forkit std::vector<int> getForKitPids(); +/// Which port should we connect to get to WSD. +int getClientPort(); + /// How many live loolkit processes do we have ? int getLoolKitProcessCount(); diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index 4a4a61302..090cde1c0 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -1404,10 +1404,6 @@ void LOOLWSD::handleOption(const std::string& optionName, else if (optionName == "careerspan") careerSpanMs = std::stoi(value) * 1000; // Convert second to ms - static const char* clientPort = std::getenv("LOOL_TEST_CLIENT_PORT"); - if (clientPort) - ClientPortNumber = std::stoi(clientPort); - static const char* latencyMs = std::getenv("LOOL_DELAY_SOCKET_MS"); if (latencyMs) SimulatedLatencyMs = std::stoi(latencyMs); @@ -3670,6 +3666,11 @@ std::vector<std::shared_ptr<DocumentBroker>> LOOLWSD::getBrokersTestOnly() return result; } +int LOOLWSD::getClientPortNumber() +{ + return ClientPortNumber; +} + std::vector<int> LOOLWSD::getKitPids() { std::vector<int> pids; diff --git a/wsd/LOOLWSD.hpp b/wsd/LOOLWSD.hpp index 71ddb2155..35c283288 100644 --- a/wsd/LOOLWSD.hpp +++ b/wsd/LOOLWSD.hpp @@ -80,6 +80,8 @@ public: static std::set<const Poco::Util::AbstractConfiguration*> PluginConfigurations; static std::chrono::time_point<std::chrono::system_clock> StartTime; + /// For testing only [!] + static int getClientPortNumber(); /// For testing only [!] static std::vector<int> getKitPids(); /// For testing only [!] DocumentBrokers are mostly single-threaded with their own thread commit 04f3460fd22f12b82fd606944f6d4c8433b36c42 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Fri Jan 17 20:49:38 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 test: switch to parallel tests based on Unit framework. Increase a few timeouts, bin old-style standalone unit tests, fix a number of bugs. Change-Id: Ia3d59466ecb9a9443807ba3445d04dd5f77e3dba diff --git a/common/Unit.cpp b/common/Unit.cpp index 5dc01d4ea..875c97686 100644 --- a/common/Unit.cpp +++ b/common/Unit.cpp @@ -26,7 +26,7 @@ #include <common/SigUtil.hpp> UnitBase *UnitBase::Global = nullptr; - +char * UnitBase::UnitLibPath; static std::thread TimeoutThread; static std::atomic<bool> TimeoutThreadRunning(false); std::timed_mutex TimeoutThreadMutex; @@ -41,6 +41,9 @@ UnitBase *UnitBase::linkAndCreateUnit(UnitType type, const std::string &unitLibP return nullptr; } + // avoid std:string de-allocation during failure / exit. + UnitLibPath = strdup(unitLibPath.c_str()); + const char *symbol = nullptr; switch (type) { diff --git a/common/Unit.hpp b/common/Unit.hpp index 63975514b..c403100c2 100644 --- a/common/Unit.hpp +++ b/common/Unit.hpp @@ -138,11 +138,17 @@ public: return *Global; } + static std::string getUnitLibPath() { return std::string(UnitLibPath); } + private: - void setHandle(void *dlHandle) { _dlHandle = dlHandle; } + void setHandle(void *dlHandle) + { + _dlHandle = dlHandle; + } static UnitBase *linkAndCreateUnit(UnitType type, const std::string& unitLibPath); void *_dlHandle; + static char *UnitLibPath; bool _setRetValue; int _retValue; int _timeoutMilliSeconds; diff --git a/test/Makefile.am b/test/Makefile.am index f1d4963b1..2b369465a 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -13,9 +13,10 @@ AM_CXXFLAGS = $(CPPUNIT_CFLAGS) -DTDOC=\"$(abs_top_srcdir)/test/data\" \ -I${top_srcdir}/common -I${top_srcdir}/net -I${top_srcdir}/wsd -I${top_srcdir}/kit noinst_LTLIBRARIES = \ + unit-base.la unit-tiletest.la \ + unit-integration.la unit-httpws.la unit-crash.la \ unit-convert.la unit-typing.la unit-copy-paste.la \ - unit-timeout.la unit-prefork.la \ - unit-storage.la unit-client.la \ + unit-timeout.la unit-prefork.la unit-storage.la \ unit-admin.la unit-tilecache.la \ unit-fuzz.la unit-oob.la unit-http.la unit-oauth.la \ unit-wopi.la unit-wopi-saveas.la \ @@ -82,13 +83,6 @@ test_base_source = \ DeltaTests.cpp \ $(wsd_sources) -test_all_source = \ - $(test_base_source) \ - TileCacheTests.cpp \ - integration-http-server.cpp \ - httpwstest.cpp \ - httpcrashtest.cpp - unittest_CPPFLAGS = -I$(top_srcdir) -DBUILDING_TESTS unittest_SOURCES = $(test_base_source) test.cpp unittest_LDADD = $(CPPUNIT_LIBS) @@ -100,6 +94,18 @@ test_LDADD = $(CPPUNIT_LIBS) fakesockettest_SOURCES = fakesockettest.cpp ../net/FakeSocket.cpp fakesockettest_LDADD = $(CPPUNIT_LIBS) +# old-style unit tests - bootstrapped via UnitClient +unit_base_la_SOURCES = UnitClient.cpp ${test_base_source} +unit_base_la_LIBADD = $(CPPUNIT_LIBS) +unit_tiletest_la_SOURCES = UnitClient.cpp TileCacheTests.cpp +unit_tiletest_la_LIBADD = $(CPPUNIT_LIBS) +unit_integration_la_SOURCES = UnitClient.cpp integration-http-server.cpp +unit_integration_la_LIBADD = $(CPPUNIT_LIBS) +unit_httpws_la_SOURCES = UnitClient.cpp httpwstest.cpp +unit_httpws_la_LIBADD = $(CPPUNIT_LIBS) +unit_crash_la_SOURCES = UnitClient.cpp httpcrashtest.cpp +unit_crash_la_LIBADD = $(CPPUNIT_LIBS) + # unit test modules: unit_oob_la_SOURCES = UnitOOB.cpp unit_http_la_SOURCES = UnitHTTP.cpp @@ -107,8 +113,6 @@ unit_http_la_LIBADD = $(CPPUNIT_LIBS) unit_fuzz_la_SOURCES = UnitFuzz.cpp unit_admin_la_SOURCES = UnitAdmin.cpp unit_admin_la_LIBADD = $(CPPUNIT_LIBS) -unit_client_la_SOURCES = UnitClient.cpp ${test_all_source} -unit_client_la_LIBADD = $(CPPUNIT_LIBS) unit_typing_la_SOURCES = UnitTyping.cpp unit_typing_la_LIBADD = $(CPPUNIT_LIBS) unit_copy_paste_la_SOURCES = UnitCopyPaste.cpp @@ -183,16 +187,20 @@ if HAVE_LO_PATH check-local: ./fakesockettest @fc-cache "@LO_PATH@"/share/fonts/truetype - ./run_unit.sh --log-file test.log --trs-file test.trs + # FIXME 2: unit-oob.la fails with symbol undefined: # UnitWSD::testHandleRequest(UnitWSD::TestRequest, UnitHTTPServerRequest&, UnitHTTPServerResponse&) , -TESTS = unit-copy-paste.la unit-typing.la unit-convert.la unit-prefork.la unit-tilecache.la unit-timeout.la \ +TESTS = \ + unit-base.la unit-tiletest.la \ + unit-integration.la unit-httpws.la unit-crash.la \ + \ + unit-copy-paste.la unit-typing.la unit-convert.la unit-prefork.la unit-tilecache.la unit-timeout.la \ unit-oauth.la unit-wopi.la unit-wopi-saveas.la \ unit-wopi-ownertermination.la unit-wopi-versionrestore.la \ unit-wopi-documentconflict.la unit_wopi_renamefile.la unit_wopi_watermark.la \ unit-http.la \ unit-tiff-load.la \ - unit-large-paste.la \ + unit.large-paste.la \ unit-paste.la \ unit-load-torture.la \ unit-rendering-options.la \ @@ -209,9 +217,8 @@ TESTS = unit-copy-paste.la unit-typing.la unit-convert.la unit-prefork.la unit-t unit-bad-doc-load.la \ unit-hosting.la \ unit-wopi-loadencoded.la unit-wopi-temp.la -# TESTS = unit-client.la -# TESTS += unit-admin.la -# TESTS += unit-storage.la +# TESTS += unit-admin.test +# TESTS += unit-storage.test else TESTS = ${top_builddir}/test/test endif diff --git a/test/UnitClient.cpp b/test/UnitClient.cpp index e3580f90e..03682fdc5 100644 --- a/test/UnitClient.cpp +++ b/test/UnitClient.cpp @@ -7,7 +7,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -// Runs client tests in their own thread inside a WSD process. +// Runs old-style CPPUNIT tests in their own thread inside a WSD process. +// Depending which cppunit objects this is linked with this runs different +// tests. #include <config.h> diff --git a/test/helpers.hpp b/test/helpers.hpp index f09de8bbb..dd638d191 100644 --- a/test/helpers.hpp +++ b/test/helpers.hpp @@ -390,8 +390,12 @@ inline bool isDocumentLoaded(LOOLWebSocket& ws, const std::string& testname, bool isView = true) { const std::string prefix = isView ? "status:" : "statusindicatorfinish:"; - const auto message = getResponseString(ws, prefix, testname); - return LOOLProtocol::matchPrefix(prefix, message); + // Allow 20 secs to load + const auto message = getResponseString(ws, prefix, testname, 30 * 1000); + bool success = LOOLProtocol::matchPrefix(prefix, message); + if (!success) + TST_LOG("ERR: Timed out loading document"); + return success; } inline diff --git a/test/test.cpp b/test/test.cpp index cc00b2fde..4a5b0f6d0 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -183,7 +183,8 @@ bool runClientTests(bool standalone, bool verbose) std::cerr << " (cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << "\" gdb --args " << cmd << ")\n\n"; } #else - std::cerr << "(cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << "\" make check)\n\n"; + std::cerr << "(cd test; CPPUNIT_TEST_NAME=\"" << (*failures.begin())->failedTestName() << + "\" ./run_unit.sh --test-name " << UnitBase::get().getUnitLibPath() << ")\n\n"; #endif } diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index 9bf7088c6..876436abe 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -309,9 +309,9 @@ void DocumentBroker::pollThread() if (!_isLoaded && (limit_load_secs > 0) && (now > loadDeadline)) { - LOG_WRN("Doc [" << _docKey << "] is taking too long to load. Will kill process [" - << _childProcess->getPid() << "]. per_document.limit_load_secs set to " - << limit_load_secs << " secs."); + LOG_ERR("Doc [" << _docKey << "] is taking too long to load. Will kill process [" + << _childProcess->getPid() << "]. per_document.limit_load_secs set to " + << limit_load_secs << " secs."); broadcastMessage("error: cmd=load kind=docloadtimeout"); // Brutal but effective. diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index e39bfa9d0..4a4a61302 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -3283,14 +3283,19 @@ private: std::shared_ptr<ServerSocket> socket = getServerSocket( ClientListenAddr, port, WebServerPoll, factory); + + while (!socket && #ifdef BUILDING_TESTS - while (!socket) + true +#else + UnitWSD::isUnitTesting() +#endif + ) { ++port; LOG_INF("Client port " << (port - 1) << " is busy, trying " << port << "."); - socket = getServerSocket(port, WebServerPoll, factory); + socket = getServerSocket(ClientListenAddr, port, WebServerPoll, factory); } -#endif if (!socket) { commit 1c6b4be2ce84e43a4646c52d8376c19af53d945c Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Sat Jan 18 15:56:01 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 13:39:42 2020 +0000 copyFile: de-poco-ize and handle EINTR and short writes. Change-Id: I2046881c786a9f31f45c53f282de9ddd9a9cebcf diff --git a/common/FileUtil.cpp b/common/FileUtil.cpp index 5066d2938..84f4085a1 100644 --- a/common/FileUtil.cpp +++ b/common/FileUtil.cpp @@ -88,6 +88,80 @@ namespace FileUtil return name; } + void copyFileTo(const std::string &fromPath, const std::string &toPath) + { + int from = -1, to = -1; + try { + from = open(fromPath.c_str(), O_RDONLY); + if (from < 0) + { + LOG_SYS("Failed to open src " << anonymizeUrl(fromPath)); + throw; + } + + struct stat st; + if (fstat(from, &st) != 0) + { + LOG_SYS("Failed to fstat src " << anonymizeUrl(fromPath)); + throw; + } + + to = open(toPath.c_str(), O_CREAT | O_TRUNC | O_WRONLY, st.st_mode); + if (to < 0) + { + LOG_SYS("Failed to fstat dest " << anonymizeUrl(toPath)); + throw; + } + + LOG_INF("Copying " << st.st_size << " bytes from " << anonymizeUrl(fromPath) << " to " << anonymizeUrl(toPath)); + + char buffer[64 * 1024]; + + int n; + off_t bytesIn = 0; + do { + while ((n = ::read(from, buffer, sizeof(buffer))) < 0 && errno == EINTR) + LOG_TRC("EINTR reading from " << anonymizeUrl(fromPath)); + if (n < 0) + { + LOG_SYS("Failed to read from " << anonymizeUrl(fromPath) << " at " << bytesIn << " bytes in"); + throw; + } + bytesIn += n; + if (n == 0) // EOF + break; + assert (off_t(sizeof (buffer)) >= n); + // Handle short writes and EINTR + for (int j = 0; j < n;) + { + int written; + while ((written = ::write(to, buffer + j, n - j)) < 0 && errno == EINTR) + LOG_TRC("EINTR writing to " << anonymizeUrl(toPath)); + if (written < 0) + { + LOG_SYS("Failed to write " << n << " bytes to " << anonymizeUrl(toPath) << " at " << + bytesIn << " bytes into " << anonymizeUrl(fromPath)); + throw; + } + j += written; + } + } while(true); + if (bytesIn != st.st_size) + { + LOG_WRN("Unusual: file " << anonymizeUrl(fromPath) << " changed size " + "during copy from " << st.st_size << " to " << bytesIn); + } + } + catch (...) + { + LOG_SYS("Failed to copy from " << anonymizeUrl(fromPath) << " to " << anonymizeUrl(toPath)); + close(from); + close(to); + unlink(toPath.c_str()); + throw Poco::Exception("failed to copy"); + } + } + std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename, const std::string& dstFilenamePrefix) { const std::string srcPath = srcDir + '/' + srcFilename; @@ -100,7 +174,7 @@ namespace FileUtil fileDeleter.registerForDeletion(dstPath); #else const std::string dstPath = Poco::Path(Poco::Path::temp(), dstFilename).toString(); - Poco::File(srcPath).copyTo(dstPath); + copyFileTo(srcPath, dstPath); Poco::TemporaryFile::registerForDeletion(dstPath); #endif diff --git a/common/FileUtil.hpp b/common/FileUtil.hpp index a57aa5414..864188308 100644 --- a/common/FileUtil.hpp +++ b/common/FileUtil.hpp @@ -80,6 +80,9 @@ namespace FileUtil removeFile(path.toString(), recursive); } + /// Copy a file from @fromPath to @toPath, throws on failure. + void copyFileTo(const std::string &fromPath, const std::string &toPath); + /// Make a temp copy of a file, and prepend it with a prefix. std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename, const std::string& dstFilenamePrefix); diff --git a/test/run_unit.sh.in b/test/run_unit.sh.in index d05e2f48f..5fb8a6936 100755 --- a/test/run_unit.sh.in +++ b/test/run_unit.sh.in @@ -56,16 +56,6 @@ echo " $cmd_line" # drop .la suffix tst=`echo $tst | sed "s/\.la//"`; -if test "z$tst" != "z" && test "z$CPPUNIT_TEST_NAME" != "z"; then - # $tst is not empty, but $CPPUNIT_TEST_NAME is set, exit early if they - # don't match. - if test "z$tst" != "z$CPPUNIT_TEST_NAME"; then - touch $tst_log - echo ":test-result: SKIP $tst (disabled by CPPUNIT_TEST_NAME)" > $test_output - exit 0; - fi -fi - export LOOL_LOGLEVEL=trace if test "z$enable_debug" != "ztrue"; then diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp index 0be7c7c7b..8c8a8ddd8 100644 --- a/wsd/Storage.cpp +++ b/wsd/Storage.cpp @@ -331,8 +331,7 @@ std::string LocalStorage::loadStorageFileToLocal(const Authorization& /*auth*/, // Fallback to copying. if (!Poco::File(getRootFilePath()).exists()) { - LOG_INF("Copying " << LOOLWSD::anonymizeUrl(publicFilePath) << " to " << getRootFilePathAnonym()); - Poco::File(publicFilePath).copyTo(getRootFilePath()); + FileUtil::copyFileTo(publicFilePath, getRootFilePath()); _isCopy = true; } } @@ -371,10 +370,7 @@ StorageBase::SaveResult LocalStorage::saveLocalFileToStorage(const Authorization LOG_TRC("Saving local file to local file storage (isCopy: " << _isCopy << ") for " << getRootFilePathAnonym()); // Copy the file back. if (_isCopy && Poco::File(getRootFilePath()).exists()) - { - LOG_INF("Copying " << getRootFilePathAnonym() << " to " << LOOLWSD::anonymizeUrl(getUri().getPath())); - Poco::File(getRootFilePath()).copyTo(getUri().getPath()); - } + FileUtil::copyFileTo(getRootFilePath(), getUri().getPath()); // update its fileinfo object. This is used later to check if someone else changed the // document while we are/were editing it diff --git a/wsd/TraceFile.hpp b/wsd/TraceFile.hpp index 82f5a75ce..e95fbb2e2 100644 --- a/wsd/TraceFile.hpp +++ b/wsd/TraceFile.hpp @@ -25,6 +25,7 @@ #include "Protocol.hpp" #include "Log.hpp" #include "Util.hpp" +#include "FileUtil.hpp" /// Dumps commands and notification trace. class TraceFileRecord @@ -141,8 +142,7 @@ public: filename += '.' + origPath.getExtension(); snapshot = Poco::Path(_path, filename).toString(); - LOG_TRC("TraceFile: Copying local file [" << localPath << "] to snapshot [" << snapshot << "]."); - Poco::File(localPath).copyTo(snapshot); + FileUtil::copyFileTo(localPath, snapshot); snapshot = Poco::URI(Poco::URI("file://"), snapshot).toString(); LOG_TRC("TraceFile: Mapped URL " << url << " to " << snapshot); commit aadf5af77b74822ebdc52e512b0b856957dc0896 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Tue Jan 21 11:55:32 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue Jan 21 14:39:21 2020 +0100 reduce verbosity of FileServer trace logging. Change-Id: I5a57e91742be504bcb2e51b45f6890420e52bb91 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/87134 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> diff --git a/wsd/FileServer.cpp b/wsd/FileServer.cpp index 95bd54f90..55942611e 100644 --- a/wsd/FileServer.cpp +++ b/wsd/FileServer.cpp @@ -474,12 +474,14 @@ void FileServerRequestHandler::readDirToHash(const std::string &basePath, const struct stat fileStat; DIR *workingdir; - LOG_TRC("Pre-reading directory: " << basePath << path); workingdir = opendir((basePath + path).c_str()); if (!workingdir) return; + size_t fileCount = 0; + std::string filesRead; + while ((currentFile = readdir(workingdir)) != nullptr) { if (currentFile->d_name[0] == '.') @@ -493,7 +495,9 @@ void FileServerRequestHandler::readDirToHash(const std::string &basePath, const else if (S_ISREG(fileStat.st_mode)) { - LOG_TRC("Reading file: '" << basePath << relPath << " as '" << relPath << "'"); + fileCount++; + filesRead.append(currentFile->d_name); + filesRead.append(" "); std::ifstream file(basePath + relPath, std::ios::binary); @@ -539,6 +543,9 @@ void FileServerRequestHandler::readDirToHash(const std::string &basePath, const } } closedir(workingdir); + + if (fileCount > 0) + LOG_TRC("Pre-read " << fileCount << " file(s) from directory: " << basePath << path << ": " << filesRead); } void FileServerRequestHandler::initialize() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits