blob: 316d764db31b25209fe19ca180b37f9c70547242 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/lib/system_monitor/dockyard/dockyard.h"
#include "garnet/lib/system_monitor/dockyard/test_sample_generator.h"
#include "gtest/gtest.h"
namespace dockyard {
namespace {
class SystemMonitorDockyardTest : public ::testing::Test {
public:
void SetUp() {
// Initialize to distinct values for testing.
name_call_count_ = 100; // Arbitrary.
sets_call_count_ = 200; // Arbitrary.
EXPECT_EQ(nullptr, dockyard_.SetDockyardPathsHandler(std::bind(
&SystemMonitorDockyardTest::TestPathsCallback, this,
std::placeholders::_1, std::placeholders::_2)));
EXPECT_EQ(nullptr, dockyard_.SetStreamSetsHandler(std::bind(
&SystemMonitorDockyardTest::TestStreamSetsCallback,
this, std::placeholders::_1)));
// Add some samples.
dockyard_.AddSamples(dockyard_.GetDockyardId("cpu0"),
{{10ULL, 8ULL}, {200ULL, 10ULL}, {300ULL, 20ULL}});
dockyard_.AddSamples(dockyard_.GetDockyardId("cpu1"), {{10ULL, 3ULL},
{20ULL, 4ULL},
{80ULL, 5ULL},
{81ULL, 50ULL},
{100ULL, 10ULL},
{200ULL, 100ULL},
{300ULL, 80ULL},
{400ULL, 100ULL},
{500ULL, 50ULL}});
dockyard_.AddSamples(
dockyard_.GetDockyardId("cpu2"),
{
{100ULL, 3ULL}, {105ULL, 4ULL}, {110ULL, 5ULL}, {115ULL, 50ULL},
{120ULL, 90ULL}, {125ULL, 100ULL}, {130ULL, 80ULL}, {135ULL, 45ULL},
{140ULL, 44ULL}, {150ULL, 40ULL}, {155ULL, 30ULL}, {160ULL, 12ULL},
{165ULL, 10ULL}, {170ULL, 8ULL}, {175ULL, 5ULL}, {180ULL, 3ULL},
{185ULL, 5ULL}, {190ULL, 15ULL}, {195ULL, 50ULL},
});
dockyard_.AddSamples(dockyard_.GetDockyardId("cpu3"), {{100ULL, 103ULL},
{105ULL, 104ULL},
{110ULL, 107ULL},
{115ULL, 112ULL},
{120ULL, 112ULL},
{130ULL, 122ULL},
{135ULL, 127ULL},
{140ULL, 130ULL},
{150ULL, 132ULL},
{165ULL, 132ULL},
{170ULL, 133ULL},
{175ULL, 135ULL},
{180ULL, 138ULL},
{185ULL, 142ULL},
{190ULL, 147ULL},
{195ULL, 148ULL}});
}
void TestPathsCallback(const std::vector<PathInfo>& add,
const std::vector<uint32_t>& remove) {
++name_call_count_;
}
void TestStreamSetsCallback(const StreamSetsResponse& response) {
++sets_call_count_;
response_ = response;
}
int32_t name_call_count_;
int32_t sets_call_count_;
Dockyard dockyard_;
StreamSetsResponse response_;
};
TEST_F(SystemMonitorDockyardTest, NameCallback) {
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(200, sets_call_count_);
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SetsCallback) {
// No pending requests.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(200, sets_call_count_);
}
TEST_F(SystemMonitorDockyardTest, SlopeValuesMono) {
constexpr uint64_t SAMPLE_COUNT = 20;
RandomSampleGenerator gen;
gen.dockyard_id = dockyard_.GetDockyardId("fake0");
gen.seed = 1234;
gen.time_style = RandomSampleGenerator::TIME_STYLE_LINEAR;
gen.start = 100;
gen.finish = 500;
gen.value_style = RandomSampleGenerator::VALUE_STYLE_MONO_INCREASE;
gen.value_min = 10;
gen.value_max = 100;
gen.sample_count = SAMPLE_COUNT / 4;
GenerateRandomSamples(gen, &dockyard_);
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 500;
request.flags = StreamSetsRequest::SLOPE;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::HIGHEST_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("fake0"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(0ULL, response_.lowest_value);
EXPECT_EQ(dockyard::SLOPE_LIMIT, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(500000ULL, response_.data_sets[0][0]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][1]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][2]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][3]);
EXPECT_EQ(225000ULL, response_.data_sets[0][4]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][5]);
}
TEST_F(SystemMonitorDockyardTest, SlopeCpu3Highest) {
constexpr uint64_t SAMPLE_COUNT = 20;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.flags = StreamSetsRequest::SLOPE;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::HIGHEST_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu3"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(0ULL, response_.lowest_value);
EXPECT_EQ(1000000ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(20600000ULL, response_.data_sets[0][0]);
EXPECT_EQ(200000ULL, response_.data_sets[0][1]);
EXPECT_EQ(600000ULL, response_.data_sets[0][2]);
EXPECT_EQ(1000000ULL, response_.data_sets[0][3]);
EXPECT_EQ(0ULL, response_.data_sets[0][4]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][5]);
EXPECT_EQ(1000000ULL, response_.data_sets[0][6]);
EXPECT_EQ(1000000ULL, response_.data_sets[0][7]);
EXPECT_EQ(600000ULL, response_.data_sets[0][8]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][9]);
EXPECT_EQ(200000ULL, response_.data_sets[0][10]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][11]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][12]);
EXPECT_EQ(0ULL, response_.data_sets[0][13]);
EXPECT_EQ(200000ULL, response_.data_sets[0][14]);
EXPECT_EQ(400000ULL, response_.data_sets[0][15]);
EXPECT_EQ(600000ULL, response_.data_sets[0][16]);
EXPECT_EQ(800000ULL, response_.data_sets[0][17]);
EXPECT_EQ(1000000ULL, response_.data_sets[0][18]);
EXPECT_EQ(200000ULL, response_.data_sets[0][19]);
}
TEST_F(SystemMonitorDockyardTest, SlopeCpu3Average) {
constexpr uint64_t SAMPLE_COUNT = 7;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.flags = StreamSetsRequest::SLOPE;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu3"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(0ULL, response_.lowest_value);
EXPECT_EQ(1000000ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(7428571ULL, response_.data_sets[0][0]);
EXPECT_EQ(571428ULL, response_.data_sets[0][1]);
EXPECT_EQ(1000000ULL, response_.data_sets[0][2]);
EXPECT_EQ(428571ULL, response_.data_sets[0][3]);
EXPECT_EQ(0ULL, response_.data_sets[0][4]);
EXPECT_EQ(285714ULL, response_.data_sets[0][5]);
EXPECT_EQ(642857ULL, response_.data_sets[0][6]);
}
TEST_F(SystemMonitorDockyardTest, RawPastEndResponse) {
constexpr uint64_t SAMPLE_COUNT = 10;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 0;
request.end_time_ns = 1000;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu0"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(8ULL, response_.lowest_value);
EXPECT_EQ(20ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(8ULL, response_.data_sets[0][0]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][1]);
EXPECT_EQ(10ULL, response_.data_sets[0][2]);
EXPECT_EQ(20ULL, response_.data_sets[0][3]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][4]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][5]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][6]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][7]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][8]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][9]);
}
TEST_F(SystemMonitorDockyardTest, RawSparseResponse) {
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 0;
request.end_time_ns = 300;
request.sample_count = 10;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu0"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(8ULL, response_.lowest_value);
EXPECT_EQ(20ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(10UL, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(8ULL, response_.data_sets[0][0]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][1]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][2]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][3]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][4]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][5]);
EXPECT_EQ(10ULL, response_.data_sets[0][6]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][7]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][8]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][9]);
}
TEST_F(SystemMonitorDockyardTest, RawDataSetsCpu1) {
constexpr uint64_t SAMPLE_COUNT = 10;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 50;
request.end_time_ns = 450;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(27ULL, response_.data_sets[0][0]);
EXPECT_EQ(10ULL, response_.data_sets[0][1]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][2]);
EXPECT_EQ(100ULL, response_.data_sets[0][3]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][4]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][5]);
EXPECT_EQ(80ULL, response_.data_sets[0][6]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][7]);
EXPECT_EQ(100ULL, response_.data_sets[0][8]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][9]);
}
TEST_F(SystemMonitorDockyardTest, RawDataSetsCpu2) {
constexpr uint64_t SAMPLE_COUNT = 5;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(15ULL, response_.data_sets[0][0]);
EXPECT_EQ(78ULL, response_.data_sets[0][1]);
EXPECT_EQ(38ULL, response_.data_sets[0][2]);
EXPECT_EQ(8ULL, response_.data_sets[0][3]);
EXPECT_EQ(18ULL, response_.data_sets[0][4]);
}
TEST_F(SystemMonitorDockyardTest, RawDataSetsCpus012) {
constexpr uint64_t SAMPLE_COUNT = 2;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu0"));
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(3UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[1].size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[2].size());
// Check the samples themselves.
// CPU 0.
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][0]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[0][1]);
// CPU 1.
EXPECT_EQ(10ULL, response_.data_sets[1][0]);
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[1][1]);
// CPU 2.
EXPECT_EQ(46ULL, response_.data_sets[2][0]);
EXPECT_EQ(17ULL, response_.data_sets[2][1]);
}
TEST_F(SystemMonitorDockyardTest, HighDataSetsCpus12) {
constexpr uint64_t SAMPLE_COUNT = 2;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 20;
request.end_time_ns = 150;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::HIGHEST_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(2UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
// CPU 1.
EXPECT_EQ(50ULL, response_.data_sets[0][0]);
EXPECT_EQ(10ULL, response_.data_sets[0][1]);
// CPU 2.
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[1][0]);
EXPECT_EQ(100ULL, response_.data_sets[1][1]);
}
TEST_F(SystemMonitorDockyardTest, LowDataSetsCpus12) {
constexpr uint64_t SAMPLE_COUNT = 2;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 20;
request.end_time_ns = 150;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::LOWEST_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(2UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
// CPU 1.
EXPECT_EQ(4ULL, response_.data_sets[0][0]);
EXPECT_EQ(10ULL, response_.data_sets[0][1]);
// CPU 2.
EXPECT_EQ(dockyard::NO_DATA, response_.data_sets[1][0]);
EXPECT_EQ(3ULL, response_.data_sets[1][1]);
}
TEST_F(SystemMonitorDockyardTest, NormalizedDataSetsCpu2) {
constexpr uint64_t SAMPLE_COUNT = 5;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.flags = StreamSetsRequest::NORMALIZE;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(123711ULL, response_.data_sets[0][0]);
EXPECT_EQ(773195ULL, response_.data_sets[0][1]);
EXPECT_EQ(360824ULL, response_.data_sets[0][2]);
EXPECT_EQ(51546ULL, response_.data_sets[0][3]);
EXPECT_EQ(154639ULL, response_.data_sets[0][4]);
}
TEST_F(SystemMonitorDockyardTest, SmoothDataSetsCpu2) {
constexpr uint64_t SAMPLE_COUNT = 5;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::WIDE_SMOOTHING;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(47ULL, response_.data_sets[0][0]);
EXPECT_EQ(44ULL, response_.data_sets[0][1]);
EXPECT_EQ(42ULL, response_.data_sets[0][2]);
EXPECT_EQ(20ULL, response_.data_sets[0][3]);
EXPECT_EQ(13ULL, response_.data_sets[0][4]);
}
TEST_F(SystemMonitorDockyardTest, SculptedDataSetsCpu2) {
constexpr uint64_t SAMPLE_COUNT = 5;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 200;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::SCULPTING;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(3ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(3ULL, response_.data_sets[0][0]);
EXPECT_EQ(100ULL, response_.data_sets[0][1]);
EXPECT_EQ(30ULL, response_.data_sets[0][2]);
EXPECT_EQ(5ULL, response_.data_sets[0][3]);
EXPECT_EQ(3ULL, response_.data_sets[0][4]);
}
TEST_F(SystemMonitorDockyardTest, RandomSamples) {
constexpr uint64_t SAMPLE_COUNT = 40;
RandomSampleGenerator gen;
gen.dockyard_id = dockyard_.GetDockyardId("fake0");
gen.seed = 1234;
gen.time_style = RandomSampleGenerator::TIME_STYLE_LINEAR;
gen.start = 100;
gen.finish = 500;
gen.value_style = RandomSampleGenerator::VALUE_STYLE_SINE_WAVE;
gen.value_min = 10;
gen.value_max = 100;
gen.sample_count = SAMPLE_COUNT;
GenerateRandomSamples(gen, &dockyard_);
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 500;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("fake0"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
EXPECT_EQ(100, name_call_count_);
EXPECT_EQ(201, sets_call_count_);
EXPECT_EQ(10ULL, response_.lowest_value);
EXPECT_EQ(100ULL, response_.highest_value);
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(55ULL, response_.data_sets[0][0]);
EXPECT_EQ(99ULL, response_.data_sets[0][9]);
EXPECT_EQ(29ULL, response_.data_sets[0][19]);
EXPECT_EQ(29ULL, response_.data_sets[0][29]);
EXPECT_EQ(99ULL, response_.data_sets[0][39]);
}
TEST_F(SystemMonitorDockyardTest, NegativeSlope) {
// The timestamps in this fake sample stream increase by 10 in each successive
// Sample. The time data on the second entry of each Sample should increase by
// 0..10 in each successive sample. A value that is lower than the prior entry
// has a negative slope. E.g. the change from 10ULL to 7ULL is a downward
// trend (with a negative slope).
dockyard_.AddSamples(dockyard_.GetDockyardId("data"), {{100ULL, 5ULL},
{110ULL, 10ULL},
{120ULL, 7ULL},
{130ULL, 15ULL},
{140ULL, 16ULL},
{150ULL, 25ULL}});
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 160;
request.flags = StreamSetsRequest::SLOPE;
request.sample_count = 6;
request.render_style = StreamSetsRequest::HIGHEST_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("data"));
dockyard_.GetStreamSets(&request);
// Kick a process call.
dockyard_.ProcessRequests();
ASSERT_EQ(1UL, response_.data_sets.size());
ASSERT_EQ(request.sample_count, response_.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(500000ULL, response_.data_sets[0][0]);
EXPECT_EQ(500000ULL, response_.data_sets[0][1]);
// The Dockyard will return a level slope rather than a negative slope. The
// result on the next line would be a negative value if negative slopes were
// reported.
EXPECT_EQ(0ULL, response_.data_sets[0][2]);
EXPECT_EQ(500000ULL, response_.data_sets[0][3]);
EXPECT_EQ(100000ULL, response_.data_sets[0][4]);
EXPECT_EQ(900000ULL, response_.data_sets[0][5]);
}
TEST_F(SystemMonitorDockyardTest, DockyardStringToId) {
DockyardId apple_id = dockyard_.GetDockyardId("apple");
DockyardId banana_id = dockyard_.GetDockyardId("banana");
DockyardId carrot_id = dockyard_.GetDockyardId("carrot");
DockyardId dog_id = dockyard_.GetDockyardId("dog");
DockyardId elephant_id = dockyard_.GetDockyardId("elephant");
// None of the IDs should match
EXPECT_NE(apple_id, banana_id);
EXPECT_NE(apple_id, carrot_id);
EXPECT_NE(apple_id, dog_id);
EXPECT_NE(apple_id, elephant_id);
EXPECT_NE(banana_id, carrot_id);
EXPECT_NE(banana_id, dog_id);
EXPECT_NE(banana_id, elephant_id);
EXPECT_NE(carrot_id, dog_id);
EXPECT_NE(carrot_id, elephant_id);
EXPECT_NE(dog_id, elephant_id);
// The same ID should be returned for an equivalent string.
EXPECT_EQ(apple_id, dockyard_.GetDockyardId("apple"));
EXPECT_EQ(banana_id, dockyard_.GetDockyardId("banana"));
EXPECT_EQ(carrot_id, dockyard_.GetDockyardId("carrot"));
EXPECT_EQ(dog_id, dockyard_.GetDockyardId("dog"));
EXPECT_EQ(elephant_id, dockyard_.GetDockyardId("elephant"));
}
TEST_F(SystemMonitorDockyardTest, DockyardIdToString) {
DockyardId apple_id = dockyard_.GetDockyardId("apple");
DockyardId banana_id = dockyard_.GetDockyardId("banana");
DockyardId carrot_id = dockyard_.GetDockyardId("carrot");
DockyardId dog_id = dockyard_.GetDockyardId("dog");
DockyardId elephant_id = dockyard_.GetDockyardId("elephant");
// Check that the id will give the corresponding string.
std::string test;
EXPECT_TRUE(dockyard_.GetDockyardPath(apple_id, &test));
EXPECT_EQ("apple", test);
EXPECT_TRUE(dockyard_.GetDockyardPath(banana_id, &test));
EXPECT_EQ("banana", test);
EXPECT_TRUE(dockyard_.GetDockyardPath(carrot_id, &test));
EXPECT_EQ("carrot", test);
EXPECT_TRUE(dockyard_.GetDockyardPath(dog_id, &test));
EXPECT_EQ("dog", test);
EXPECT_TRUE(dockyard_.GetDockyardPath(elephant_id, &test));
EXPECT_EQ("elephant", test);
}
} // namespace
} // namespace dockyard