180 using namespace boost::filesystem;
185 BEAST_EXPECT(!exists(fixture.logFile()));
189 BEAST_EXPECT(fixture.stopSignaled ==
false);
190 BEAST_EXPECT(exists(fixture.logFile()));
197 if (!BEAST_EXPECT(!exists(fixture.logDir())))
204 fixture.logDir().c_str(), std::ios::out | std::ios::app);
205 if (!BEAST_EXPECT(nastyFile))
212 BEAST_EXPECT(fixture.stopSignaled ==
false);
214 BEAST_EXPECT(fixture.stopSignaled ==
true);
224 remove(fixture.logDir());
231 if (!BEAST_EXPECT(!exists(fixture.logDir())))
236 boost::system::error_code ec;
237 boost::filesystem::create_directories(fixture.logDir(), ec);
238 if (!BEAST_EXPECT(!ec))
241 auto fileWriteable = [](boost::filesystem::path
const& p) ->
bool {
242 return std::ofstream{p.c_str(), std::ios::out | std::ios::app}
246 if (!BEAST_EXPECT(fileWriteable(fixture.logFile())))
249 boost::filesystem::permissions(
251 perms::remove_perms | perms::owner_write | perms::others_write |
256 if (fileWriteable(fixture.logFile()))
258 log <<
"Unable to write protect file. Test skipped."
265 BEAST_EXPECT(fixture.stopSignaled ==
false);
267 BEAST_EXPECT(fixture.stopSignaled ==
true);
277 boost::filesystem::permissions(
279 perms::add_perms | perms::owner_write | perms::others_write |
290 auto perfLog{fixture.perfLog(withFile)};
320 for (
int labelIndex = 0; labelIndex < labels.
size(); ++labelIndex)
322 for (
int idIndex = 0; idIndex < 2; ++idIndex)
326 labels[labelIndex], ids[(labelIndex * 2) + idIndex]);
331 Json::Value const countersJson{perfLog->countersJson()[jss::rpc]};
332 BEAST_EXPECT(countersJson.size() == labels.
size() + 1);
333 for (
auto& label : labels)
337 BEAST_EXPECT(counter[jss::duration_us] ==
"0");
338 BEAST_EXPECT(counter[jss::errored] ==
"0");
339 BEAST_EXPECT(counter[jss::finished] ==
"0");
340 BEAST_EXPECT(counter[jss::started] ==
"2");
343 Json::Value const& total{countersJson[jss::total]};
344 BEAST_EXPECT(total[jss::duration_us] ==
"0");
345 BEAST_EXPECT(total[jss::errored] ==
"0");
346 BEAST_EXPECT(total[jss::finished] ==
"0");
355 BEAST_EXPECT(currents.size() == labels.
size() * 2);
358 for (
int i = 0; i < currents.size(); ++i)
360 BEAST_EXPECT(currents[i].name == labels[i / 2]);
361 BEAST_EXPECT(prevDur > currents[i].dur);
362 prevDur = currents[i].dur;
369 for (
int labelIndex = labels.
size() - 1; labelIndex > 0; --labelIndex)
372 perfLog->rpcFinish(labels[labelIndex], ids[(labelIndex * 2) + 1]);
374 perfLog->rpcError(labels[labelIndex], ids[(labelIndex * 2) + 0]);
376 perfLog->rpcFinish(labels[0], ids[0 + 1]);
379 auto validateFinalCounters = [
this, &labels](
382 Json::Value const& jobQueue = countersJson[jss::job_queue];
384 BEAST_EXPECT(jobQueue.
size() == 0);
388 BEAST_EXPECT(rpc.
size() == labels.
size() + 1);
396 BEAST_EXPECT(first[jss::duration_us] !=
"0");
397 BEAST_EXPECT(first[jss::errored] ==
"0");
398 BEAST_EXPECT(first[jss::finished] ==
"1");
399 BEAST_EXPECT(first[jss::started] ==
"2");
404 for (
int i = 1; i < labels.
size(); ++i)
409 BEAST_EXPECT(dur != 0 && dur < prevDur);
411 BEAST_EXPECT(counter[jss::errored] ==
"1");
412 BEAST_EXPECT(counter[jss::finished] ==
"1");
413 BEAST_EXPECT(counter[jss::started] ==
"2");
418 BEAST_EXPECT(total[jss::duration_us] !=
"0");
426 auto validateFinalCurrent = [
this,
429 Json::Value const& job_queue = currentJson[jss::jobs];
430 BEAST_EXPECT(job_queue.
isArray());
431 BEAST_EXPECT(job_queue.
size() == 0);
434 Json::Value const& methods = currentJson[jss::methods];
435 BEAST_EXPECT(methods.
size() == 1);
436 BEAST_EXPECT(methods.
isArray());
439 BEAST_EXPECT(only.
size() == 2);
441 BEAST_EXPECT(only[jss::duration_us] !=
"0");
442 BEAST_EXPECT(only[jss::method] == labels[0]);
446 validateFinalCounters(perfLog->countersJson());
447 validateFinalCurrent(perfLog->currentJson());
455 auto const fullPath = fixture.logFile();
459 BEAST_EXPECT(!exists(fullPath));
473 lastLine = std::move(line);
483 validateFinalCounters(parsedLastLine[jss::counters]);
484 validateFinalCurrent(parsedLastLine[jss::current_activities]);
496 auto perfLog{fixture.perfLog(withFile)};
507 : type(t), typeName(std::move(name))
516 for (
auto const& job : jobTypes)
525 for (
int i = 0; i < jobs.
size(); ++i)
527 perfLog->jobQueue(jobs[i].type);
529 perfLog->countersJson()[jss::job_queue]};
531 BEAST_EXPECT(jq_counters.size() == i + 2);
532 for (
int j = 0; j <= i; ++j)
536 Json::Value const& counter{jq_counters[jobs[j].typeName]};
537 BEAST_EXPECT(counter.size() == 5);
538 BEAST_EXPECT(counter[jss::queued] ==
"1");
539 BEAST_EXPECT(counter[jss::started] ==
"0");
540 BEAST_EXPECT(counter[jss::finished] ==
"0");
541 BEAST_EXPECT(counter[jss::queued_duration_us] ==
"0");
542 BEAST_EXPECT(counter[jss::running_duration_us] ==
"0");
547 BEAST_EXPECT(total.size() == 5);
548 BEAST_EXPECT(
jsonToUint64(total[jss::queued]) == i + 1);
549 BEAST_EXPECT(total[jss::started] ==
"0");
550 BEAST_EXPECT(total[jss::finished] ==
"0");
551 BEAST_EXPECT(total[jss::queued_duration_us] ==
"0");
552 BEAST_EXPECT(total[jss::running_duration_us] ==
"0");
558 BEAST_EXPECT(
current.size() == 2);
559 BEAST_EXPECT(
current.isMember(jss::jobs));
560 BEAST_EXPECT(
current[jss::jobs].size() == 0);
561 BEAST_EXPECT(
current.isMember(jss::methods));
562 BEAST_EXPECT(
current[jss::methods].size() == 0);
568 perfLog->resizeJobs(jobs.
size() * 2);
574 for (
int i = 0; i < jobs.
size(); ++i)
577 jobs[i].type,
microseconds{i + 1}, steady_clock::now(), i * 2);
582 perfLog->countersJson()[jss::job_queue]};
583 for (
int j = 0; j < jobs.
size(); ++j)
585 Json::Value const& counter{jq_counters[jobs[j].typeName]};
590 BEAST_EXPECT(counter[jss::started] ==
"2");
591 BEAST_EXPECT(queued_dur_us == j + 1);
595 BEAST_EXPECT(counter[jss::started] ==
"1");
596 BEAST_EXPECT(queued_dur_us == j + 1);
600 BEAST_EXPECT(counter[jss::started] ==
"0");
601 BEAST_EXPECT(queued_dur_us == 0);
604 BEAST_EXPECT(counter[jss::queued] ==
"1");
605 BEAST_EXPECT(counter[jss::finished] ==
"0");
606 BEAST_EXPECT(counter[jss::running_duration_us] ==
"0");
612 BEAST_EXPECT(
jsonToUint64(total[jss::started]) == (i * 2) + 1);
613 BEAST_EXPECT(total[jss::finished] ==
"0");
618 (((i * i) + 3 * i + 2) / 2));
619 BEAST_EXPECT(total[jss::running_duration_us] ==
"0");
634 BEAST_EXPECT(currents.size() == (i + 1) * 2);
637 for (
int j = 0; j <= i; ++j)
639 BEAST_EXPECT(currents[j * 2].name == jobs[j].typeName);
640 BEAST_EXPECT(prevDur > currents[j * 2].dur);
641 prevDur = currents[j * 2].dur;
643 BEAST_EXPECT(currents[(j * 2) + 1].name == jobs[j].typeName);
644 BEAST_EXPECT(prevDur > currents[(j * 2) + 1].dur);
645 prevDur = currents[(j * 2) + 1].dur;
650 for (
int i = jobs.
size() - 1; i >= 0; --i)
654 int const finished = ((jobs.
size() - i) * 2) - 1;
660 perfLog->countersJson()[jss::job_queue]};
661 for (
int j = 0; j < jobs.
size(); ++j)
663 Json::Value const& counter{jq_counters[jobs[j].typeName]};
668 BEAST_EXPECT(counter[jss::finished] ==
"0");
669 BEAST_EXPECT(running_dur_us == 0);
673 BEAST_EXPECT(counter[jss::finished] ==
"1");
674 BEAST_EXPECT(running_dur_us == ((jobs.
size() - j) * 2) - 1);
678 BEAST_EXPECT(counter[jss::finished] ==
"2");
679 BEAST_EXPECT(running_dur_us == ((jobs.
size() - j) * 4) - 1);
684 BEAST_EXPECT(queued_dur_us == j + 1);
685 BEAST_EXPECT(counter[jss::queued] ==
"1");
686 BEAST_EXPECT(counter[jss::started] ==
"2");
694 BEAST_EXPECT(
jsonToUint64(total[jss::finished]) == finished);
698 int const queuedDur = ((jobs.
size() * (jobs.
size() + 1)) / 2);
700 jsonToUint64(total[jss::queued_duration_us]) == queuedDur);
703 int const runningDur = ((finished * (finished + 1)) / 2);
717 BEAST_EXPECT(currents.size() == i * 2);
720 for (
int j = 0; j < i; ++j)
722 BEAST_EXPECT(currents[j * 2].name == jobs[j].typeName);
723 BEAST_EXPECT(prevDur > currents[j * 2].dur);
724 prevDur = currents[j * 2].dur;
726 BEAST_EXPECT(currents[(j * 2) + 1].name == jobs[j].typeName);
727 BEAST_EXPECT(prevDur > currents[(j * 2) + 1].dur);
728 prevDur = currents[(j * 2) + 1].dur;
733 auto validateFinalCounters = [
this,
738 BEAST_EXPECT(rpc.
size() == 0);
741 Json::Value const& jobQueue = countersJson[jss::job_queue];
742 for (
int i = jobs.
size() - 1; i >= 0; --i)
744 Json::Value const& counter{jobQueue[jobs[i].typeName]};
747 BEAST_EXPECT(running_dur_us == ((jobs.
size() - i) * 4) - 1);
751 BEAST_EXPECT(queued_dur_us == i + 1);
753 BEAST_EXPECT(counter[jss::queued] ==
"1");
754 BEAST_EXPECT(counter[jss::started] ==
"2");
755 BEAST_EXPECT(counter[jss::finished] ==
"2");
760 int const finished = jobs.
size() * 2;
762 BEAST_EXPECT(
jsonToUint64(total[jss::started]) == finished);
763 BEAST_EXPECT(
jsonToUint64(total[jss::finished]) == finished);
767 int const queuedDur = ((jobs.
size() * (jobs.
size() + 1)) / 2);
769 jsonToUint64(total[jss::queued_duration_us]) == queuedDur);
772 int const runningDur = ((finished * (finished + 1)) / 2);
774 jsonToUint64(total[jss::running_duration_us]) == runningDur);
777 auto validateFinalCurrent = [
this](
Json::Value const& currentJson) {
781 BEAST_EXPECT(j.
size() == 0);
784 Json::Value const& methods = currentJson[jss::methods];
785 BEAST_EXPECT(methods.
size() == 0);
786 BEAST_EXPECT(methods.
isArray());
790 validateFinalCounters(perfLog->countersJson());
791 validateFinalCurrent(perfLog->currentJson());
800 auto const fullPath = fixture.logFile();
804 BEAST_EXPECT(!exists(fullPath));
818 lastLine = std::move(line);
828 validateFinalCounters(parsedLastLine[jss::counters]);
829 validateFinalCurrent(parsedLastLine[jss::current_activities]);
843 auto perfLog{fixture.perfLog(withFile)};
853 auto iter{jobTypes.begin()};
856 jobType = iter->second.type();
857 jobTypeName = iter->second.name();
861 perfLog->resizeJobs(1);
864 auto verifyCounters = [
this, jobTypeName](
870 BEAST_EXPECT(countersJson.
isObject());
871 BEAST_EXPECT(countersJson.
size() == 2);
873 BEAST_EXPECT(countersJson.
isMember(jss::rpc));
874 BEAST_EXPECT(countersJson[jss::rpc].isObject());
875 BEAST_EXPECT(countersJson[jss::rpc].size() == 0);
877 BEAST_EXPECT(countersJson.
isMember(jss::job_queue));
878 BEAST_EXPECT(countersJson[jss::job_queue].isObject());
879 BEAST_EXPECT(countersJson[jss::job_queue].size() == 1);
882 countersJson[jss::job_queue][jobTypeName]};
884 BEAST_EXPECT(job.isObject());
886 BEAST_EXPECT(
jsonToUint64(job[jss::started]) == started);
887 BEAST_EXPECT(
jsonToUint64(job[jss::finished]) == finished);
890 jsonToUint64(job[jss::queued_duration_us]) == queued_us);
892 jsonToUint64(job[jss::running_duration_us]) == running_us);
897 auto verifyEmptyCurrent = [
this](
Json::Value const& currentJson) {
898 BEAST_EXPECT(currentJson.isObject());
899 BEAST_EXPECT(currentJson.size() == 2);
901 BEAST_EXPECT(currentJson.isMember(jss::jobs));
902 BEAST_EXPECT(currentJson[jss::jobs].isArray());
903 BEAST_EXPECT(currentJson[jss::jobs].size() == 0);
905 BEAST_EXPECT(currentJson.isMember(jss::methods));
906 BEAST_EXPECT(currentJson[jss::methods].isArray());
907 BEAST_EXPECT(currentJson[jss::methods].size() == 0);
911 perfLog->jobStart(jobType,
microseconds{11}, steady_clock::now(), 2);
913 verifyCounters(perfLog->countersJson(), 1, 0, 11, 0);
914 verifyEmptyCurrent(perfLog->currentJson());
917 perfLog->jobStart(jobType,
microseconds{13}, steady_clock::now(), -1);
919 verifyCounters(perfLog->countersJson(), 2, 0, 24, 0);
920 verifyEmptyCurrent(perfLog->currentJson());
925 verifyCounters(perfLog->countersJson(), 2, 1, 24, 17);
926 verifyEmptyCurrent(perfLog->currentJson());
931 verifyCounters(perfLog->countersJson(), 2, 2, 24, 36);
932 verifyEmptyCurrent(perfLog->currentJson());
941 auto const fullPath = fixture.logFile();
945 BEAST_EXPECT(!exists(fullPath));
959 lastLine = std::move(line);
969 verifyCounters(parsedLastLine[jss::counters], 2, 2, 24, 36);
970 verifyEmptyCurrent(parsedLastLine[jss::current_activities]);