310 auto perfLog{fixture.
perfLog(withFile)};
335 for (
int labelIndex = 0; labelIndex < labels.
size(); ++labelIndex)
337 for (
int idIndex = 0; idIndex < 2; ++idIndex)
340 perfLog->rpcStart(labels[labelIndex], ids[(labelIndex * 2) + idIndex]);
345 json::Value const countersJson{perfLog->countersJson()[jss::rpc]};
346 BEAST_EXPECT(countersJson.
size() == labels.
size() + 1);
347 for (
auto& label : labels)
351 BEAST_EXPECT(counter[jss::duration_us] ==
"0");
352 BEAST_EXPECT(counter[jss::errored] ==
"0");
353 BEAST_EXPECT(counter[jss::finished] ==
"0");
354 BEAST_EXPECT(counter[jss::started] ==
"2");
357 json::Value const& total{countersJson[jss::total]};
358 BEAST_EXPECT(total[jss::duration_us] ==
"0");
359 BEAST_EXPECT(total[jss::errored] ==
"0");
360 BEAST_EXPECT(total[jss::finished] ==
"0");
368 BEAST_EXPECT(currents.
size() == labels.
size() * 2);
371 for (
int i = 0; i < currents.
size(); ++i)
373 BEAST_EXPECT(currents[i].name == labels[i / 2]);
374 BEAST_EXPECT(prevDur > currents[i].dur);
375 prevDur = currents[i].dur;
382 for (
int labelIndex = labels.
size() - 1; labelIndex > 0; --labelIndex)
385 perfLog->rpcFinish(labels[labelIndex], ids[(labelIndex * 2) + 1]);
387 perfLog->rpcError(labels[labelIndex], ids[(labelIndex * 2) + 0]);
389 perfLog->rpcFinish(labels[0], ids[0 + 1]);
392 auto validateFinalCounters = [
this, &labels](
json::Value const& countersJson) {
394 json::Value const& jobQueue = countersJson[jss::job_queue];
396 BEAST_EXPECT(jobQueue.
size() == 0);
400 BEAST_EXPECT(rpc.
size() == labels.
size() + 1);
408 BEAST_EXPECT(first[jss::duration_us] !=
"0");
409 BEAST_EXPECT(first[jss::errored] ==
"0");
410 BEAST_EXPECT(first[jss::finished] ==
"1");
411 BEAST_EXPECT(first[jss::started] ==
"2");
416 for (
int i = 1; i < labels.
size(); ++i)
420 BEAST_EXPECT(dur != 0 && dur < prevDur);
422 BEAST_EXPECT(counter[jss::errored] ==
"1");
423 BEAST_EXPECT(counter[jss::finished] ==
"1");
424 BEAST_EXPECT(counter[jss::started] ==
"2");
429 BEAST_EXPECT(total[jss::duration_us] !=
"0");
435 auto validateFinalCurrent = [
this, &labels](
json::Value const& currentJson) {
437 json::Value const& jobQueue = currentJson[jss::jobs];
438 BEAST_EXPECT(jobQueue.
isArray());
439 BEAST_EXPECT(jobQueue.
size() == 0);
442 json::Value const& methods = currentJson[jss::methods];
443 BEAST_EXPECT(methods.
size() == 1);
444 BEAST_EXPECT(methods.
isArray());
447 BEAST_EXPECT(only.
size() == 2);
449 BEAST_EXPECT(only[jss::duration_us] !=
"0");
450 BEAST_EXPECT(only[jss::method] == labels[0]);
454 validateFinalCounters(perfLog->countersJson());
455 validateFinalCurrent(perfLog->currentJson());
463 auto const fullPath = fixture.
logFile();
467 BEAST_EXPECT(!exists(fullPath));
481 lastLine = std::move(line);
493 validateFinalCounters(parsedLastLine[jss::counters]);
494 validateFinalCurrent(parsedLastLine[jss::current_activities]);
506 auto perfLog{fixture.
perfLog(withFile)};
525 for (
auto const& job : jobTypes)
534 for (
int i = 0; i < jobs.
size(); ++i)
536 perfLog->jobQueue(jobs[i].type);
537 json::Value const jqCounters{perfLog->countersJson()[jss::job_queue]};
539 BEAST_EXPECT(jqCounters.
size() == i + 2);
540 for (
int j = 0; j <= i; ++j)
544 json::Value const& counter{jqCounters[jobs[j].typeName]};
545 BEAST_EXPECT(counter.
size() == 5);
546 BEAST_EXPECT(counter[jss::queued] ==
"1");
547 BEAST_EXPECT(counter[jss::started] ==
"0");
548 BEAST_EXPECT(counter[jss::finished] ==
"0");
549 BEAST_EXPECT(counter[jss::queued_duration_us] ==
"0");
550 BEAST_EXPECT(counter[jss::running_duration_us] ==
"0");
555 BEAST_EXPECT(total.
size() == 5);
556 BEAST_EXPECT(
jsonToUInt64(total[jss::queued]) == i + 1);
557 BEAST_EXPECT(total[jss::started] ==
"0");
558 BEAST_EXPECT(total[jss::finished] ==
"0");
559 BEAST_EXPECT(total[jss::queued_duration_us] ==
"0");
560 BEAST_EXPECT(total[jss::running_duration_us] ==
"0");
566 BEAST_EXPECT(current.
size() == 2);
567 BEAST_EXPECT(current.
isMember(jss::jobs));
568 BEAST_EXPECT(current[jss::jobs].
size() == 0);
569 BEAST_EXPECT(current.
isMember(jss::methods));
570 BEAST_EXPECT(current[jss::methods].
size() == 0);
576 perfLog->resizeJobs(jobs.
size() * 2);
582 for (
int i = 0; i < jobs.
size(); ++i)
588 json::Value const jqCounters{perfLog->countersJson()[jss::job_queue]};
589 for (
int j = 0; j < jobs.
size(); ++j)
591 json::Value const& counter{jqCounters[jobs[j].typeName]};
595 BEAST_EXPECT(counter[jss::started] ==
"2");
596 BEAST_EXPECT(queuedDurUs == j + 1);
600 BEAST_EXPECT(counter[jss::started] ==
"1");
601 BEAST_EXPECT(queuedDurUs == j + 1);
605 BEAST_EXPECT(counter[jss::started] ==
"0");
606 BEAST_EXPECT(queuedDurUs == 0);
609 BEAST_EXPECT(counter[jss::queued] ==
"1");
610 BEAST_EXPECT(counter[jss::finished] ==
"0");
611 BEAST_EXPECT(counter[jss::running_duration_us] ==
"0");
617 BEAST_EXPECT(
jsonToUInt64(total[jss::started]) == (i * 2) + 1);
618 BEAST_EXPECT(total[jss::finished] ==
"0");
622 jsonToUInt64(total[jss::queued_duration_us]) == (((i * i) + (3 * i) + 2) / 2));
623 BEAST_EXPECT(total[jss::running_duration_us] ==
"0");
633 BEAST_EXPECT(currents.size() == (i + 1) * 2);
636 for (
int j = 0; j <= i; ++j)
638 BEAST_EXPECT(currents[j * 2].name == jobs[j].typeName);
639 BEAST_EXPECT(prevDur > currents[j * 2].dur);
640 prevDur = currents[j * 2].dur;
642 BEAST_EXPECT(currents[(j * 2) + 1].name == jobs[j].typeName);
643 BEAST_EXPECT(prevDur > currents[(j * 2) + 1].dur);
644 prevDur = currents[(j * 2) + 1].dur;
649 for (
int i = jobs.
size() - 1; i >= 0; --i)
653 int const finished = ((jobs.
size() - i) * 2) - 1;
654 perfLog->jobFinish(jobs[i].type,
microseconds(finished), (i * 2) + 1);
657 json::Value const jqCounters{perfLog->countersJson()[jss::job_queue]};
658 for (
int j = 0; j < jobs.
size(); ++j)
660 json::Value const& counter{jqCounters[jobs[j].typeName]};
664 BEAST_EXPECT(counter[jss::finished] ==
"0");
665 BEAST_EXPECT(runningDurUs == 0);
669 BEAST_EXPECT(counter[jss::finished] ==
"1");
670 BEAST_EXPECT(runningDurUs == ((jobs.
size() - j) * 2) - 1);
674 BEAST_EXPECT(counter[jss::finished] ==
"2");
675 BEAST_EXPECT(runningDurUs == ((jobs.
size() - j) * 4) - 1);
679 BEAST_EXPECT(queuedDurUs == j + 1);
680 BEAST_EXPECT(counter[jss::queued] ==
"1");
681 BEAST_EXPECT(counter[jss::started] ==
"2");
688 BEAST_EXPECT(
jsonToUInt64(total[jss::finished]) == finished);
692 int const queuedDur = ((jobs.
size() * (jobs.
size() + 1)) / 2);
693 BEAST_EXPECT(
jsonToUInt64(total[jss::queued_duration_us]) == queuedDur);
696 int const runningDur = ((finished * (finished + 1)) / 2);
697 BEAST_EXPECT(
jsonToUInt64(total[jss::running_duration_us]) == runningDur);
700 perfLog->jobFinish(jobs[i].type,
microseconds(finished + 1), (i * 2));
706 BEAST_EXPECT(currents.
size() == i * 2);
709 for (
int j = 0; j < i; ++j)
711 BEAST_EXPECT(currents[j * 2].name == jobs[j].typeName);
712 BEAST_EXPECT(prevDur > currents[j * 2].dur);
713 prevDur = currents[j * 2].dur;
715 BEAST_EXPECT(currents[(j * 2) + 1].name == jobs[j].typeName);
716 BEAST_EXPECT(prevDur > currents[(j * 2) + 1].dur);
717 prevDur = currents[(j * 2) + 1].dur;
722 auto validateFinalCounters = [
this, &jobs](
json::Value const& countersJson) {
726 BEAST_EXPECT(rpc.
size() == 0);
729 json::Value const& jobQueue = countersJson[jss::job_queue];
730 for (
int i = jobs.
size() - 1; i >= 0; --i)
732 json::Value const& counter{jobQueue[jobs[i].typeName]};
734 BEAST_EXPECT(runningDurUs == ((jobs.
size() - i) * 4) - 1);
737 BEAST_EXPECT(queuedDurUs == i + 1);
739 BEAST_EXPECT(counter[jss::queued] ==
"1");
740 BEAST_EXPECT(counter[jss::started] ==
"2");
741 BEAST_EXPECT(counter[jss::finished] ==
"2");
746 int const finished = jobs.
size() * 2;
748 BEAST_EXPECT(
jsonToUInt64(total[jss::started]) == finished);
749 BEAST_EXPECT(
jsonToUInt64(total[jss::finished]) == finished);
753 int const queuedDur = ((jobs.
size() * (jobs.
size() + 1)) / 2);
754 BEAST_EXPECT(
jsonToUInt64(total[jss::queued_duration_us]) == queuedDur);
757 int const runningDur = ((finished * (finished + 1)) / 2);
758 BEAST_EXPECT(
jsonToUInt64(total[jss::running_duration_us]) == runningDur);
761 auto validateFinalCurrent = [
this](
json::Value const& currentJson) {
765 BEAST_EXPECT(j.
size() == 0);
768 json::Value const& methods = currentJson[jss::methods];
769 BEAST_EXPECT(methods.
size() == 0);
770 BEAST_EXPECT(methods.
isArray());
774 validateFinalCounters(perfLog->countersJson());
775 validateFinalCurrent(perfLog->currentJson());
784 auto const fullPath = fixture.
logFile();
788 BEAST_EXPECT(!exists(fullPath));
802 lastLine = std::move(line);
814 validateFinalCounters(parsedLastLine[jss::counters]);
815 validateFinalCurrent(parsedLastLine[jss::current_activities]);
829 auto perfLog{fixture.
perfLog(withFile)};
839 auto iter{jobTypes.begin()};
842 jobType = iter->second.type();
843 jobTypeName = iter->second.name();
847 perfLog->resizeJobs(1);
850 auto verifyCounters = [
this, jobTypeName](
856 BEAST_EXPECT(countersJson.
isObject());
857 BEAST_EXPECT(countersJson.
size() == 2);
859 BEAST_EXPECT(countersJson.
isMember(jss::rpc));
860 BEAST_EXPECT(countersJson[jss::rpc].isObject());
861 BEAST_EXPECT(countersJson[jss::rpc].
size() == 0);
863 BEAST_EXPECT(countersJson.
isMember(jss::job_queue));
864 BEAST_EXPECT(countersJson[jss::job_queue].isObject());
865 BEAST_EXPECT(countersJson[jss::job_queue].
size() == 1);
867 json::Value const& job{countersJson[jss::job_queue][jobTypeName]};
871 BEAST_EXPECT(
jsonToUInt64(job[jss::started]) == started);
872 BEAST_EXPECT(
jsonToUInt64(job[jss::finished]) == finished);
874 BEAST_EXPECT(
jsonToUInt64(job[jss::queued_duration_us]) == queuedUs);
875 BEAST_EXPECT(
jsonToUInt64(job[jss::running_duration_us]) == runningUs);
880 auto verifyEmptyCurrent = [
this](
json::Value const& currentJson) {
881 BEAST_EXPECT(currentJson.isObject());
882 BEAST_EXPECT(currentJson.size() == 2);
884 BEAST_EXPECT(currentJson.isMember(jss::jobs));
885 BEAST_EXPECT(currentJson[jss::jobs].isArray());
886 BEAST_EXPECT(currentJson[jss::jobs].
size() == 0);
888 BEAST_EXPECT(currentJson.isMember(jss::methods));
889 BEAST_EXPECT(currentJson[jss::methods].isArray());
890 BEAST_EXPECT(currentJson[jss::methods].
size() == 0);
896 verifyCounters(perfLog->countersJson(), 1, 0, 11, 0);
897 verifyEmptyCurrent(perfLog->currentJson());
902 verifyCounters(perfLog->countersJson(), 2, 0, 24, 0);
903 verifyEmptyCurrent(perfLog->currentJson());
908 verifyCounters(perfLog->countersJson(), 2, 1, 24, 17);
909 verifyEmptyCurrent(perfLog->currentJson());
914 verifyCounters(perfLog->countersJson(), 2, 2, 24, 36);
915 verifyEmptyCurrent(perfLog->currentJson());
924 auto const fullPath = fixture.
logFile();
928 BEAST_EXPECT(!exists(fullPath));
942 lastLine = std::move(line);
954 verifyCounters(parsedLastLine[jss::counters], 2, 2, 24, 36);
955 verifyEmptyCurrent(parsedLastLine[jss::current_activities]);