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]);