zcashd/src/gtest/test_metrics.cpp

194 lines
7.5 KiB
C++

#include <gtest/gtest.h>
#include "metrics.h"
#include "util/test.h"
#include "util/time.h"
#include <chrono>
TEST(Metrics, AtomicTimer) {
FixedClock::SetGlobal();
AtomicTimer t;
FixedClock::Instance()->Set(std::chrono::seconds(100));
EXPECT_FALSE(t.running());
t.start();
EXPECT_TRUE(t.running());
t.start();
EXPECT_TRUE(t.running());
t.stop();
EXPECT_TRUE(t.running());
t.stop();
EXPECT_FALSE(t.running());
// Additional calls to stop() are ignored.
t.stop();
EXPECT_FALSE(t.running());
t.start();
EXPECT_TRUE(t.running());
AtomicCounter c;
EXPECT_EQ(0, t.rate(c));
c.increment();
EXPECT_EQ(0, t.rate(c));
FixedClock::Instance()->Set(std::chrono::seconds(101));
EXPECT_EQ(1, t.rate(c));
c.decrement();
EXPECT_EQ(0, t.rate(c));
FixedClock::Instance()->Set(std::chrono::seconds(102));
EXPECT_EQ(0, t.rate(c));
c.increment();
EXPECT_EQ(0.5, t.rate(c));
t.stop();
EXPECT_FALSE(t.running());
EXPECT_EQ(0.5, t.rate(c));
SystemClock::SetGlobal();
}
TEST(Metrics, GetLocalSolPS) {
FixedClock::SetGlobal();
FixedClock::Instance()->Set(std::chrono::seconds(100));
miningTimer.start();
// No time has passed
EXPECT_EQ(0, GetLocalSolPS());
// Increment time
FixedClock::Instance()->Set(std::chrono::seconds(101));
EXPECT_EQ(0, GetLocalSolPS());
// Increment solutions
solutionTargetChecks.increment();
EXPECT_EQ(1, GetLocalSolPS());
// Increment time
FixedClock::Instance()->Set(std::chrono::seconds(102));
EXPECT_EQ(0.5, GetLocalSolPS());
// Increment solutions
solutionTargetChecks.increment();
solutionTargetChecks.increment();
EXPECT_EQ(1.5, GetLocalSolPS());
// Stop timing
miningTimer.stop();
EXPECT_EQ(1.5, GetLocalSolPS());
// Increment time
FixedClock::Instance()->Set(std::chrono::seconds(103));
EXPECT_EQ(1.5, GetLocalSolPS());
// Start timing again
miningTimer.start();
EXPECT_EQ(1.5, GetLocalSolPS());
// Increment time
FixedClock::Instance()->Set(std::chrono::seconds(104));
EXPECT_EQ(1, GetLocalSolPS());
miningTimer.stop();
miningTimer.zeroize();
solutionTargetChecks.decrement();
solutionTargetChecks.decrement();
solutionTargetChecks.decrement();
SystemClock::SetGlobal();
}
TEST(Metrics, EstimateNetHeight) {
FixedClock::SetGlobal();
auto params = RegtestActivateBlossom(false, 200).GetConsensus();
int64_t blockTimes[400];
for (int i = 0; i < 400; i++) {
blockTimes[i] = i ? blockTimes[i - 1] + params.PoWTargetSpacing(i) : 0;
}
FixedClock::Instance()->Set(std::chrono::seconds(blockTimes[399]));
for (int i = 0; i < 400; i++) {
// Check that we are within 1 of the correct height
EXPECT_LT(std::abs(399 - EstimateNetHeight(params, i, blockTimes[i])), 2);
}
RegtestDeactivateBlossom();
SystemClock::SetGlobal();
}
TEST(Metrics, NextUpgrade) {
SelectParams(CBaseChainParams::REGTEST);
const Consensus::Params& params = Params().GetConsensus();
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, 100);
EXPECT_EQ(SecondsLeftToNextEpoch(params, 1).value(), 14850);
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(params, 1).value(), DurationFormat::REDUCED), "4 hours");
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(params, 1).value(), DurationFormat::FULL), "4 hours, 7 minutes, 30 seconds");
EXPECT_EQ(SecondsLeftToNextEpoch(params, 90).value(), 1500);
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(params, 90).value(), DurationFormat::REDUCED), "25 minutes");
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(params, 90).value(), DurationFormat::FULL), "25 minutes, 0 seconds");
EXPECT_EQ(SecondsLeftToNextEpoch(params, 99).value(), 150);
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(params, 99).value(), DurationFormat::REDUCED), "2 minutes");
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(params, 99).value(), DurationFormat::FULL), "2 minutes, 30 seconds");
auto paramsBlossom = RegtestActivateBlossom(true).GetConsensus();
EXPECT_EQ(SecondsLeftToNextEpoch(paramsBlossom, 1).value(), 7425);
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(paramsBlossom, 1).value(), DurationFormat::REDUCED), "2 hours");
EXPECT_EQ(DisplayDuration(SecondsLeftToNextEpoch(paramsBlossom, 1).value(), DurationFormat::FULL), "2 hours, 3 minutes, 45 seconds");
RegtestDeactivateBlossom();
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
}
TEST(Metrics, DisplayFunctions) {
EXPECT_EQ(DisplayDuration(0, DurationFormat::REDUCED), "0 seconds");
EXPECT_EQ(DisplayDuration(59, DurationFormat::REDUCED), "59 seconds");
EXPECT_EQ(DisplayDuration(60, DurationFormat::REDUCED), "1 minutes");
EXPECT_EQ(DisplayDuration(61, DurationFormat::REDUCED), "1 minutes");
EXPECT_EQ(DisplayDuration(3599, DurationFormat::REDUCED), "59 minutes");
EXPECT_EQ(DisplayDuration(3600, DurationFormat::REDUCED), "1 hours");
EXPECT_EQ(DisplayDuration(86399, DurationFormat::REDUCED), "23 hours");
EXPECT_EQ(DisplayDuration(86400, DurationFormat::REDUCED), "1 days");
EXPECT_EQ(DisplayDuration(8640000, DurationFormat::REDUCED), "100 days");
EXPECT_EQ(DisplayDuration(185542587100800, DurationFormat::REDUCED), "2147483647 days");
EXPECT_EQ(DisplayDuration(185542587187199, DurationFormat::REDUCED), "2147483647 days");
EXPECT_EQ(DisplayDuration(0, DurationFormat::FULL), "0 seconds");
EXPECT_EQ(DisplayDuration(59, DurationFormat::FULL), "59 seconds");
EXPECT_EQ(DisplayDuration(60, DurationFormat::FULL), "1 minutes, 0 seconds");
EXPECT_EQ(DisplayDuration(61, DurationFormat::FULL), "1 minutes, 1 seconds");
EXPECT_EQ(DisplayDuration(3599, DurationFormat::FULL), "59 minutes, 59 seconds");
EXPECT_EQ(DisplayDuration(3600, DurationFormat::FULL), "1 hours, 0 minutes, 0 seconds");
EXPECT_EQ(DisplayDuration(86399, DurationFormat::FULL), "23 hours, 59 minutes, 59 seconds");
EXPECT_EQ(DisplayDuration(86400, DurationFormat::FULL), "1 days, 0 hours, 0 minutes, 0 seconds");
EXPECT_EQ(DisplayDuration(8640000, DurationFormat::FULL), "100 days, 0 hours, 0 minutes, 0 seconds");
EXPECT_EQ(DisplayDuration(185542587100800, DurationFormat::FULL), "2147483647 days, 0 hours, 0 minutes, 0 seconds");
EXPECT_EQ(DisplayDuration(185542587187199, DurationFormat::FULL), "2147483647 days, 23 hours, 59 minutes, 59 seconds");
EXPECT_EQ(DisplaySize(0), "0 Bytes");
EXPECT_EQ(DisplaySize(123), "123 Bytes");
EXPECT_EQ(DisplaySize(123456), "120.56 KiB");
EXPECT_EQ(DisplaySize(123456789), "117.74 MiB");
EXPECT_EQ(DisplaySize(123456789012), "114.98 GiB");
EXPECT_EQ(DisplaySize(1234567890123), "1.12 TiB");
EXPECT_EQ(DisplaySize(INT64_MAX), "8388608.00 TiB");
EXPECT_EQ(DisplayHashRate(0.0), "0.000 Sol/s");
EXPECT_EQ(DisplayHashRate(0.1234), "0.123 Sol/s");
EXPECT_EQ(DisplayHashRate(123.45), "123.450 Sol/s");
EXPECT_EQ(DisplayHashRate(1234.5), "1.234 kSol/s");
EXPECT_EQ(DisplayHashRate(1234567.8), "1.235 MSol/s");
EXPECT_EQ(DisplayHashRate(1234567890.1), "1.235 GSol/s");
EXPECT_EQ(DisplayHashRate(1234567890123.4), "1.235 TSol/s");
}