From 3a525514bbe3b09cd36ff2185beb2508180a5cc4 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 2 Sep 2025 12:40:57 +0200 Subject: [PATCH 01/19] add ability to write log lines via the HTTP API --- arangod/RestHandler/RestAdminLogHandler.cpp | 67 +++++++++++++++++++ arangod/RestHandler/RestAdminLogHandler.h | 1 + js/client/modules/@arangodb/test-helper.js | 9 +++ .../wal-archive-size-limit.inc | 65 ++++++++---------- 4 files changed, 106 insertions(+), 36 deletions(-) diff --git a/arangod/RestHandler/RestAdminLogHandler.cpp b/arangod/RestHandler/RestAdminLogHandler.cpp index e4f15115d105..d30aeaeaa6fb 100644 --- a/arangod/RestHandler/RestAdminLogHandler.cpp +++ b/arangod/RestHandler/RestAdminLogHandler.cpp @@ -35,6 +35,8 @@ #include "Logger/Logger.h" #include "Logger/LoggerFeature.h" #include "Logger/LogTopic.h" +#include "Logger/LogLevel.h" +#include "Logger/LogMacros.h" #include "Network/Methods.h" #include "Network/NetworkFeature.h" #include "Network/Utils.h" @@ -143,6 +145,8 @@ auto RestAdminLogHandler::executeAsync() -> futures::Future { "where suffix can be either 'level' or 'structured'"); } } + } else if (type == rest::RequestType::POST && suffixes.size() == 0) { + co_await handleLogWrite(); } else { generateError(rest::ResponseCode::METHOD_NOT_ALLOWED, TRI_ERROR_HTTP_METHOD_NOT_ALLOWED); @@ -590,6 +594,69 @@ auto RestAdminLogHandler::handleLogLevel() -> async { } } +auto RestAdminLogHandler::handleLogWrite() -> async { + bool parseSuccess = false; + VPackSlice slice = this->parseVPackBody(parseSuccess); + if (!parseSuccess) { + co_return; + } + parseSuccess = false; + if (slice.isArray()) { + for (VPackSlice logLine : VPackArrayIterator(slice)) { + auto logId = logLine.get("ID").stringView(); + auto logTopic = logLine.get("topic").stringView(); + std::string prefix; + if (logTopic.compare("fatal") == 0) { + prefix = "FATAL! "; + } else if (logTopic.compare("error") != 0 && + logTopic.compare("warning") != 0 && + logTopic.compare("warn") != 0 && + logTopic.compare("info") != 0 && + logTopic.compare("debug") != 0 && + logTopic.compare("trace") != 0) { + // invalid log level + prefix = logTopic; + prefix += "!"; + } + auto logLevel = logLine.get("level").stringView(); + auto logMessage = logLine.get("message").stringView(); + LogTopic const* topicPtr = logTopic.empty() ? nullptr : LogTopic::lookup(logTopic); + LogTopic const& topic = (topicPtr != nullptr) ? *topicPtr : Logger::FIXME; + + + + auto logMessageS = [&](auto const& message, auto const &logId) { + if (logLevel.compare("fatal") == 0) { + LOG_TOPIC(logId, FATAL, topic) << prefix << message; + } else if (logLevel.compare("error") == 0) { + LOG_TOPIC(logId, ERR, topic) << prefix << message; + } else if (logLevel.compare("warning") == 0 || logLevel.compare("warn") == 0) { + LOG_TOPIC(logId, WARN, topic) << prefix << message; + } else if (logLevel.compare("info") == 0) { + LOG_TOPIC(logId, INFO, topic) << prefix << message; + } else if (logLevel.compare("debug") == 0) { + LOG_TOPIC(logId, DEBUG, topic) << prefix << message; + } else if (logLevel.compare("trace") == 0) { + LOG_TOPIC(logId, TRACE, topic) << prefix << message; + } else { + LOG_TOPIC(logId, WARN, topic) << prefix << message; + } + }; + logMessageS(logMessage, logId); + + } + parseSuccess = true; + } + if (!parseSuccess) { + generateError(rest::ResponseCode::BAD, TRI_ERROR_HTTP_BAD_PARAMETER); + } else { + velocypack::Builder body; + + generateResult(rest::ResponseCode::ACCEPTED, body.slice()); + } + co_return; +} + void RestAdminLogHandler::handleLogStructuredParams() { auto const type = _request->requestType(); diff --git a/arangod/RestHandler/RestAdminLogHandler.h b/arangod/RestHandler/RestAdminLogHandler.h index f8bbaf2c6b0a..546e7d43920f 100644 --- a/arangod/RestHandler/RestAdminLogHandler.h +++ b/arangod/RestHandler/RestAdminLogHandler.h @@ -46,6 +46,7 @@ class RestAdminLogHandler : public RestBaseHandler { void clearLogs(); auto reportLogs(bool newFormat) -> async; auto handleLogLevel() -> async; + auto handleLogWrite() -> async; void handleLogStructuredParams(); }; } // namespace arangodb diff --git a/js/client/modules/@arangodb/test-helper.js b/js/client/modules/@arangodb/test-helper.js index 338ec0d87428..65171babbfdc 100644 --- a/js/client/modules/@arangodb/test-helper.js +++ b/js/client/modules/@arangodb/test-helper.js @@ -879,6 +879,15 @@ exports.insertManyDocumentsIntoCollection } }; +exports.logServer = function (level, ID, topic, message) { + return arango.POST_RAW('/_admin/log/', [{ + level, + ID, + topic, + message + }]); +}; + exports.executeExternalAndWaitWithSanitizer = function (executable, args, tmpFileName, options = global.instanceManager.options) { let sanHnd = new sanHandler(executable, options); let tmpMgr = new tmpDirMngr(fs.join(tmpFileName), options); diff --git a/tests/js/client/server_parameters/wal-archive-size-limit.inc b/tests/js/client/server_parameters/wal-archive-size-limit.inc index acdd3602bdae..dc8771a28bc3 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit.inc +++ b/tests/js/client/server_parameters/wal-archive-size-limit.inc @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ +/* global GLOBAL, getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -27,6 +27,11 @@ const fs = require('fs'); const jsunity = require('jsunity'); +const { + logServer, + insertManyDocumentsIntoCollection +} = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function WalArchiveSizeLimitSuite() { 'use strict'; @@ -56,13 +61,8 @@ function WalArchiveSizeLimitSuite() { }, }; } - -exports.WalArchiveSizeLimitSuite = WalArchiveSizeLimitSuite; -exports.sendLargeServerOperation = (maxWaitTime) => { - const body = ` -let fs = require('fs'); -let getLogLines = (logfile) => { - let content = fs.readFileSync(logfile, 'ascii'); +let getLogLines = function() { + let content = fs.readFileSync(IM.arangods[0].logFile, 'ascii'); let lines = content.split('\\n'); return lines.filter((line) => { @@ -70,35 +70,28 @@ let getLogLines = (logfile) => { return line.match(/(testmann: |d9793)/); }); }; - -let logfiles = require('internal').options()["log.output"]; -const logfile = logfiles[logfiles.length - 1].replace(/^file:\\/\\//, ''); -require('console').log("testmann: start"); -let docs = []; -for (let i = 0; i < 2000; ++i) { - docs.push({ value1: "test" + i, payload: Array(512).join("x") }); -} -let db = require("internal").db; -let time = require("internal").time; -let i = 0; -let start = time(); -do { - db.UnitTestsCollection.insert(docs); - if (i++ % 10 === 0) { - let lines = getLogLines(logfile); - if (lines.length >= 2) { - break; - } +exports.WalArchiveSizeLimitSuite = WalArchiveSizeLimitSuite; +exports.sendLargeServerOperation = function(maxWaitTime) { + logServer('info', 'aaaa', 'js', "testmann: start"); + let docs = []; + for (let i = 0; i < 2000; ++i) { + docs.push({ value1: "test" + i, payload: Array(512).join("x") }); } -} while (time() - start < ${maxWaitTime}); + let db = require("internal").db; + let time = require("internal").time; + let i = 0; + let start = time(); + do { + db.UnitTestsCollection.insert(docs); + if (i++ % 10 === 0) { + let lines = getLogLines(); + if (lines.length >= 2) { + break; + } + } + } while (time() - start < maxWaitTime); -require('console').log("testmann: done"); -return getLogLines(logfile); -`; - - // insert larger amounts of data on the server - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", body); - - return res; + logServer('info', 'bbbbb', 'js', "testmann: done"); + return getLogLines(); }; From 0243ead23cba604545cd084c4e9fa36c4e4c1350 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 2 Sep 2025 16:56:44 +0200 Subject: [PATCH 02/19] lint --- arangod/RestHandler/RestAdminLogHandler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arangod/RestHandler/RestAdminLogHandler.cpp b/arangod/RestHandler/RestAdminLogHandler.cpp index d30aeaeaa6fb..ff4938f828a6 100644 --- a/arangod/RestHandler/RestAdminLogHandler.cpp +++ b/arangod/RestHandler/RestAdminLogHandler.cpp @@ -625,12 +625,13 @@ auto RestAdminLogHandler::handleLogWrite() -> async { - auto logMessageS = [&](auto const& message, auto const &logId) { + auto logMessageS = [&](auto const& message, auto const& logId) { if (logLevel.compare("fatal") == 0) { LOG_TOPIC(logId, FATAL, topic) << prefix << message; } else if (logLevel.compare("error") == 0) { LOG_TOPIC(logId, ERR, topic) << prefix << message; - } else if (logLevel.compare("warning") == 0 || logLevel.compare("warn") == 0) { + } else if (logLevel.compare("warning") == 0 || + logLevel.compare("warn") == 0) { LOG_TOPIC(logId, WARN, topic) << prefix << message; } else if (logLevel.compare("info") == 0) { LOG_TOPIC(logId, INFO, topic) << prefix << message; @@ -643,7 +644,6 @@ auto RestAdminLogHandler::handleLogWrite() -> async { } }; logMessageS(logMessage, logId); - } parseSuccess = true; } From 3a2476f906a5c4688c1f7642cfc5d500a0640a73 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 2 Sep 2025 16:57:19 +0200 Subject: [PATCH 03/19] use async requests to quicker load huge chunks of documents into the server --- js/client/modules/@arangodb/test-helper.js | 20 +++++++---- ...wal-archive-size-limit-small-noncluster.js | 2 +- .../wal-archive-size-limit.inc | 34 +++++++++---------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/js/client/modules/@arangodb/test-helper.js b/js/client/modules/@arangodb/test-helper.js index 65171babbfdc..8dd2d21ba929 100644 --- a/js/client/modules/@arangodb/test-helper.js +++ b/js/client/modules/@arangodb/test-helper.js @@ -804,7 +804,7 @@ exports.AQL_EXECUTE = function(query, bindVars, options) { }; exports.insertManyDocumentsIntoCollection - = function(db, coll, maker, limit, batchSize) { + = function(db, coll, maker, limit, batchSize, abortFunc = () => false) { // This function uses the asynchronous API of `arangod` to quickly // insert a lot of documents into a collection. You can control which // documents to insert with the `maker` function. The arguments are: @@ -862,14 +862,20 @@ exports.insertManyDocumentsIntoCollection l = []; } let i = 0; - while (i < jobs.length) { - let r = arango.PUT_RAW(`/_api/job/${jobs[i]}`, {}); - if (r.code === 204) { - i += 1; - } else if (r.code === 202) { - jobs = jobs.slice(0, i).concat(jobs.slice(i+1)); + if (jobs.length > 10) { + while (i < jobs.length) { + let r = arango.PUT_RAW(`/_api/job/${jobs[i]}`, {}); + if (r.code === 204) { + i += 1; + } else if (r.code === 202) { + jobs = jobs.slice(0, i).concat(jobs.slice(i+1)); + } } } + if (abortFunc()) { + print('aborting insert loop by hook'); + return; + } if (done) { if (jobs.length === 0) { break; diff --git a/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js b/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js index bde4baef9f7b..3893b0d9ccef 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js +++ b/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js @@ -45,7 +45,7 @@ function WalArchiveSizeLimitSuiteSmall() { let suite = { testDoesNotForceDeleteWalFiles: function() { - let res = sendLargeServerOperation(300); + let res = sendLargeServerOperation(9600000); // this will fail if warning d9793 was *not* logged let found = false; diff --git a/tests/js/client/server_parameters/wal-archive-size-limit.inc b/tests/js/client/server_parameters/wal-archive-size-limit.inc index dc8771a28bc3..c1af7d5cd1de 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit.inc +++ b/tests/js/client/server_parameters/wal-archive-size-limit.inc @@ -63,7 +63,7 @@ function WalArchiveSizeLimitSuite() { } let getLogLines = function() { let content = fs.readFileSync(IM.arangods[0].logFile, 'ascii'); - let lines = content.split('\\n'); + let lines = content.split('\n'); return lines.filter((line) => { // logId "d9793" from RocksDBEngine.cpp @@ -73,24 +73,22 @@ let getLogLines = function() { exports.WalArchiveSizeLimitSuite = WalArchiveSizeLimitSuite; exports.sendLargeServerOperation = function(maxWaitTime) { - logServer('info', 'aaaa', 'js', "testmann: start"); - let docs = []; - for (let i = 0; i < 2000; ++i) { - docs.push({ value1: "test" + i, payload: Array(512).join("x") }); - } - let db = require("internal").db; + logServer('info', 'aaaaa', 'js', "testmann: start"); let time = require("internal").time; - let i = 0; - let start = time(); - do { - db.UnitTestsCollection.insert(docs); - if (i++ % 10 === 0) { - let lines = getLogLines(); - if (lines.length >= 2) { - break; - } - } - } while (time() - start < maxWaitTime); + let tEnd = time() + maxWaitTime; + let checkCount = 0; + insertManyDocumentsIntoCollection('_system', 'UnitTestsCollection', + (i) => { + return {i, payload: Array(512).join("x")};}, + 1000000, 2000, () => { + let now = time(); + if (now > tEnd) { return true; } + checkCount += 1; + if (checkCount % 20 == 0) { + return (getLogLines().length > 2); + } + return false; + }); logServer('info', 'bbbbb', 'js', "testmann: done"); return getLogLines(); From 42553fbca0ce287f1afac86e11fcf8373fa446a1 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 2 Sep 2025 17:04:13 +0200 Subject: [PATCH 04/19] lint --- tests/js/client/server_parameters/wal-archive-size-limit.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/js/client/server_parameters/wal-archive-size-limit.inc b/tests/js/client/server_parameters/wal-archive-size-limit.inc index c1af7d5cd1de..a2f53ec88b25 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit.inc +++ b/tests/js/client/server_parameters/wal-archive-size-limit.inc @@ -84,7 +84,7 @@ exports.sendLargeServerOperation = function(maxWaitTime) { let now = time(); if (now > tEnd) { return true; } checkCount += 1; - if (checkCount % 20 == 0) { + if (checkCount % 20 === 0) { return (getLogLines().length > 2); } return false; From c85f9a8d203539e3b74d5471f70f826f18f403ec Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 2 Sep 2025 17:10:36 +0200 Subject: [PATCH 05/19] lint --- arangod/RestHandler/RestAdminLogHandler.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/arangod/RestHandler/RestAdminLogHandler.cpp b/arangod/RestHandler/RestAdminLogHandler.cpp index ff4938f828a6..befaeb4e68ab 100644 --- a/arangod/RestHandler/RestAdminLogHandler.cpp +++ b/arangod/RestHandler/RestAdminLogHandler.cpp @@ -620,11 +620,9 @@ auto RestAdminLogHandler::handleLogWrite() -> async { } auto logLevel = logLine.get("level").stringView(); auto logMessage = logLine.get("message").stringView(); - LogTopic const* topicPtr = logTopic.empty() ? nullptr : LogTopic::lookup(logTopic); + LogTopic const* topicPtr = + logTopic.empty() ? nullptr : LogTopic::lookup(logTopic); LogTopic const& topic = (topicPtr != nullptr) ? *topicPtr : Logger::FIXME; - - - auto logMessageS = [&](auto const& message, auto const& logId) { if (logLevel.compare("fatal") == 0) { LOG_TOPIC(logId, FATAL, topic) << prefix << message; From 4f2717163404af45f6855a23808c8fcb48af854a Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 08:02:48 +0200 Subject: [PATCH 06/19] when done, wait for jobs to finish --- js/client/modules/@arangodb/test-helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/client/modules/@arangodb/test-helper.js b/js/client/modules/@arangodb/test-helper.js index 8dd2d21ba929..692b165d6c20 100644 --- a/js/client/modules/@arangodb/test-helper.js +++ b/js/client/modules/@arangodb/test-helper.js @@ -862,7 +862,7 @@ exports.insertManyDocumentsIntoCollection l = []; } let i = 0; - if (jobs.length > 10) { + if (jobs.length > 10 || done) { while (i < jobs.length) { let r = arango.PUT_RAW(`/_api/job/${jobs[i]}`, {}); if (r.code === 204) { From 70fce45afe57b420c9d7d3148f2d8d44999a732c Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 09:04:21 +0200 Subject: [PATCH 07/19] nicer indent, revert timeout change --- ...wal-archive-size-limit-small-noncluster.js | 2 +- .../wal-archive-size-limit.inc | 26 ++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js b/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js index 3893b0d9ccef..bde4baef9f7b 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js +++ b/tests/js/client/server_parameters/wal-archive-size-limit-small-noncluster.js @@ -45,7 +45,7 @@ function WalArchiveSizeLimitSuiteSmall() { let suite = { testDoesNotForceDeleteWalFiles: function() { - let res = sendLargeServerOperation(9600000); + let res = sendLargeServerOperation(300); // this will fail if warning d9793 was *not* logged let found = false; diff --git a/tests/js/client/server_parameters/wal-archive-size-limit.inc b/tests/js/client/server_parameters/wal-archive-size-limit.inc index a2f53ec88b25..f9d4bb9e57d4 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit.inc +++ b/tests/js/client/server_parameters/wal-archive-size-limit.inc @@ -77,18 +77,20 @@ exports.sendLargeServerOperation = function(maxWaitTime) { let time = require("internal").time; let tEnd = time() + maxWaitTime; let checkCount = 0; - insertManyDocumentsIntoCollection('_system', 'UnitTestsCollection', - (i) => { - return {i, payload: Array(512).join("x")};}, - 1000000, 2000, () => { - let now = time(); - if (now > tEnd) { return true; } - checkCount += 1; - if (checkCount % 20 === 0) { - return (getLogLines().length > 2); - } - return false; - }); + insertManyDocumentsIntoCollection( + '_system', 'UnitTestsCollection', + (i) => { + return {i, payload: Array(512).join("x")};}, + 1000000, 2000, + () => { + let now = time(); + if (now > tEnd) { return true; } + checkCount += 1; + if (checkCount % 20 === 0) { + return (getLogLines().length > 2); + } + return false; + }); logServer('info', 'bbbbb', 'js', "testmann: done"); return getLogLines(); From f81b446b6ce462558826acf13e691d9fea44fdc8 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 12:16:15 +0200 Subject: [PATCH 08/19] fix variable reference --- arangod/RestHandler/RestAdminLogHandler.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/arangod/RestHandler/RestAdminLogHandler.cpp b/arangod/RestHandler/RestAdminLogHandler.cpp index befaeb4e68ab..4cd433d05f93 100644 --- a/arangod/RestHandler/RestAdminLogHandler.cpp +++ b/arangod/RestHandler/RestAdminLogHandler.cpp @@ -604,21 +604,21 @@ auto RestAdminLogHandler::handleLogWrite() -> async { if (slice.isArray()) { for (VPackSlice logLine : VPackArrayIterator(slice)) { auto logId = logLine.get("ID").stringView(); - auto logTopic = logLine.get("topic").stringView(); + auto logLevel = logLine.get("level").stringView(); std::string prefix; - if (logTopic.compare("fatal") == 0) { + if (logLevel.compare("fatal") == 0) { prefix = "FATAL! "; - } else if (logTopic.compare("error") != 0 && - logTopic.compare("warning") != 0 && - logTopic.compare("warn") != 0 && - logTopic.compare("info") != 0 && - logTopic.compare("debug") != 0 && - logTopic.compare("trace") != 0) { + } else if (logLevel.compare("error") != 0 && + logLevel.compare("warning") != 0 && + logLevel.compare("warn") != 0 && + logLevel.compare("info") != 0 && + logLevel.compare("debug") != 0 && + logLevel.compare("trace") != 0) { // invalid log level - prefix = logTopic; + prefix = logLevel; prefix += "!"; } - auto logLevel = logLine.get("level").stringView(); + auto logTopic = logLine.get("topic").stringView(); auto logMessage = logLine.get("message").stringView(); LogTopic const* topicPtr = logTopic.empty() ? nullptr : LogTopic::lookup(logTopic); From 9413f1abd944d53d5a8840bc639bccee7cdecadf Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 12:16:50 +0200 Subject: [PATCH 09/19] make API more easy to use with default variables --- js/client/modules/@arangodb/test-helper.js | 2 +- tests/js/client/server_parameters/wal-archive-size-limit.inc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/client/modules/@arangodb/test-helper.js b/js/client/modules/@arangodb/test-helper.js index 692b165d6c20..d5cf44ff4cf1 100644 --- a/js/client/modules/@arangodb/test-helper.js +++ b/js/client/modules/@arangodb/test-helper.js @@ -885,7 +885,7 @@ exports.insertManyDocumentsIntoCollection } }; -exports.logServer = function (level, ID, topic, message) { +exports.logServer = function (message, level='info', ID="aaaaa", topic='general') { return arango.POST_RAW('/_admin/log/', [{ level, ID, diff --git a/tests/js/client/server_parameters/wal-archive-size-limit.inc b/tests/js/client/server_parameters/wal-archive-size-limit.inc index f9d4bb9e57d4..e4a4189ee2e6 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit.inc +++ b/tests/js/client/server_parameters/wal-archive-size-limit.inc @@ -73,7 +73,7 @@ let getLogLines = function() { exports.WalArchiveSizeLimitSuite = WalArchiveSizeLimitSuite; exports.sendLargeServerOperation = function(maxWaitTime) { - logServer('info', 'aaaaa', 'js', "testmann: start"); + logServer("testmann: start"); let time = require("internal").time; let tEnd = time() + maxWaitTime; let checkCount = 0; @@ -92,6 +92,6 @@ exports.sendLargeServerOperation = function(maxWaitTime) { return false; }); - logServer('info', 'bbbbb', 'js', "testmann: done"); + logServer("testmann: done"); return getLogLines(); }; From ffe4617e87beca8e5f217d0ba633ee4eea1a1449 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 12:17:35 +0200 Subject: [PATCH 10/19] convert more tests to use the logging API --- .../log-dropped-messages-noncluster.js | 37 +++++++++++++++---- ...og-escape-control-characters-false-json.js | 31 ++++++---------- .../log-escape-control-characters-false.js | 25 +++++-------- 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/tests/js/client/server_parameters/log-dropped-messages-noncluster.js b/tests/js/client/server_parameters/log-dropped-messages-noncluster.js index 8d812c451474..7210010ca778 100644 --- a/tests/js/client/server_parameters/log-dropped-messages-noncluster.js +++ b/tests/js/client/server_parameters/log-dropped-messages-noncluster.js @@ -28,7 +28,6 @@ if (getOptions === true) { return { 'log.max-queued-entries': '0', - 'javascript.allow-admin-execute': 'true', 'log.force-direct': 'false', 'log.foreground-tty': 'false', }; @@ -52,8 +51,16 @@ function LoggerSuite() { arango.PUT("/_admin/log/level", { general: "info" }); // messages with level "info" will be dropped - let res = arango.POST_RAW("/_admin/execute", "for (let i = 0; i < 100; ++i) { require('console').log('abc'); }"); - assertEqual(200, res.code, res); + let messages = []; + for (let i = 0; i < 100; ++i) { + messages.push({ + level: "info", + ID: "aaaaa", + topic: "general", + message: `abc ${i}` + }); + } + arango.POST_RAW('/_admin/log/', messages); const newValue = getMetric("arangodb_logger_messages_dropped_total"); assertTrue(newValue >= oldValue + 100, {oldValue, newValue}); @@ -72,8 +79,16 @@ function LoggerSuite() { arango.PUT("/_admin/log/level", { general: "warn" }); // messages with level "warn" will not be dropped - let res = arango.POST_RAW("/_admin/execute", "for (let i = 0; i < 100; ++i) { require('console').warn('abc'); }"); - assertEqual(200, res.code, res); + let messages = []; + for (let i = 0; i < 100; ++i) { + messages.push({ + level: "warn", + ID: "bbbbb", + topic: "general", + message: `abc ${i}` + }); + } + arango.POST_RAW('/_admin/log/', messages); const newValue = getMetric("arangodb_logger_messages_dropped_total"); // allow for up to 20 unrelated log messages (from other server @@ -89,8 +104,16 @@ function LoggerSuite() { const oldValue = getMetric("arangodb_logger_messages_dropped_total"); // messages with level "error" will not be dropped - let res = arango.POST_RAW("/_admin/execute", "for (let i = 0; i < 100; ++i) { require('console').error('abc'); }"); - assertEqual(200, res.code, res); + let messages = []; + for (let i = 0; i < 100; ++i) { + messages.push({ + level: "error", + ID: "ccccc", + topic: "general", + message: `abc ${i}` + }); + } + arango.POST_RAW('/_admin/log/', messages); const newValue = getMetric("arangodb_logger_messages_dropped_total"); // allow for up to 20 unrelated log messages (from other server diff --git a/tests/js/client/server_parameters/log-escape-control-characters-false-json.js b/tests/js/client/server_parameters/log-escape-control-characters-false-json.js index 1f3196208918..8312fd65c163 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-false-json.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-false-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,6 +25,8 @@ // ////////////////////////////////////////////////////////////////////////////// const fs = require('fs'); +const IM = GLOBAL.instanceManager; +const { logServer } = require('@arangodb/test-helper'); if (getOptions === true) { return { @@ -50,27 +52,18 @@ function EscapeControlFalseSuite() { return { testEscapeControlFalse: function() { const controlCharsLength = 31; - const request = `require('console').log("testmann: start"); - for (let i = 1; i <= 31; ++i) { - let controlChar = '"\\\\u' + i.toString(16).padStart(4, '0') + '"'; - controlChar = JSON.parse(controlChar); - require('console').log("testmann: testi \\u0008\\u0009\\u000A\\u000B\\u000C" + controlChar + " \\u00B0\\ud83e\\uddd9\\uf0f9\\u9095\\uf0f9\\u90b6abc123"); - } - require('console').log("testmann: done"); - return require('internal').options()["log.output"];`; - - const res = arango.POST("/_admin/execute", request); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - + logServer("testmann: start"); + for (let i = 1; i <= 31; ++i) { + let controlChar = '"\\u' + i.toString(16).padStart(4, '0') + '"'; + controlChar = JSON.parse(controlChar); + logServer("testmann: testi \u0008\u0009\u000A\u000B\u000C" + controlChar + "\u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); + } + logServer("testmann: done", "error"); // error flushes // log is buffered, so give it a few tries until the log messages appear let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'utf-8'); + let content = fs.readFileSync(IM.arangods[0].logFile, 'utf-8'); let lines = content.split('\n'); filtered = lines.filter((line) => { @@ -89,7 +82,7 @@ function EscapeControlFalseSuite() { for (let i = 1; i < controlCharsLength + 1; ++i) { const parsedRes = JSON.parse(filtered[i]); assertTrue(parsedRes.hasOwnProperty("message")); - assertEqual(parsedRes.message, "testmann: testi \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); + assertEqual(parsedRes.message, "testmann: testi \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); } assertMatch(/testmann: done/, filtered[controlCharsLength + 1]); }, diff --git a/tests/js/client/server_parameters/log-escape-control-characters-false.js b/tests/js/client/server_parameters/log-escape-control-characters-false.js index 04dc7aa7d8ec..0fa926910dde 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-false.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-false.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,7 +25,8 @@ // ////////////////////////////////////////////////////////////////////////////// const fs = require('fs'); - +const IM = GLOBAL.instanceManager; +const { logServer } = require('@arangodb/test-helper'); if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -48,25 +49,17 @@ function EscapeControlFalseSuite() { return { testEscapeControlFalse: function() { const escapeCharsLength = 31; - const res = arango.POST("/_admin/execute", ` - require('console').log("testmann: start"); - for (let i = 1; i <= 31; ++i) { - require('console').log("testmann: testi" + String.fromCharCode(i) + " abc123"); - } - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + logServer("testmann: start"); + for (let i = 1; i <= 31; ++i) { + logServer("testmann: testi" + String.fromCharCode(i) + " abc123"); + } + logServer("testmann: done", "error"); // error flushes // log is buffered, so give it a few tries until the log messages appear let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); + let content = fs.readFileSync(IM.arangods[0].logFile, 'ascii'); let lines = content.split('\n'); filtered = lines.filter((line) => { From adeeba739ad2a7bc44c76d058f061f20ba386e14 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 14:53:13 +0200 Subject: [PATCH 11/19] convert more tests to use the logging API --- ...og-escape-control-characters-false-json.js | 74 ++++----- ...log-escape-control-characters-true-json.js | 28 ++-- .../log-escape-control-characters-true.js | 96 ++++++------ ...og-escape-unicode-characters-false-json.js | 82 +++++----- .../log-escape-unicode-characters-false.js | 79 +++++----- ...log-escape-unicode-characters-true-json.js | 68 ++++---- .../log-escape-unicode-characters-true.js | 81 +++++----- .../log-json-format-all-options.js | 148 +++++++++--------- .../log-json-format-info-cluster.js | 43 +++-- 9 files changed, 334 insertions(+), 365 deletions(-) diff --git a/tests/js/client/server_parameters/log-escape-control-characters-false-json.js b/tests/js/client/server_parameters/log-escape-control-characters-false-json.js index 8312fd65c163..fa96a02386cd 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-false-json.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-false-json.js @@ -24,10 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); -const IM = GLOBAL.instanceManager; -const { logServer } = require('@arangodb/test-helper'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -35,7 +31,6 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-unicode-chars': 'false', @@ -44,47 +39,56 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function EscapeControlFalseSuite() { 'use strict'; return { testEscapeControlFalse: function() { - const controlCharsLength = 31; - logServer("testmann: start"); - for (let i = 1; i <= 31; ++i) { - let controlChar = '"\\u' + i.toString(16).padStart(4, '0') + '"'; - controlChar = JSON.parse(controlChar); - logServer("testmann: testi \u0008\u0009\u000A\u000B\u000C" + controlChar + "\u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); - } - logServer("testmann: done", "error"); // error flushes - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(IM.arangods[0].logFile, 'utf-8'); - let lines = content.split('\n'); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + const controlCharsLength = 31; + logServer("testmann: start"); + for (let i = 1; i <= 31; ++i) { + let controlChar = '"\\u' + i.toString(16).padStart(4, '0') + '"'; + controlChar = JSON.parse(controlChar); + logServer("testmann: testi \u0008\u0009\u000A\u000B\u000C" + controlChar + "\u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); + } + logServer("testmann: done", "error"); // error flushes + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'utf-8'); + let lines = content.split('\n'); - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); - if (filtered.length === controlCharsLength + 2) { - break; - } + if (filtered.length === controlCharsLength + 2) { + break; + } - require("internal").sleep(0.5); - } + require("internal").sleep(0.5); + } - assertEqual(controlCharsLength + 2, filtered.length); - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < controlCharsLength + 1; ++i) { - const parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("message")); - assertEqual(parsedRes.message, "testmann: testi \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); - } - assertMatch(/testmann: done/, filtered[controlCharsLength + 1]); + assertEqual(controlCharsLength + 2, filtered.length); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < controlCharsLength + 1; ++i) { + const parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("message")); + assertEqual(parsedRes.message, "testmann: testi \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); + } + assertMatch(/testmann: done/, filtered[controlCharsLength + 1]); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-escape-control-characters-true-json.js b/tests/js/client/server_parameters/log-escape-control-characters-true-json.js index 4a7b27835508..bc45e9d43731 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-true-json.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-true-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,6 +25,8 @@ // ////////////////////////////////////////////////////////////////////////////// const fs = require('fs'); +const IM = GLOBAL.instanceManager; +const { logServer } = require('@arangodb/test-helper'); if (getOptions === true) { return { @@ -50,27 +52,19 @@ function EscapeControlTrueSuite() { return { testEscapeControlTrue: function() { const controlCharsLength = 31; - const request = `require('console').log("testmann: start"); - for (let i = 1; i <= 31; ++i) { - let controlChar = '"\\\\u' + i.toString(16).padStart(4, '0') + '"'; - controlChar = JSON.parse(controlChar); - require('console').log("/\\"\\\\testmann: testi " + controlChar + " \\u00B0\\ud83e\\uddd9\\uf0f9\\u9095\\uf0f9\\u90b6abc123"); + logServer("testmann: start"); + for (let i = 1; i <= 31; ++i) { + let controlChar = '"\\u' + i.toString(16).padStart(4, '0') + '"'; + controlChar = JSON.parse(controlChar); + logServer("/\"\\testmann: testi " + controlChar + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); } - require('console').log("testmann: done"); - return require('internal').options()["log.output"];`; - - const res = arango.POST("/_admin/execute", request); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + logServer("testmann: done", "error"); // write an error message to flush // log is buffered, so give it a few tries until the log messages appear let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'utf-8'); + let content = fs.readFileSync(IM.arangods[0].logFile, 'utf-8'); let lines = content.split('\n'); filtered = lines.filter((line) => { @@ -100,4 +94,4 @@ function EscapeControlTrueSuite() { jsunity.run(EscapeControlTrueSuite); -return jsunity.done(); \ No newline at end of file +return jsunity.done(); diff --git a/tests/js/client/server_parameters/log-escape-control-characters-true.js b/tests/js/client/server_parameters/log-escape-control-characters-true.js index e1e4cf6a135d..9f9114f35736 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-true.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-true.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,8 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -33,75 +31,73 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-control-chars': 'true', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function EscapeControlTrueSuite() { 'use strict'; return { testEscapeControlTrue: function() { - const visibleCharCodes = ['\x0a', '\x0d', '\x09', '\x08', '\x0C']; - const visibleChars = ['\\n', '\\r', '\\t', '\\b', '\\f']; - const escapeCharsLength = 31; - const res = arango.POST("/_admin/execute", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + const visibleCharCodes = ['\x0a', '\x0d', '\x09', '\x08', '\x0C']; + const visibleChars = ['\\n', '\\r', '\\t', '\\b', '\\f']; + const escapeCharsLength = 31; + logServer("testmann: start"); for (let i = 1; i <= 31; ++i) { - require('console').log("testmann: testi" + String.fromCharCode(i) + " abc123"); + logServer("testmann: testi" + String.fromCharCode(i) + " abc123"); } - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); + logServer("testmann: done"); - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); + if (filtered.length === escapeCharsLength + 2) { + break; + } - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === escapeCharsLength + 2) { - break; + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - assertEqual(escapeCharsLength + 2, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < escapeCharsLength + 1; ++i) { - const msg = filtered[i]; - - const foundIdx = visibleCharCodes.indexOf(String.fromCharCode(i)); - if (foundIdx !== -1) { - const matchMsg = "testmann: testi" + visibleChars[foundIdx] + " abc123"; - assertTrue(msg.endsWith(matchMsg)); - } else { - const padding = i < 16 ? 0 : ""; - const charCode = "\\x" + padding + i.toString(16).toUpperCase(); - const matchMsg = "testmann: testi" + charCode + " abc123"; - assertTrue(msg.endsWith(matchMsg)); + assertEqual(escapeCharsLength + 2, filtered.length); + + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < escapeCharsLength + 1; ++i) { + const msg = filtered[i]; + + const foundIdx = visibleCharCodes.indexOf(String.fromCharCode(i)); + if (foundIdx !== -1) { + const matchMsg = "testmann: testi" + visibleChars[foundIdx] + " abc123"; + assertTrue(msg.endsWith(matchMsg)); + } else { + const padding = i < 16 ? 0 : ""; + const charCode = "\\x" + padding + i.toString(16).toUpperCase(); + const matchMsg = "testmann: testi" + charCode + " abc123"; + assertTrue(msg.endsWith(matchMsg)); + } } - } - assertMatch(/testmann: done/, filtered[escapeCharsLength + 1]); - + assertMatch(/testmann: done/, filtered[escapeCharsLength + 1]); + }); + IM.reconnectMe(); }, - }; } diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js b/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js index 6be948d66f8f..ef1f690ae1f5 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* GLOBAL, global getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,8 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -33,7 +31,6 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-unicode-chars': 'false', @@ -42,58 +39,55 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function EscapeUnicodeFalseSuite() { 'use strict'; return { testEscapeUnicodeFalse: function() { - const testValues = ["°", "mötör", "maçã", "犬"]; - - const request = `require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); const testValues = ["°", "mötör", "maçã", "犬"]; - testValues.forEach(testValue => { - require('console').log("testmann: testi \\u0008\\u0009\\u000A\\u000B\\u000C" + testValue + " \\u00B0\\ud83e\\uddd9\\uf0f9\\u9095\\uf0f9\\u90b6abc123"); - }); - require('console').log("testmann: done"); - return require('internal').options()["log.output"];`; - - const res = arango.POST("/_admin/execute", request); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'utf-8'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); + logServer("testmann: start"); + testValues.forEach(testValue => { + logServer("testmann: testi \u0008\u0009\u000A\u000B\u000C" + testValue + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); }); - - if (filtered.length === testValues.length + 2) { - break; + logServer("testmann: done", "error"); // flush + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'utf-8'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === testValues.length + 2) { + break; + } + + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - - assertEqual(testValues.length + 2, filtered.length); - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < testValues.length + 1; ++i) { - const parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("message")); - assertEqual(parsedRes.message, "testmann: testi " + testValues[i - 1] + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); - } - assertMatch(/testmann: done/, filtered[testValues.length + 1]); + assertEqual(testValues.length + 2, filtered.length); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < testValues.length + 1; ++i) { + const parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("message")); + assertEqual(parsedRes.message, "testmann: testi " + testValues[i - 1] + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); + } + assertMatch(/testmann: done/, filtered[testValues.length + 1]); + }); + IM.reconnectMe(); }, - }; } diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-false.js b/tests/js/client/server_parameters/log-escape-unicode-characters-false.js index 7736c9a0bca1..3250884d4ae7 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-false.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-false.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,8 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -33,13 +31,15 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-unicode-chars': 'false', }; } +const fs = require('fs'); +const IM = GLOBAL.instanceManager; +const { logServer } = require('@arangodb/test-helper'); const jsunity = require('jsunity'); function EscapeUnicodeFalseSuite() { @@ -48,49 +48,44 @@ function EscapeUnicodeFalseSuite() { return { testEscapeUnicodeFalse: function() { - const testValues = ["°", "mötör", "maçã", "犬"]; - - const res = arango.POST("/_admin/execute", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); const testValues = ["°", "mötör", "maçã", "犬"]; - testValues.forEach(testValue => { - require('console').log("testmann: testi " + testValue + " abc123"); - }); - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'utf-8'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); + logServer("testmann: start"); + testValues.forEach(testValue => { + logServer("testmann: testi " + testValue + " abc123"); }); - - if (filtered.length === testValues.length + 2) { - break; + logServer("testmann: done", "error"); // flush log + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'utf-8'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === testValues.length + 2) { + break; + } + + require("internal").sleep(0.5); } + assertEqual(testValues.length + 2, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(testValues.length + 2, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < testValues.length + 1; ++i) { - const msg = filtered[i]; - assertTrue(msg.endsWith("testmann: testi " + testValues[i - 1] + " abc123")); - } - assertMatch(/testmann: done/, filtered[testValues.length + 1]); - + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < testValues.length + 1; ++i) { + const msg = filtered[i]; + assertTrue(msg.endsWith("testmann: testi " + testValues[i - 1] + " abc123")); + } + assertMatch(/testmann: done/, filtered[testValues.length + 1]); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js b/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js index 8e7e086b1663..2504f1998d5c 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js @@ -49,50 +49,48 @@ function EscapeUnicodeTrueSuite() { return { testEscapeUnicodeTrue: function() { - const testValuesLength = 4; - const expectedValues = ['\\u00B0', 'm\\u00F6t\\u00F6r', 'ma\\u00E7\\u00E3', '\\u72AC']; - - const res = arango.POST("/_admin/execute", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + const testValuesLength = 4; + const expectedValues = ['\\u00B0', 'm\\u00F6t\\u00F6r', 'ma\\u00E7\\u00E3', '\\u72AC']; + + logServer("testmann: start"); const testValues = ["°", "mötör", "maçã", "犬"]; testValues.forEach(testValue => { - require('console').log("testmann: testi " + testValue + " abc123"); + logServer("testmann: testi " + testValue + " abc123"); }); - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); + logServer("testmann: done", "error"); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logfile, 'utf-8'); + let lines = content.split('\n'); - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'utf-8'); - let lines = content.split('\n'); + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); + if (filtered.length === testValuesLength + 2) { + break; + } - if (filtered.length === testValuesLength + 2) { - break; + require("internal").sleep(0.5); } + assertEqual(testValuesLength + 2, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(testValuesLength + 2, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < testValuesLength + 1; ++i) { - const msg = JSON.parse(filtered[i]); - assertTrue(msg.hasOwnProperty("message")); - assertTrue(msg.message, "testmann: testi " + expectedValues[i - 1] + " abc123"); - } - assertMatch(/testmann: done/, filtered[testValuesLength + 1]); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < testValuesLength + 1; ++i) { + const msg = JSON.parse(filtered[i]); + assertTrue(msg.hasOwnProperty("message")); + assertTrue(msg.message, "testmann: testi " + expectedValues[i - 1] + " abc123"); + } + assertMatch(/testmann: done/, filtered[testValuesLength + 1]); + }); + IM.reconnectMe(); }, }; } diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-true.js b/tests/js/client/server_parameters/log-escape-unicode-characters-true.js index 17867605f973..df41bd284a56 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-true.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-true.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,8 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -33,63 +31,62 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-unicode-chars': 'true', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function EscapeUnicodeTrueSuite() { 'use strict'; return { testEscapeUnicodeTrue: function() { - const testValuesLength = 4; - const expectedValues = ['\\u00B0', 'm\\u00F6t\\u00F6r', 'ma\\u00E7\\u00E3', '\\u72AC']; - - const res = arango.POST("/_admin/execute", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + const testValuesLength = 4; + const expectedValues = ['\\u00B0', 'm\\u00F6t\\u00F6r', 'ma\\u00E7\\u00E3', '\\u72AC']; + + logServer("testmann: start"); const testValues = ["°", "mötör", "maçã", "犬"]; testValues.forEach(testValue => { - require('console').log("testmann: testi " + testValue + " abc123"); - }); - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'utf-8'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); + logServer("testmann: testi " + testValue + " abc123"); }); - - if (filtered.length === testValuesLength + 2) { - break; + logServer("testmann: done", "error"); // flush + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'utf-8'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === testValuesLength + 2) { + break; + } + + require("internal").sleep(0.5); } + assertEqual(testValuesLength + 2, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(testValuesLength + 2, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < testValuesLength + 1; ++i) { - const msg = filtered[i]; - assertTrue(msg.endsWith("testmann: testi " + expectedValues[i - 1] + " abc123")); - } - assertMatch(/testmann: done/, filtered[testValuesLength + 1]); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < testValuesLength + 1; ++i) { + const msg = filtered[i]; + assertTrue(msg.endsWith("testmann: testi " + expectedValues[i - 1] + " abc123")); + } + assertMatch(/testmann: done/, filtered[testValuesLength + 1]); + }); + IM.reconnectMe(); }, diff --git a/tests/js/client/server_parameters/log-json-format-all-options.js b/tests/js/client/server_parameters/log-json-format-all-options.js index e77710db8d1a..4a14e7be9df3 100644 --- a/tests/js/client/server_parameters/log-json-format-all-options.js +++ b/tests/js/client/server_parameters/log-json-format-all-options.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertMatch, assertEqual */ +/* global GLOBAL, getOptions, assertTrue, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,12 +24,9 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.prefix': 'PREFIX', 'log.thread': 'true', @@ -44,7 +41,10 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -52,82 +52,78 @@ function LoggerSuite() { return { testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); + logServer("testmann: testi" + i); } - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < 51; ++i) { - assertMatch(/testmann: testi\d+/, filtered[i]); - let parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("prefix"), parsedRes); - assertEqual(parsedRes.prefix, "PREFIX"); - assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); - assertMatch(/\d+/, parsedRes.pid); - - assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("hostname"), parsedRes); - assertEqual(parsedRes.hostname, "HOSTNAME"); - assertTrue(parsedRes.hasOwnProperty("role"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("tid"), parsedRes); - assertMatch(/\d+/, parsedRes.tid); - assertTrue(parsedRes.hasOwnProperty("thread")); - assertTrue(parsedRes.hasOwnProperty("line")); - assertMatch(/\d+/, parsedRes.line); - assertMatch(/^[a-f0-9]{5}$/, parsedRes.id, parsedRes); - assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); - assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); - } - assertMatch(/testmann: done/, filtered[51]); - - res = arango.GET("/_admin/log?returnBodyAsJSON=true"); - assertTrue(res.hasOwnProperty("totalAmount")); - assertTrue(res.hasOwnProperty("lid")); - assertTrue(res.hasOwnProperty("topic")); - assertTrue(res.hasOwnProperty("level")); - assertTrue(res.hasOwnProperty("timestamp")); - assertTrue(res.hasOwnProperty("text")); - - for (let i = 0; i < res.totalAmount; ++i) { - assertMatch(/^\d+$/, res.lid[i]); - assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); - assertMatch(/^\d+$/, res.level[i]); - assertMatch(/^\d+$/, res.timestamp[i]); - } + assertEqual(52, filtered.length); + + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < 51; ++i) { + assertMatch(/testmann: testi\d+/, filtered[i]); + let parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("prefix"), parsedRes); + assertEqual(parsedRes.prefix, "PREFIX"); + assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); + assertMatch(/\d+/, parsedRes.pid); + + assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("hostname"), parsedRes); + assertEqual(parsedRes.hostname, "HOSTNAME"); + assertTrue(parsedRes.hasOwnProperty("role"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("tid"), parsedRes); + assertMatch(/\d+/, parsedRes.tid); + assertTrue(parsedRes.hasOwnProperty("thread")); + assertTrue(parsedRes.hasOwnProperty("line")); + assertMatch(/\d+/, parsedRes.line); + assertMatch(/^[a-f0-9]{5}$/, parsedRes.id, parsedRes); + assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); + assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); + } + assertMatch(/testmann: done/, filtered[51]); + + res = arango.GET("/_admin/log?returnBodyAsJSON=true"); + assertTrue(res.hasOwnProperty("totalAmount")); + assertTrue(res.hasOwnProperty("lid")); + assertTrue(res.hasOwnProperty("topic")); + assertTrue(res.hasOwnProperty("level")); + assertTrue(res.hasOwnProperty("timestamp")); + assertTrue(res.hasOwnProperty("text")); + + for (let i = 0; i < res.totalAmount; ++i) { + assertMatch(/^\d+$/, res.lid[i]); + assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); + assertMatch(/^\d+$/, res.level[i]); + assertMatch(/^\d+$/, res.timestamp[i]); + } + }); + IM.reconnectMe(); }, - }; } diff --git a/tests/js/client/server_parameters/log-json-format-info-cluster.js b/tests/js/client/server_parameters/log-json-format-info-cluster.js index 81da47ef18d6..e6e6f6a5543e 100644 --- a/tests/js/client/server_parameters/log-json-format-info-cluster.js +++ b/tests/js/client/server_parameters/log-json-format-info-cluster.js @@ -24,17 +24,9 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); -const db = require('internal').db; -const getCoordinatorEndpoints = require('@arangodb/test-helper').getCoordinatorEndpoints; -const cn = "testCollection"; -const dbName = "maçã"; -const originalEndpoint = arango.getEndpoint(); - if (getOptions === true) { return { 'log.use-json-format': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.prefix': 'PREFIX', 'log.thread': 'true', 'log.thread-name': 'true', @@ -52,7 +44,14 @@ if (getOptions === true) { } +const fs = require('fs'); +const db = require('internal').db; const jsunity = require('jsunity'); +const inst = require('@arangodb/testutils/instance'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; +const cn = "testCollection"; +const dbName = "maçã"; function LoggerSuite() { 'use strict'; @@ -60,6 +59,7 @@ function LoggerSuite() { return { setUp: function() { + IM.rememberConnection(); db._useDatabase("_system"); db._createDatabase(dbName); db._useDatabase(dbName); @@ -69,34 +69,29 @@ function LoggerSuite() { }, tearDown: function() { + IM.reconnectMe(); db._useDatabase("_system"); db._dropDatabase(dbName); - arango.reconnect(originalEndpoint, db._name(), "root", ""); }, testLogClusterInfoInFile: function() { - let coordinatorEndpoint = getCoordinatorEndpoints()[0]; - arango.reconnect(coordinatorEndpoint, db._name(), "root", ""); - - let res1 = arango.GET("/_api/cluster/cluster-info?returnBodyAsJSON=true"); + let coordinator = IM.arangods.filter(arangod => {return arangod.isFrontend();})[0]; - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` - require('console').log("testmann: start"); - require('console').log("testmann: testi" + '${JSON.stringify(res1)}'); - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); + coordinator.connect(); + db._useDatabase(dbName); - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); + let res1 = arango.GET("/_api/cluster/cluster-info?returnBodyAsJSON=true"); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + print(res1) + logServer("testmann: start"); + logServer("testmann: testi" + `${JSON.stringify(res1)}`); + logServer("testmann: done", "error"); // log is buffered, so give it a few tries until the log messages appear let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); + let content = fs.readFileSync(coordinator.logFile, 'ascii'); let lines = content.split('\n'); filtered = lines.filter((line) => { @@ -110,7 +105,7 @@ function LoggerSuite() { require("internal").sleep(0.5); } assertEqual(3, filtered.length); - + print(filtered) assertMatch(/testmann: start/, filtered[0]); const parsedRes = JSON.parse(filtered[1]); const parsedMsg = JSON.parse(parsedRes.message.substring(parsedRes.message.indexOf("{"))); From 2c85473feac98969a61e7251e3156c9eb27de5a3 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 3 Sep 2025 17:00:37 +0200 Subject: [PATCH 12/19] convert more tests to rest based logging --- .../log-dropped-messages-noncluster.js | 2 +- ...og-escape-control-characters-false-json.js | 2 +- .../log-escape-control-characters-true.js | 2 +- ...og-escape-unicode-characters-false-json.js | 2 +- .../log-escape-unicode-characters-false.js | 2 +- ...log-escape-unicode-characters-true-json.js | 10 +- .../log-escape-unicode-characters-true.js | 2 +- .../log-json-format-all-options.js | 4 +- .../log-json-format-info-cluster.js | 4 +- .../log-json-format-pid-hostname-auto.js | 145 +++++++++--------- .../log-json-format-thread-hostname-empty.js | 143 +++++++++-------- .../log-json-max-length-small.js | 89 ++++++----- .../server_parameters/log-json-no-shorten.js | 105 ++++++------- .../log-json-process-hostname.js | 96 ++++++------ .../server_parameters/log-json-shorten.js | 105 ++++++------- tests/js/client/server_parameters/log-json.js | 103 ++++++------- .../log-max-length-default.js | 73 +++++---- .../server_parameters/log-max-length-large.js | 89 ++++++----- .../server_parameters/log-max-length-small.js | 71 ++++----- .../server_parameters/log-param-options.js | 111 +++++++------- .../log-queries-failed-and-memory.js | 61 ++++---- .../log-structured-params-json.js | 28 ++-- .../log-structured-params.js | 29 ++-- .../test-log-in-memory-level-err.js | 4 +- 24 files changed, 614 insertions(+), 668 deletions(-) diff --git a/tests/js/client/server_parameters/log-dropped-messages-noncluster.js b/tests/js/client/server_parameters/log-dropped-messages-noncluster.js index 7210010ca778..eb0c88f8ef30 100644 --- a/tests/js/client/server_parameters/log-dropped-messages-noncluster.js +++ b/tests/js/client/server_parameters/log-dropped-messages-noncluster.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertEqual */ +/* global getOptions, print, assertTrue, assertFalse, arango, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-escape-control-characters-false-json.js b/tests/js/client/server_parameters/log-escape-control-characters-false-json.js index fa96a02386cd..dc4e4e43ab42 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-false-json.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-false-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-escape-control-characters-true.js b/tests/js/client/server_parameters/log-escape-control-characters-true.js index 9f9114f35736..575d789afb43 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-true.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-true.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js b/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js index ef1f690ae1f5..101b8ca1ed52 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-false-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* GLOBAL, global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-false.js b/tests/js/client/server_parameters/log-escape-unicode-characters-false.js index 3250884d4ae7..ebd726ff05ac 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-false.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-false.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js b/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js index 2504f1998d5c..27cdd34d050b 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-true-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,8 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -33,7 +31,6 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-unicode-chars': 'true', @@ -41,7 +38,10 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function EscapeUnicodeTrueSuite() { 'use strict'; @@ -67,7 +67,7 @@ function EscapeUnicodeTrueSuite() { let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(arangod.logfile, 'utf-8'); + let content = fs.readFileSync(arangod.logFile, 'utf-8'); let lines = content.split('\n'); filtered = lines.filter((line) => { diff --git a/tests/js/client/server_parameters/log-escape-unicode-characters-true.js b/tests/js/client/server_parameters/log-escape-unicode-characters-true.js index df41bd284a56..733edfe4e158 100644 --- a/tests/js/client/server_parameters/log-escape-unicode-characters-true.js +++ b/tests/js/client/server_parameters/log-escape-unicode-characters-true.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-json-format-all-options.js b/tests/js/client/server_parameters/log-json-format-all-options.js index 4a14e7be9df3..71ad3c2bb076 100644 --- a/tests/js/client/server_parameters/log-json-format-all-options.js +++ b/tests/js/client/server_parameters/log-json-format-all-options.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -107,7 +107,7 @@ function LoggerSuite() { } assertMatch(/testmann: done/, filtered[51]); - res = arango.GET("/_admin/log?returnBodyAsJSON=true"); + let res = arango.GET("/_admin/log?returnBodyAsJSON=true"); assertTrue(res.hasOwnProperty("totalAmount")); assertTrue(res.hasOwnProperty("lid")); assertTrue(res.hasOwnProperty("topic")); diff --git a/tests/js/client/server_parameters/log-json-format-info-cluster.js b/tests/js/client/server_parameters/log-json-format-info-cluster.js index e6e6f6a5543e..fea6e0fe33a7 100644 --- a/tests/js/client/server_parameters/log-json-format-info-cluster.js +++ b/tests/js/client/server_parameters/log-json-format-info-cluster.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -82,7 +82,6 @@ function LoggerSuite() { let res1 = arango.GET("/_api/cluster/cluster-info?returnBodyAsJSON=true"); - print(res1) logServer("testmann: start"); logServer("testmann: testi" + `${JSON.stringify(res1)}`); logServer("testmann: done", "error"); @@ -105,7 +104,6 @@ function LoggerSuite() { require("internal").sleep(0.5); } assertEqual(3, filtered.length); - print(filtered) assertMatch(/testmann: start/, filtered[0]); const parsedRes = JSON.parse(filtered[1]); const parsedMsg = JSON.parse(parsedRes.message.substring(parsedRes.message.indexOf("{"))); diff --git a/tests/js/client/server_parameters/log-json-format-pid-hostname-auto.js b/tests/js/client/server_parameters/log-json-format-pid-hostname-auto.js index 25bc7e98939c..5480a1f47fda 100644 --- a/tests/js/client/server_parameters/log-json-format-pid-hostname-auto.js +++ b/tests/js/client/server_parameters/log-json-format-pid-hostname-auto.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual, assertNotEqual */ +/* global GLOBAL, print, getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual, assertNotEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,12 +24,9 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.prefix': 'PREFIX', 'log.thread': 'false', @@ -44,87 +41,85 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; return { - testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); + logServer("testmann: testi" + i); } - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + logServer("testmann: done", "error"); + let tries = 0; + let filtered = []; + while (tries++ < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < 51; ++i) { - assertTrue(filtered[i].match(/testmann: testi\d+/)); - let parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("prefix"), parsedRes); - assertEqual(parsedRes.prefix, "PREFIX"); - assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); - assertMatch(/\d+/, parsedRes.pid); - assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("hostname"), parsedRes); - assertEqual(typeof parsedRes.hostname, "string"); - assertNotEqual(parsedRes.hostname, ""); - assertTrue(parsedRes.hasOwnProperty("role"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("tid"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("thread")); - assertTrue(parsedRes.hasOwnProperty("line")); - assertMatch(/^\d+$/, parsedRes.line); - assertMatch(/^[a-f0-9]{5}$/, parsedRes.id, parsedRes); - assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); - assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); - } - assertMatch(/testmann: done/, filtered[51]); - - res = arango.GET("/_admin/log?returnBodyAsJSON=true"); - assertTrue(res.hasOwnProperty("totalAmount")); - assertTrue(res.hasOwnProperty("lid")); - assertTrue(res.hasOwnProperty("topic")); - assertTrue(res.hasOwnProperty("level")); - assertTrue(res.hasOwnProperty("timestamp")); - assertTrue(res.hasOwnProperty("text")); - - for (let i = 0; i < res.totalAmount; ++i) { - assertMatch(/^\d+$/, res.lid[i]); - assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); - assertMatch(/^\d+$/, res.level[i]); - assertMatch(/^\d+$/, res.timestamp[i]); - } + assertEqual(52, filtered.length); + + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < 51; ++i) { + assertTrue(filtered[i].match(/testmann: testi\d+/)); + let parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("prefix"), parsedRes); + assertEqual(parsedRes.prefix, "PREFIX"); + assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); + assertMatch(/\d+/, parsedRes.pid); + assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("hostname"), parsedRes); + assertEqual(typeof parsedRes.hostname, "string"); + assertNotEqual(parsedRes.hostname, ""); + assertTrue(parsedRes.hasOwnProperty("role"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("tid"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("thread")); + assertTrue(parsedRes.hasOwnProperty("line")); + assertMatch(/^\d+$/, parsedRes.line); + assertMatch(/^[a-f0-9]{5}$/, parsedRes.id, parsedRes); + assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); + assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); + } + assertMatch(/testmann: done/, filtered[51]); + + let res = arango.GET("/_admin/log?returnBodyAsJSON=true"); + assertTrue(res.hasOwnProperty("totalAmount")); + assertTrue(res.hasOwnProperty("lid")); + assertTrue(res.hasOwnProperty("topic")); + assertTrue(res.hasOwnProperty("level")); + assertTrue(res.hasOwnProperty("timestamp")); + assertTrue(res.hasOwnProperty("text")); + + for (let i = 0; i < res.totalAmount; ++i) { + assertMatch(/^\d+$/, res.lid[i]); + assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); + assertMatch(/^\d+$/, res.level[i]); + assertMatch(/^\d+$/, res.timestamp[i]); + } + }); + IM.reconnectMe(); }, }; } diff --git a/tests/js/client/server_parameters/log-json-format-thread-hostname-empty.js b/tests/js/client/server_parameters/log-json-format-thread-hostname-empty.js index b954971be6eb..fd0dff372826 100644 --- a/tests/js/client/server_parameters/log-json-format-thread-hostname-empty.js +++ b/tests/js/client/server_parameters/log-json-format-thread-hostname-empty.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,12 +24,9 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.prefix': 'PREFIX', 'log.thread': 'true', @@ -44,7 +41,10 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -52,78 +52,75 @@ function LoggerSuite() { return { testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); + logServer("testmann: testi" + i); } - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < 51; ++i) { - assertMatch(/testmann: testi\d+/, filtered[i]); - let parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("prefix"), parsedRes); - assertEqual(parsedRes.prefix, "PREFIX"); - assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("pid"), parsedRes); - - assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("hostname"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("role"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("tid"), parsedRes); - assertMatch(/\d+/, parsedRes.tid); - assertTrue(parsedRes.hasOwnProperty("thread")); - assertTrue(parsedRes.hasOwnProperty("line")); - assertMatch(/\d+/, parsedRes.line); - assertMatch(/^[a-f0-9]{5}/, parsedRes.id, parsedRes); - assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); - assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); - } - assertMatch(/testmann: done/, filtered[51]); - - res = arango.GET("/_admin/log?returnBodyAsJSON=true"); - assertTrue(res.hasOwnProperty("totalAmount")); - assertTrue(res.hasOwnProperty("lid")); - assertTrue(res.hasOwnProperty("topic")); - assertTrue(res.hasOwnProperty("level")); - assertTrue(res.hasOwnProperty("timestamp")); - assertTrue(res.hasOwnProperty("text")); - - for (let i = 0; i < res.totalAmount; ++i) { - assertMatch(/^\d+$/, res.lid[i]); - assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); - assertMatch(/^\d+$/, res.level[i]); - assertMatch(/^\d+$/, res.timestamp[i]); - } + assertEqual(52, filtered.length); + + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < 51; ++i) { + assertMatch(/testmann: testi\d+/, filtered[i]); + let parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("prefix"), parsedRes); + assertEqual(parsedRes.prefix, "PREFIX"); + assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("pid"), parsedRes); + + assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("hostname"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("role"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("tid"), parsedRes); + assertMatch(/\d+/, parsedRes.tid); + assertTrue(parsedRes.hasOwnProperty("thread")); + assertTrue(parsedRes.hasOwnProperty("line")); + assertMatch(/\d+/, parsedRes.line); + assertMatch(/^[a-f0-9]{5}/, parsedRes.id, parsedRes); + assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); + assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); + } + assertMatch(/testmann: done/, filtered[51]); + + let res = arango.GET("/_admin/log?returnBodyAsJSON=true"); + assertTrue(res.hasOwnProperty("totalAmount")); + assertTrue(res.hasOwnProperty("lid")); + assertTrue(res.hasOwnProperty("topic")); + assertTrue(res.hasOwnProperty("level")); + assertTrue(res.hasOwnProperty("timestamp")); + assertTrue(res.hasOwnProperty("text")); + + for (let i = 0; i < res.totalAmount; ++i) { + assertMatch(/^\d+$/, res.lid[i]); + assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); + assertMatch(/^\d+$/, res.level[i]); + assertMatch(/^\d+$/, res.timestamp[i]); + } + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-json-max-length-small.js b/tests/js/client/server_parameters/log-json-max-length-small.js index 232cf4260486..54398a70b464 100644 --- a/tests/js/client/server_parameters/log-json-max-length-small.js +++ b/tests/js/client/server_parameters/log-json-max-length-small.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,18 +25,18 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', 'log.max-entry-length': '16384', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -53,52 +53,49 @@ function LoggerSuite() { // restore previous log level for "general" topic; arango.PUT("/_admin/log/level", { general: oldLogLevel }); }, - - testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -require('console').log("testmann: " + Array(32768).join("x")); -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - if (filtered.length === 3) { - break; + testLogEntries: function() { + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + logServer("testmann: " + Array(32768).join("x")); + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 3) { + break; + } + + require("internal").sleep(0.5); } + assertEqual(3, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(3, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); - assertTrue(filtered[2].match(/testmann: done/)); - - let valid = 0; - filtered.forEach((line) => { - JSON.parse(line); - valid++; - }); - assertEqual(3, valid); + assertTrue(filtered[0].match(/testmann: start/)); + assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); + assertTrue(filtered[2].match(/testmann: done/)); - // + 10 here, because JSON truncation is approximate - assertTrue(filtered[1].length <= 16384 + 10, filtered[1].length); + let valid = 0; + filtered.forEach((line) => { + JSON.parse(line); + valid++; + }); + assertEqual(3, valid); + + // + 10 here, because JSON truncation is approximate + assertTrue(filtered[1].length <= 16384 + 10, filtered[1].length); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-json-no-shorten.js b/tests/js/client/server_parameters/log-json-no-shorten.js index ec137bee2d95..812e0ce3180c 100644 --- a/tests/js/client/server_parameters/log-json-no-shorten.js +++ b/tests/js/client/server_parameters/log-json-no-shorten.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,21 +25,21 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', 'log.line-number': 'true', 'log.shorten-filenames': 'false', 'log.role': 'false', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.thread': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -58,57 +58,54 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); -} -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + for (let i = 0; i < 50; ++i) { + logServer("testmann: testi" + i); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - for (let i = 1; i < 51; ++i) { - let parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("hostname"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("role"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("tid"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("file"), parsedRes); - assertTrue(parsedRes.file.includes("/") || parsedRes.file.includes("\\"), parsedRes.file); - assertMatch(/^[a-f0-9]{5}/, parsedRes.id, parsedRes); - assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); - assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); - } - assertTrue(filtered[51].match(/testmann: done/)); + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); + } + assertEqual(52, filtered.length); + + assertTrue(filtered[0].match(/testmann: start/)); + for (let i = 1; i < 51; ++i) { + let parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("hostname"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("role"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("tid"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("file"), parsedRes); + assertTrue(parsedRes.file.includes("/") || parsedRes.file.includes("\\"), parsedRes.file); + assertMatch(/^[a-f0-9]{5}/, parsedRes.id, parsedRes); + assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); + assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); + } + assertTrue(filtered[51].match(/testmann: done/)); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-json-process-hostname.js b/tests/js/client/server_parameters/log-json-process-hostname.js index 42aacc7346a1..31744113f8dc 100644 --- a/tests/js/client/server_parameters/log-json-process-hostname.js +++ b/tests/js/client/server_parameters/log-json-process-hostname.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, assertFalse, arango, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,8 +25,6 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', @@ -35,12 +33,14 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -59,56 +59,54 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); -} -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + for (let i = 0; i < 50; ++i) { + logServer("testmann: testi" + i); + } + logServer("testmann: done", "error"); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); + if (filtered.length === 52) { + break; + } - if (filtered.length === 52) { - break; + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - for (let i = 1; i < 51; ++i) { - assertTrue(filtered[i].match(/testmann: testi\d+/)); - let msg = JSON.parse(filtered[i]); - assertTrue(msg.hasOwnProperty("time"), msg); - assertFalse(msg.hasOwnProperty("pid"), msg); - assertTrue(msg.hasOwnProperty("level"), msg); - assertTrue(msg.hasOwnProperty("topic"), msg); - assertFalse(msg.hasOwnProperty("id"), msg); - assertTrue(msg.hasOwnProperty("hostname"), msg); - assertEqual("delorean", msg.hostname, msg); - assertTrue(msg.hasOwnProperty("role"), msg); - assertTrue(msg.hasOwnProperty("tid"), msg); - assertTrue(msg.hasOwnProperty("message"), msg); - assertEqual("testmann: testi" + (i - 1), msg.message, msg); - } - assertTrue(filtered[51].match(/testmann: done/)); + assertEqual(52, filtered.length); + + assertTrue(filtered[0].match(/testmann: start/)); + for (let i = 1; i < 51; ++i) { + assertTrue(filtered[i].match(/testmann: testi\d+/)); + let msg = JSON.parse(filtered[i]); + assertTrue(msg.hasOwnProperty("time"), msg); + assertFalse(msg.hasOwnProperty("pid"), msg); + assertTrue(msg.hasOwnProperty("level"), msg); + assertTrue(msg.hasOwnProperty("topic"), msg); + assertFalse(msg.hasOwnProperty("id"), msg); + assertTrue(msg.hasOwnProperty("hostname"), msg); + assertEqual("delorean", msg.hostname, msg); + assertTrue(msg.hasOwnProperty("role"), msg); + assertTrue(msg.hasOwnProperty("tid"), msg); + assertTrue(msg.hasOwnProperty("message"), msg); + assertEqual("testmann: testi" + (i - 1), msg.message, msg); + } + assertTrue(filtered[51].match(/testmann: done/)); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-json-shorten.js b/tests/js/client/server_parameters/log-json-shorten.js index 4b6e8328263f..be45c296b973 100644 --- a/tests/js/client/server_parameters/log-json-shorten.js +++ b/tests/js/client/server_parameters/log-json-shorten.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertMatch, assertNotMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, assertFalse, arango, assertMatch, assertNotMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,21 +25,21 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', 'log.line-number': 'true', 'log.shorten-filenames': 'true', 'log.role': 'false', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.thread': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -58,57 +58,54 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); -} -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + for (let i = 0; i < 50; ++i) { + logServer("testmann: testi" + i); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - for (let i = 1; i < 51; ++i) { - let parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("hostname"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("role"), parsedRes); - assertFalse(parsedRes.hasOwnProperty("tid"), parsedRes); - assertTrue(parsedRes.hasOwnProperty("file"), parsedRes); - assertFalse(parsedRes.file.includes("/") || parsedRes.file.includes("\\"), parsedRes.file); - assertMatch(/^[a-f0-9]{5}/, parsedRes.id, parsedRes); - assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); - assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); - } - assertTrue(filtered[51].match(/testmann: done/)); + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); + } + assertEqual(52, filtered.length); + + assertTrue(filtered[0].match(/testmann: start/)); + for (let i = 1; i < 51; ++i) { + let parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("time"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("pid"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("level"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("topic"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("id"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("hostname"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("role"), parsedRes); + assertFalse(parsedRes.hasOwnProperty("tid"), parsedRes); + assertTrue(parsedRes.hasOwnProperty("file"), parsedRes); + assertFalse(parsedRes.file.includes("/") || parsedRes.file.includes("\\"), parsedRes.file); + assertMatch(/^[a-f0-9]{5}/, parsedRes.id, parsedRes); + assertTrue(parsedRes.hasOwnProperty("message"), parsedRes); + assertEqual("testmann: testi" + (i - 1), parsedRes.message, parsedRes); + } + assertTrue(filtered[51].match(/testmann: done/)); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-json.js b/tests/js/client/server_parameters/log-json.js index 6cb3bc593d67..3ecfbd6fb9f7 100644 --- a/tests/js/client/server_parameters/log-json.js +++ b/tests/js/client/server_parameters/log-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, assertFalse, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,19 +25,19 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'true', 'log.role': 'false', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.thread': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -56,56 +56,53 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); -} -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + for (let i = 0; i < 50; ++i) { + logServer("testmann: testi" + i); } - - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - for (let i = 1; i < 51; ++i) { - assertTrue(filtered[i].match(/testmann: testi\d+/)); - let msg = JSON.parse(filtered[i]); - assertTrue(msg.hasOwnProperty("time"), msg); - assertTrue(msg.hasOwnProperty("pid"), msg); - assertTrue(msg.hasOwnProperty("level"), msg); - assertTrue(msg.hasOwnProperty("topic"), msg); - assertTrue(msg.hasOwnProperty("id"), msg); - assertFalse(msg.hasOwnProperty("hostname"), msg); - assertFalse(msg.hasOwnProperty("role"), msg); - assertFalse(msg.hasOwnProperty("tid"), msg); - assertMatch(/^[a-f0-9]{5}/, msg.id, msg); - assertTrue(msg.hasOwnProperty("message"), msg); - assertEqual("testmann: testi" + (i - 1), msg.message, msg); - } - assertTrue(filtered[51].match(/testmann: done/)); + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); + } + assertEqual(52, filtered.length); + + assertTrue(filtered[0].match(/testmann: start/)); + for (let i = 1; i < 51; ++i) { + assertTrue(filtered[i].match(/testmann: testi\d+/)); + let msg = JSON.parse(filtered[i]); + assertTrue(msg.hasOwnProperty("time"), msg); + assertTrue(msg.hasOwnProperty("pid"), msg); + assertTrue(msg.hasOwnProperty("level"), msg); + assertTrue(msg.hasOwnProperty("topic"), msg); + assertTrue(msg.hasOwnProperty("id"), msg); + assertFalse(msg.hasOwnProperty("hostname"), msg); + assertFalse(msg.hasOwnProperty("role"), msg); + assertFalse(msg.hasOwnProperty("tid"), msg); + assertMatch(/^[a-f0-9]{5}/, msg.id, msg); + assertTrue(msg.hasOwnProperty("message"), msg); + assertEqual("testmann: testi" + (i - 1), msg.message, msg); + } + assertTrue(filtered[51].match(/testmann: done/)); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-max-length-default.js b/tests/js/client/server_parameters/log-max-length-default.js index 43b4e7bd7537..aeda19eb959c 100644 --- a/tests/js/client/server_parameters/log-max-length-default.js +++ b/tests/js/client/server_parameters/log-max-length-default.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertEqual, arango, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, assertEqual, arango, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,16 +25,16 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -53,43 +53,40 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -require('console').log("testmann: " + Array(1048576).join("x")); -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 3) { - break; + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + logServer("testmann: " + Array(1048576).join("x")); + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 3) { + break; + } + + require("internal").sleep(0.5); } + assertEqual(3, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(3, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); - assertTrue(filtered[2].match(/testmann: done/)); + assertTrue(filtered[0].match(/testmann: start/)); + assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); + assertTrue(filtered[2].match(/testmann: done/)); - // the log line must not have been shortened - assertTrue(filtered[1].length >= 1048576, filtered[1].length); + // the log line must not have been shortened + assertTrue(filtered[1].length >= 1048576, filtered[1].length); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-max-length-large.js b/tests/js/client/server_parameters/log-max-length-large.js index 4d9affa39b2f..e61ec5e00a10 100644 --- a/tests/js/client/server_parameters/log-max-length-large.js +++ b/tests/js/client/server_parameters/log-max-length-large.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,17 +25,17 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.max-entry-length': '1048576', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -54,49 +54,46 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -require('console').log("testmann: " + Array(32768).join("x")); -require('console').log("testmann: " + Array(65536).join("y")); -require('console').log("testmann: " + Array(1048576).join("z")); -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 5) { - break; + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + logServer("testmann: " + Array(32768).join("x")); + logServer("testmann: " + Array(65536).join("y")); + logServer("testmann: " + Array(1048576).join("z")); + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 5) { + break; + } + + require("internal").sleep(0.5); } - - require("internal").sleep(0.5); - } - assertEqual(5, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); - assertTrue(filtered[2].match(/testmann: yyyyyyyy/)); - assertTrue(filtered[3].match(/testmann: zzzzzzzz/)); - assertTrue(filtered[4].match(/testmann: done/)); - - assertTrue(filtered[1].length >= 32768, filtered[1].length); - assertTrue(filtered[2].length >= 65536, filtered[2].length); - // this line must have been shortened - assertTrue(filtered[3].length === 1048576 + '...'.length, filtered[3].length); + assertEqual(5, filtered.length); + + assertTrue(filtered[0].match(/testmann: start/)); + assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); + assertTrue(filtered[2].match(/testmann: yyyyyyyy/)); + assertTrue(filtered[3].match(/testmann: zzzzzzzz/)); + assertTrue(filtered[4].match(/testmann: done/)); + + assertTrue(filtered[1].length >= 32768, filtered[1].length); + assertTrue(filtered[2].length >= 65536, filtered[2].length); + // this line must have been shortened + assertTrue(filtered[3].length === 1048576 + '...'.length, filtered[3].length); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-max-length-small.js b/tests/js/client/server_parameters/log-max-length-small.js index 4e074945f6cd..7ef8a139f0f1 100644 --- a/tests/js/client/server_parameters/log-max-length-small.js +++ b/tests/js/client/server_parameters/log-max-length-small.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,17 +25,17 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.max-entry-length': '16384', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -54,42 +54,39 @@ function LoggerSuite() { }, testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -require('console').log("testmann: " + Array(32768).join("x")); -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 3) { - break; + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); + logServer("testmann: " + Array(32768).join("x")); + logServer("testmann: done"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 3) { + break; + } + + require("internal").sleep(0.5); } + assertEqual(3, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(3, filtered.length); - - assertTrue(filtered[0].match(/testmann: start/)); - assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); - assertTrue(filtered[2].match(/testmann: done/)); + assertTrue(filtered[0].match(/testmann: start/)); + assertTrue(filtered[1].match(/testmann: xxxxxxxx/)); + assertTrue(filtered[2].match(/testmann: done/)); - assertTrue(filtered[1].length <= 16384 + '...'.length, filtered[1].length); + assertTrue(filtered[1].length <= 16384 + '...'.length, filtered[1].length); + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-param-options.js b/tests/js/client/server_parameters/log-param-options.js index 8ac136225ccd..3bf0d2bf6368 100644 --- a/tests/js/client/server_parameters/log-param-options.js +++ b/tests/js/client/server_parameters/log-param-options.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, arango, assertMatch, assertEqual */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertMatch, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,13 +24,10 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.use-json-format': 'false', 'log.role': 'false', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.prefix': 'PREFIX', 'log.thread': 'true', @@ -43,7 +40,10 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; @@ -51,64 +51,61 @@ function LoggerSuite() { return { testLogEntries: function() { - let res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` - require('console').log("testmann: start"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + logServer("testmann: start"); for (let i = 0; i < 50; ++i) { - require('console').log("testmann: testi" + i); + logServer("testmann: testi" + i); } - require('console').log("testmann: done"); - return require('internal').options()["log.output"]; - `); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); - let lines = content.split('\n'); - - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); - - if (filtered.length === 52) { - break; + logServer("testmann: done", "error"); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); + + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); + + if (filtered.length === 52) { + break; + } + + require("internal").sleep(0.5); } + assertEqual(52, filtered.length); - require("internal").sleep(0.5); - } - assertEqual(52, filtered.length); - - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < 51; ++i) { - const msg = filtered[i]; - assertTrue(msg.startsWith("HOSTNAME")); - assertMatch(/.*PREFIX.*/, msg); - assertMatch(/.*\[\d{1,}-\d{1,}-[A-Za-z0-9]+\].*/, msg); - assertMatch(/testmann: testi\d+/, msg); - - } - assertMatch(/testmann: done/, filtered[51]); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < 51; ++i) { + const msg = filtered[i]; + assertTrue(msg.startsWith("HOSTNAME")); + assertMatch(/.*PREFIX.*/, msg); + assertMatch(/.*\[\d{1,}-\d{1,}-[A-Za-z0-9]+\].*/, msg); + assertMatch(/testmann: testi\d+/, msg); - res = arango.GET("/_admin/log?returnBodyAsJSON=true"); - assertTrue(res.hasOwnProperty("totalAmount")); - assertTrue(res.hasOwnProperty("lid")); - assertTrue(res.hasOwnProperty("topic")); - assertTrue(res.hasOwnProperty("level")); - assertTrue(res.hasOwnProperty("timestamp")); - assertTrue(res.hasOwnProperty("text")); - - for (let i = 0; i < res.totalAmount; ++i) { - assertMatch(/^\d+$/, res.lid[i]); - assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); - assertMatch(/^\d+$/, res.level[i]); - assertMatch(/^\d+$/, res.timestamp[i]); - } + } + assertMatch(/testmann: done/, filtered[51]); + + let res = arango.GET("/_admin/log?returnBodyAsJSON=true"); + assertTrue(res.hasOwnProperty("totalAmount")); + assertTrue(res.hasOwnProperty("lid")); + assertTrue(res.hasOwnProperty("topic")); + assertTrue(res.hasOwnProperty("level")); + assertTrue(res.hasOwnProperty("timestamp")); + assertTrue(res.hasOwnProperty("text")); + + for (let i = 0; i < res.totalAmount; ++i) { + assertMatch(/^\d+$/, res.lid[i]); + assertMatch(/^[A-Za-z]{1,}$/, res.topic[i]); + assertMatch(/^\d+$/, res.level[i]); + assertMatch(/^\d+$/, res.timestamp[i]); + } + }); + IM.reconnectMe(); }, }; diff --git a/tests/js/client/server_parameters/log-queries-failed-and-memory.js b/tests/js/client/server_parameters/log-queries-failed-and-memory.js index 487cd8d99286..51c3ddc56ed8 100644 --- a/tests/js/client/server_parameters/log-queries-failed-and-memory.js +++ b/tests/js/client/server_parameters/log-queries-failed-and-memory.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertEqual */ +/* global GLOBAL, getOptions, assertTrue, assertFalse, arango, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,8 +25,6 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'query.log-failed': 'true', @@ -35,49 +33,44 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; let getLogLines = function () { - const res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("testmann: start"); -let db = require('internal').db; -db._query("/*LOG TEST ok query*/ RETURN CONCAT('a', 'b', 'c')"); -try { - db._query("/*LOG TEST failed query*/ RETURN PIFF()"); - throw "failed!"; -} catch (err) {} - -db._query("/*LOG TEST low memory usage*/ FOR i IN 1..1024 RETURN i"); -db._query("/*LOG TEST high memory usage*/ FOR i IN 1..1048576 RETURN i"); - -let values = []; -for (let i = 0; i < 1024; ++i) { - values.push(i); -} -db._query("/*LOG TEST large bind1*/ FOR i IN 1..1024 FILTER i IN @values RETURN i", { values }); - -try { - db._query("/*LOG TEST large bind2*/ FOR i IN 1..1024 FILTER i IN @values RETURN PIFF()", { values }); - throw "failed!"; -} catch (err) {} - -require('console').log("testmann: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); + logServer("testmann: start"); + let db = require('internal').db; + db._query("/*LOG TEST ok query*/ RETURN CONCAT('a', 'b', 'c')"); + try { + db._query("/*LOG TEST failed query*/ RETURN PIFF()"); + throw "failed!"; + } catch (err) {} + + db._query("/*LOG TEST low memory usage*/ FOR i IN 1..1024 RETURN i"); + db._query("/*LOG TEST high memory usage*/ FOR i IN 1..1048576 RETURN i"); + + let values = []; + for (let i = 0; i < 1024; ++i) { + values.push(i); + } + db._query("/*LOG TEST large bind1*/ FOR i IN 1..1024 FILTER i IN @values RETURN i", { values }); - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + try { + db._query("/*LOG TEST large bind2*/ FOR i IN 1..1024 FILTER i IN @values RETURN PIFF()", { values }); + throw "failed!"; + } catch (err) {} + logServer("testmann: done"); + let arangod = IM.arangods.filter(arangod => {return arangod.isFrontend();})[0]; // log is buffered, so give it a few tries until the log messages appear let tries = 0; let lines; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); + let content = fs.readFileSync(arangod.logFile, 'ascii'); lines = content.split('\n'); diff --git a/tests/js/client/server_parameters/log-structured-params-json.js b/tests/js/client/server_parameters/log-structured-params-json.js index 40a515d963f5..e22f462d891e 100644 --- a/tests/js/client/server_parameters/log-structured-params-json.js +++ b/tests/js/client/server_parameters/log-structured-params-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertEqual */ +/* global GLOBAL, getOptions, assertTrue, assertFalse, arango, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -24,8 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.structured-param': ['database=true', 'url', 'username'], @@ -33,31 +31,27 @@ if (getOptions === true) { }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; let generateFilteredLog = function(fieldName) { - const res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("${fieldName}: start"); -for (let i = 0; i < 10; ++i) { - require('console').log("${fieldName}: test" + i); -} -require('console').log("${fieldName}: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); + logServer(`${fieldName}: start`); + for (let i = 0; i < 10; ++i) { + logServer(`${fieldName}: test ${i}`); + } + logServer(`${fieldName}: done`, "error"); + let arangod = IM.arangods.filter(arangod => { return arangod.isFrontend(); })[0]; // log is buffered, so give it a few tries until the log messages appear let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); + let content = fs.readFileSync(arangod.logFile, 'ascii'); let lines = content.split('\n'); diff --git a/tests/js/client/server_parameters/log-structured-params.js b/tests/js/client/server_parameters/log-structured-params.js index 377d778e50cd..abfec1565fde 100644 --- a/tests/js/client/server_parameters/log-structured-params.js +++ b/tests/js/client/server_parameters/log-structured-params.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global getOptions, assertTrue, assertFalse, arango, assertEqual */ +/* global GLOBAL, getOptions, assertTrue, assertFalse, arango, assertEqual */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER @@ -25,39 +25,32 @@ /// @author Copyright 2019, ArangoDB Inc, Cologne, Germany // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); - if (getOptions === true) { return { 'log.structured-param': ['database=true', 'url', 'username'], }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function LoggerSuite() { 'use strict'; let generateFilteredLog = function (fieldName) { - const res = arango.POST("/_admin/execute?returnBodyAsJSON=true", ` -require('console').log("${fieldName}: start"); -for (let i = 0; i < 10; ++i) { - require('console').log("${fieldName}: test" + i); -} -require('console').log("${fieldName}: done"); -return require('internal').options()["log.output"]; -`); - - assertTrue(Array.isArray(res)); - assertTrue(res.length > 0); - - let logfile = res[res.length - 1].replace(/^file:\/\//, ''); - + logServer(`${fieldName}: start`); + for (let i = 0; i < 10; ++i) { + logServer(`${fieldName}: test${i}`); + } + logServer(`${fieldName}: done`, "error"); // log is buffered, so give it a few tries until the log messages appear + let arangod = IM.arangods.filter(arangod => {return arangod.isFrontend();})[0]; let tries = 0; let filtered = []; while (++tries < 60) { - let content = fs.readFileSync(logfile, 'ascii'); + let content = fs.readFileSync(arangod.logFile, 'ascii'); let lines = content.split('\n'); diff --git a/tests/js/client/server_parameters/test-log-in-memory-level-err.js b/tests/js/client/server_parameters/test-log-in-memory-level-err.js index 448d5e8da4c6..6fb613000a4b 100644 --- a/tests/js/client/server_parameters/test-log-in-memory-level-err.js +++ b/tests/js/client/server_parameters/test-log-in-memory-level-err.js @@ -32,6 +32,7 @@ if (getOptions === true) { }; } +const { logServer } = require('@arangodb/test-helper'); const jsunity = require('jsunity'); function testSuite() { @@ -59,7 +60,8 @@ function testSuite() { }; let log = function(level) { - arango.POST("/_admin/execute", `for (let i = 0; i < 50; ++i) require('console')._log('general=${level}', 'testi');`); + for (let i = 0; i < 50; ++i) + logServer('testi', level); }; return { From cfe312cc5f26e1861219c35d69b473eb72201c8a Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 08:43:45 +0200 Subject: [PATCH 13/19] improve loop handling --- ...log-escape-control-characters-true-json.js | 74 ++++++++++--------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/tests/js/client/server_parameters/log-escape-control-characters-true-json.js b/tests/js/client/server_parameters/log-escape-control-characters-true-json.js index bc45e9d43731..4bae59dfe96c 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-true-json.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-true-json.js @@ -24,10 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); -const IM = GLOBAL.instanceManager; -const { logServer } = require('@arangodb/test-helper'); - if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -35,7 +31,6 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-unicode-chars': 'false', @@ -44,6 +39,9 @@ if (getOptions === true) { }; } +const fs = require('fs'); +const IM = GLOBAL.instanceManager; +const { logServer } = require('@arangodb/test-helper'); const jsunity = require('jsunity'); function EscapeControlTrueSuite() { @@ -51,42 +49,48 @@ function EscapeControlTrueSuite() { return { testEscapeControlTrue: function() { - const controlCharsLength = 31; - logServer("testmann: start"); - for (let i = 1; i <= 31; ++i) { - let controlChar = '"\\u' + i.toString(16).padStart(4, '0') + '"'; - controlChar = JSON.parse(controlChar); - logServer("/\"\\testmann: testi " + controlChar + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + const controlCharsLength = 31; + logServer("testmann: start"); + for (let i = 1; i <= 31; ++i) { + let controlChar = '"\\u' + i.toString(16).padStart(4, '0') + '"'; + controlChar = JSON.parse(controlChar); + logServer("/\"\\testmann: testi " + controlChar + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); } - logServer("testmann: done", "error"); // write an error message to flush + logServer("testmann: done", "error"); // write an error message to flush - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(IM.arangods[0].logFile, 'utf-8'); - let lines = content.split('\n'); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'utf-8'); + let lines = content.split('\n'); - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); - if (filtered.length === controlCharsLength + 2) { - break; - } + if (filtered.length === controlCharsLength + 2) { + break; + } - require("internal").sleep(0.5); - } + require("internal").sleep(0.5); + } - assertEqual(controlCharsLength + 2, filtered.length); - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < controlCharsLength + 1; ++i) { - const parsedRes = JSON.parse(filtered[i]); - assertTrue(parsedRes.hasOwnProperty("message")); - const controlChar = String.fromCharCode(i); - assertEqual(parsedRes.message, "/\"\\testmann: testi " + controlChar + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123"); - } - assertMatch(/testmann: done/, filtered[controlCharsLength + 1]); + assertEqual(controlCharsLength + 2, filtered.length, JSON.stringify(filtered)); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < controlCharsLength + 1; ++i) { + const parsedRes = JSON.parse(filtered[i]); + assertTrue(parsedRes.hasOwnProperty("message"), JSON.stringify(parsedRes)); + const controlChar = String.fromCharCode(i); + assertEqual(parsedRes.message, "/\"\\testmann: testi " + controlChar + " \u00B0\ud83e\uddd9\uf0f9\u9095\uf0f9\u90b6abc123", JSON.stringify(parsedRes)); + } + assertMatch(/testmann: done/, filtered[controlCharsLength + 1]); + }); + IM.reconnectMe(); }, }; From 0e66f79880b19b80c6a0bcb606426f5f645fcdd3 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 08:47:41 +0200 Subject: [PATCH 14/19] loop for cluster --- .../log-escape-control-characters-false.js | 68 ++++++++++--------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/tests/js/client/server_parameters/log-escape-control-characters-false.js b/tests/js/client/server_parameters/log-escape-control-characters-false.js index 0fa926910dde..bba03cebfbcb 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-false.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-false.js @@ -24,9 +24,6 @@ /// @author Julia Puget // ////////////////////////////////////////////////////////////////////////////// -const fs = require('fs'); -const IM = GLOBAL.instanceManager; -const { logServer } = require('@arangodb/test-helper'); if (getOptions === true) { return { 'log.hostname': 'delorean', @@ -34,53 +31,60 @@ if (getOptions === true) { 'log.ids': 'false', 'log.role': 'true', 'log.thread': 'true', - 'log.output': 'file://' + fs.getTempFile() + '.$PID', 'log.foreground-tty': 'false', 'log.level': 'debug', 'log.escape-control-chars': 'false', }; } +const fs = require('fs'); const jsunity = require('jsunity'); +const { logServer } = require('@arangodb/test-helper'); +const IM = GLOBAL.instanceManager; function EscapeControlFalseSuite() { 'use strict'; return { testEscapeControlFalse: function() { - const escapeCharsLength = 31; - logServer("testmann: start"); - for (let i = 1; i <= 31; ++i) { - logServer("testmann: testi" + String.fromCharCode(i) + " abc123"); - } - logServer("testmann: done", "error"); // error flushes - - // log is buffered, so give it a few tries until the log messages appear - let tries = 0; - let filtered = []; - while (++tries < 60) { - let content = fs.readFileSync(IM.arangods[0].logFile, 'ascii'); - let lines = content.split('\n'); + IM.rememberConnection(); + IM.arangods.forEach(arangod => { + print(`testing ${arangod.name}`); + arangod.connect(); + const escapeCharsLength = 31; + logServer("testmann: start"); + for (let i = 1; i <= 31; ++i) { + logServer("testmann: testi" + String.fromCharCode(i) + " abc123"); + } + logServer("testmann: done", "error"); // error flushes - filtered = lines.filter((line) => { - return line.match(/testmann: /); - }); + // log is buffered, so give it a few tries until the log messages appear + let tries = 0; + let filtered = []; + while (++tries < 60) { + let content = fs.readFileSync(arangod.logFile, 'ascii'); + let lines = content.split('\n'); - if (filtered.length === escapeCharsLength + 2) { - break; - } + filtered = lines.filter((line) => { + return line.match(/testmann: /); + }); - require("internal").sleep(0.5); - } - assertEqual(escapeCharsLength + 2, filtered.length); + if (filtered.length === escapeCharsLength + 2) { + break; + } - assertMatch(/testmann: start/, filtered[0]); - for (let i = 1; i < escapeCharsLength + 1; ++i) { - const msg = filtered[i]; - assertTrue(msg.endsWith("testmann: testi abc123")); - } - assertMatch(/testmann: done/, filtered[escapeCharsLength + 1]); + require("internal").sleep(0.5); + } + assertEqual(escapeCharsLength + 2, filtered.length); + assertMatch(/testmann: start/, filtered[0]); + for (let i = 1; i < escapeCharsLength + 1; ++i) { + const msg = filtered[i]; + assertTrue(msg.endsWith("testmann: testi abc123")); + } + assertMatch(/testmann: done/, filtered[escapeCharsLength + 1]); + }); + IM.reconnectMe(); }, }; From 175ad1a6fe8e599db1f6e99ad80435cf6cdd7233 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 08:54:17 +0200 Subject: [PATCH 15/19] lint --- .../server_parameters/log-escape-control-characters-false.js | 2 +- .../log-escape-control-characters-true-json.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/js/client/server_parameters/log-escape-control-characters-false.js b/tests/js/client/server_parameters/log-escape-control-characters-false.js index bba03cebfbcb..d6411ea69dd5 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-false.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-false.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER diff --git a/tests/js/client/server_parameters/log-escape-control-characters-true-json.js b/tests/js/client/server_parameters/log-escape-control-characters-true-json.js index 4bae59dfe96c..41232c41a1e7 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-true-json.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-true-json.js @@ -1,5 +1,5 @@ /*jshint globalstrict:false, strict:false */ -/* global GLOBAL, getOptions, assertTrue, arango, assertEqual, assertMatch */ +/* global GLOBAL, print, getOptions, assertTrue, arango, assertEqual, assertMatch */ // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER From 993a6d28cff881b3631be39ca0be12ae568400b9 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 12:09:07 +0200 Subject: [PATCH 16/19] add the database name from the URL to the log context. --- arangod/RestHandler/RestAdminLogHandler.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arangod/RestHandler/RestAdminLogHandler.h b/arangod/RestHandler/RestAdminLogHandler.h index 546e7d43920f..31157e7fc7e0 100644 --- a/arangod/RestHandler/RestAdminLogHandler.h +++ b/arangod/RestHandler/RestAdminLogHandler.h @@ -41,6 +41,16 @@ class RestAdminLogHandler : public RestBaseHandler { RequestLane lane() const override final { return RequestLane::CLIENT_FAST; } auto executeAsync() -> futures::Future override; + protected: + // we just use the database from the URL to log it. + [[nodiscard]] auto makeSharedLogContextValue() const + -> std::shared_ptr override { + return LogContext::makeValue() + .with(_request->fullUrl()) + .with(_request->user()) + .with(_request->databaseName()) + .share(); + } private: arangodb::Result verifyPermitted(); void clearLogs(); From 561d26c9101bf0d90a317dbc898ac839701f9e56 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 12:09:29 +0200 Subject: [PATCH 17/19] fix test string --- .../server_parameters/log-structured-params-json.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/js/client/server_parameters/log-structured-params-json.js b/tests/js/client/server_parameters/log-structured-params-json.js index e22f462d891e..6f1afc9a577c 100644 --- a/tests/js/client/server_parameters/log-structured-params-json.js +++ b/tests/js/client/server_parameters/log-structured-params-json.js @@ -40,12 +40,14 @@ function LoggerSuite() { 'use strict'; let generateFilteredLog = function(fieldName) { + IM.rememberConnection(); + let arangod = IM.arangods.filter(arangod => { return arangod.isFrontend(); })[0]; + arangod.connect(); logServer(`${fieldName}: start`); for (let i = 0; i < 10; ++i) { - logServer(`${fieldName}: test ${i}`); + logServer(`${fieldName}: test${i}`); } logServer(`${fieldName}: done`, "error"); - let arangod = IM.arangods.filter(arangod => { return arangod.isFrontend(); })[0]; // log is buffered, so give it a few tries until the log messages appear let tries = 0; @@ -65,6 +67,7 @@ function LoggerSuite() { require("internal").sleep(0.5); } + IM.reconnectMe(); return filtered; }; @@ -152,8 +155,7 @@ function LoggerSuite() { assertFalse(filteredObj.hasOwnProperty("database")); assertTrue(filteredObj.hasOwnProperty("username")); assertTrue(filteredObj.hasOwnProperty("url")); - - assertTrue(filtered[i].match(/testParams: test\d+/)); + assertTrue(filtered[i].match(/testParams: test\d+/), JSON.stringify(filtered[i])); assertFalse(filtered[i].match(/\[dog: /)); assertFalse(filtered[i].match(/\[database: _system\]/)); assertTrue(filtered[i].match("[username: root]")); From e753e77e9e133ca67a63fa22908aca7b006a4913 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 12:10:24 +0200 Subject: [PATCH 18/19] lint --- arangod/RestHandler/RestAdminLogHandler.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/arangod/RestHandler/RestAdminLogHandler.h b/arangod/RestHandler/RestAdminLogHandler.h index 31157e7fc7e0..286670fa38c5 100644 --- a/arangod/RestHandler/RestAdminLogHandler.h +++ b/arangod/RestHandler/RestAdminLogHandler.h @@ -44,13 +44,14 @@ class RestAdminLogHandler : public RestBaseHandler { protected: // we just use the database from the URL to log it. [[nodiscard]] auto makeSharedLogContextValue() const - -> std::shared_ptr override { + -> std::shared_ptr override { return LogContext::makeValue() - .with(_request->fullUrl()) - .with(_request->user()) - .with(_request->databaseName()) - .share(); + .with(_request->fullUrl()) + .with(_request->user()) + .with(_request->databaseName()) + .share(); } + private: arangodb::Result verifyPermitted(); void clearLogs(); From 6fa1e494072d4254f76013863beff55f48a0c51b Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 4 Sep 2025 12:44:49 +0200 Subject: [PATCH 19/19] error for flush --- .../server_parameters/log-escape-control-characters-true.js | 2 +- tests/js/client/server_parameters/log-max-length-small.js | 2 +- .../client/server_parameters/log-queries-failed-and-memory.js | 2 +- tests/js/client/server_parameters/wal-archive-size-limit.inc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/js/client/server_parameters/log-escape-control-characters-true.js b/tests/js/client/server_parameters/log-escape-control-characters-true.js index 575d789afb43..2284c07b61bb 100644 --- a/tests/js/client/server_parameters/log-escape-control-characters-true.js +++ b/tests/js/client/server_parameters/log-escape-control-characters-true.js @@ -58,7 +58,7 @@ function EscapeControlTrueSuite() { for (let i = 1; i <= 31; ++i) { logServer("testmann: testi" + String.fromCharCode(i) + " abc123"); } - logServer("testmann: done"); + logServer("testmann: done", "error"); // log is buffered, so give it a few tries until the log messages appear let tries = 0; diff --git a/tests/js/client/server_parameters/log-max-length-small.js b/tests/js/client/server_parameters/log-max-length-small.js index 7ef8a139f0f1..5b024ab02840 100644 --- a/tests/js/client/server_parameters/log-max-length-small.js +++ b/tests/js/client/server_parameters/log-max-length-small.js @@ -60,7 +60,7 @@ function LoggerSuite() { arangod.connect(); logServer("testmann: start"); logServer("testmann: " + Array(32768).join("x")); - logServer("testmann: done"); + logServer("testmann: done", "error"); // log is buffered, so give it a few tries until the log messages appear let tries = 0; let filtered = []; diff --git a/tests/js/client/server_parameters/log-queries-failed-and-memory.js b/tests/js/client/server_parameters/log-queries-failed-and-memory.js index 51c3ddc56ed8..17cc49454b4a 100644 --- a/tests/js/client/server_parameters/log-queries-failed-and-memory.js +++ b/tests/js/client/server_parameters/log-queries-failed-and-memory.js @@ -64,7 +64,7 @@ function LoggerSuite() { throw "failed!"; } catch (err) {} - logServer("testmann: done"); + logServer("testmann: done", "error"); let arangod = IM.arangods.filter(arangod => {return arangod.isFrontend();})[0]; // log is buffered, so give it a few tries until the log messages appear let tries = 0; diff --git a/tests/js/client/server_parameters/wal-archive-size-limit.inc b/tests/js/client/server_parameters/wal-archive-size-limit.inc index e4a4189ee2e6..7be71b1bf083 100644 --- a/tests/js/client/server_parameters/wal-archive-size-limit.inc +++ b/tests/js/client/server_parameters/wal-archive-size-limit.inc @@ -92,6 +92,6 @@ exports.sendLargeServerOperation = function(maxWaitTime) { return false; }); - logServer("testmann: done"); + logServer("testmann: done", "error"); return getLogLines(); };