blob: 1115260896150ff0a517358954e3189b7752250a [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 "src/developer/system_monitor/lib/dockyard/dockyard.h"
#include <climits>
#include <gtest/gtest.h>
#include "src/developer/system_monitor/lib/dockyard/dockyard_service_impl.h"
#include "src/developer/system_monitor/lib/dockyard/test_sample_generator.h"
namespace dockyard {
namespace {
// A server address that gets the OS to choose a free port.
const char kgRPCServerAddressForTest[] = "0.0.0.0:0";
}
class SystemMonitorDockyardTest : public ::testing::Test {
public:
void SetUp() {
// Initialize to distinct values for testing.
EXPECT_EQ(nullptr, dockyard_.SetDockyardPathsHandler(std::bind(
&SystemMonitorDockyardTest::TestPathsCallback, this,
std::placeholders::_1, std::placeholders::_2)));
// 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}});
}
// Returns whether the gRPC server is listening for Harvester connections.
bool IsGrpcServerActive() {
return !!dockyard_.grpc_server_ && dockyard_.server_thread_.joinable();
}
// TODO(fxbug.dev/37317): add further tests for paths.
void TestPathsCallback(const std::vector<PathInfo>& add,
const std::vector<uint32_t>& remove) {}
Dockyard dockyard_;
};
namespace {
TEST_F(SystemMonitorDockyardTest, SetsCallback) {
// No pending requests.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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(dockyard::NO_DATA, 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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsRequestNormal) {
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 500;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
dockyard_.GetSampleStreams(
std::move(request), [](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(4UL, response.data_sets[0].size());
EXPECT_EQ(100ULL, response.data_sets[0][0].first);
EXPECT_EQ(10ULL, response.data_sets[0][0].second);
EXPECT_EQ(200ULL, response.data_sets[0][1].first);
EXPECT_EQ(100ULL, response.data_sets[0][1].second);
EXPECT_EQ(300ULL, response.data_sets[0][2].first);
EXPECT_EQ(80ULL, response.data_sets[0][2].second);
EXPECT_EQ(400ULL, response.data_sets[0][3].first);
EXPECT_EQ(100ULL, response.data_sets[0][3].second);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsRequestNearValues) {
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 25;
request.end_time_ns = 81;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
dockyard_.GetSampleStreams(std::move(request),
[](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(1UL, response.data_sets[0].size());
EXPECT_EQ(80ULL, response.data_sets[0][0].first);
EXPECT_EQ(5ULL, response.data_sets[0][0].second);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsGenerated) {
constexpr uint64_t SAMPLE_COUNT = 5;
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;
GenerateRandomSamples(gen, &dockyard_);
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 100;
// this is the exact time of the fifth sample
request.end_time_ns = 420;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("fake0"));
dockyard_.GetSampleStreams(
std::move(request), [](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(SAMPLE_COUNT - 1, response.data_sets[0].size());
// Check the samples themselves.
std::vector<std::pair<SampleTimeNs, SampleValue>> expected = {
{100ULL, 10UL}, {180ULL, 28ULL}, {260ULL, 46ULL}, {340ULL, 64ULL}};
int data_set_index = 0;
for (const auto& [timestamp, value] : expected) {
EXPECT_EQ(timestamp, response.data_sets[0][data_set_index].first);
EXPECT_EQ(value, response.data_sets[0][data_set_index].second);
data_set_index++;
}
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsRequestAfterSamples) {
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 600;
request.end_time_ns = 700;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
dockyard_.GetSampleStreams(std::move(request),
[](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(0UL, response.data_sets[0].size());
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsRequestBeforeSamples) {
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 0;
request.end_time_ns = 10;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
dockyard_.GetSampleStreams(std::move(request),
[](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(0UL, response.data_sets[0].size());
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsMissing) {
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 500;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("does-not-exist"));
dockyard_.GetSampleStreams(std::move(request),
[](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(0UL, response.data_sets[0].size());
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, SampleStreamsRequestNormalMultiple) {
// Add pending request.
SampleStreamsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 500;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu0"));
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
dockyard_.GetSampleStreams(
std::move(request), [](const SampleStreamsRequest& request,
const SampleStreamsResponse& response) {
ASSERT_EQ(2UL, response.data_sets.size());
ASSERT_EQ(2UL, response.data_sets[0].size());
EXPECT_EQ(200ULL, response.data_sets[0][0].first);
EXPECT_EQ(10ULL, response.data_sets[0][0].second);
EXPECT_EQ(300ULL, response.data_sets[0][1].first);
EXPECT_EQ(20ULL, response.data_sets[0][1].second);
ASSERT_EQ(4UL, response.data_sets[1].size());
EXPECT_EQ(10ULL, response.data_sets[1][0].second);
EXPECT_EQ(100ULL, response.data_sets[1][1].second);
EXPECT_EQ(80ULL, response.data_sets[1][2].second);
EXPECT_EQ(100ULL, response.data_sets[1][3].second);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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(dockyard::NO_DATA, 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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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(dockyard::NO_DATA, 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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request),
[](const StreamSetsRequest& request, const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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(
std::move(request),
[](const StreamSetsRequest& request, const StreamSetsResponse& response) {
ASSERT_EQ(1UL, response.data_sets.size());
ASSERT_EQ(request.sample_count, response.data_sets[0].size());
// Check the samples themselves.
EXPECT_EQ(dockyard::NO_DATA, 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]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, RecentDataSetsCpus12) {
constexpr uint64_t SAMPLE_COUNT = 1;
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 0;
request.end_time_ns = ULLONG_MAX;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::RECENT;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu1"));
request.dockyard_ids.push_back(dockyard_.GetDockyardId("cpu2"));
dockyard_.GetStreamSets(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
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());
ASSERT_EQ(SAMPLE_COUNT, response.data_sets[1].size());
// Check the samples themselves.
// CPU 1.
EXPECT_EQ(50ULL, response.data_sets[0][0]);
// CPU 2.
EXPECT_EQ(50ULL, response.data_sets[1][0]);
});
// Kick a process call.
dockyard_.ProcessRequests();
}
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);
}
TEST_F(SystemMonitorDockyardTest, ServerListening) {
// Test for: https://bugs.chromium.org/p/fuchsia/issues/detail?id=72
const std::string device_name = "apple.banana.carrot.dog";
ConnectionRequest request;
request.SetDeviceName(device_name);
EXPECT_TRUE(dockyard_.StartCollectingFrom(
std::move(request), [](const dockyard::ConnectionRequest& request,
const dockyard::ConnectionResponse& response) {
EXPECT_EQ(request.RequestId(), response.RequestId());
EXPECT_EQ(request.GetMessageType(),
dockyard::MessageType::kConnectionRequest);
EXPECT_EQ(response.GetMessageType(),
dockyard::MessageType::kResponseOk);
EXPECT_EQ(response.DockyardVersion(), response.HarvesterVersion());
},
kgRPCServerAddressForTest));
ConnectionRequest second_request;
second_request.SetDeviceName(device_name);
EXPECT_FALSE(dockyard_.StartCollectingFrom(
std::move(second_request),
[](const dockyard::ConnectionRequest& request,
const dockyard::ConnectionResponse& response) {
FAIL() << "Unexpected callback";
},
kgRPCServerAddressForTest));
dockyard_.OnConnection(dockyard::MessageType::kResponseOk,
/*harvester_version=*/dockyard::DOCKYARD_VERSION);
EXPECT_TRUE(IsGrpcServerActive());
dockyard_.StopCollectingFromDevice();
EXPECT_FALSE(IsGrpcServerActive());
}
TEST_F(SystemMonitorDockyardTest, VersionMismatch) {
const std::string device_name = "apple.banana.carrot.dog";
ConnectionRequest request;
request.SetDeviceName(device_name);
EXPECT_TRUE(dockyard_.StartCollectingFrom(
std::move(request), [](const dockyard::ConnectionRequest& request,
const dockyard::ConnectionResponse& response) {
EXPECT_EQ(request.RequestId(), response.RequestId());
EXPECT_EQ(request.GetMessageType(),
dockyard::MessageType::kConnectionRequest);
EXPECT_EQ(response.GetMessageType(),
dockyard::MessageType::kVersionMismatch);
EXPECT_NE(response.DockyardVersion(), response.HarvesterVersion());
},
kgRPCServerAddressForTest));
dockyard_.OnConnection(dockyard::MessageType::kVersionMismatch,
/*harvester_version=*/dockyard::DOCKYARD_VERSION - 1);
}
TEST_F(SystemMonitorDockyardTest, StreamRef) {
SampleStreamMap stream_map;
EXPECT_EQ(stream_map.size(), 0ULL);
{
SampleStream& ref1 = stream_map.StreamRef(11);
SampleStream& ref2 = stream_map.StreamRef(22);
// The streams should be empty.
EXPECT_TRUE(ref1.empty());
EXPECT_TRUE(ref2.empty());
ref1.emplace(0, 100ULL);
ref2.emplace(0, 200ULL);
}
// Requesting the stream ref caused the stream to be created.
EXPECT_EQ(stream_map.size(), 2ULL);
{
SampleStream& ref1 = stream_map.StreamRef(11);
SampleStream& ref2 = stream_map.StreamRef(22);
// The streams should not be empty, they should have the values above.
EXPECT_FALSE(ref1.empty());
EXPECT_FALSE(ref2.empty());
EXPECT_EQ(ref1[0], 100ULL);
EXPECT_EQ(ref2[0], 200ULL);
}
// Requesting the same streams reuse the existing streams.
EXPECT_EQ(stream_map.size(), 2ULL);
}
TEST_F(SystemMonitorDockyardTest, DefaultValues) {
RandomSampleGenerator gen;
EXPECT_EQ(0u, gen.dockyard_id);
EXPECT_EQ(0u, gen.seed);
EXPECT_EQ(0u, gen.start);
EXPECT_EQ(100U, gen.finish);
EXPECT_EQ(RandomSampleGenerator::TIME_STYLE_LINEAR, gen.time_style);
EXPECT_EQ(RandomSampleGenerator::VALUE_STYLE_SINE_WAVE, gen.value_style);
EXPECT_EQ(0u, gen.value_min);
EXPECT_EQ(dockyard::SAMPLE_MAX_VALUE, gen.value_max);
EXPECT_EQ(100u, gen.sample_count);
DiscardSamplesRequest discard;
EXPECT_EQ(0u, discard.start_time_ns);
EXPECT_EQ(dockyard::kSampleTimeInfinite, discard.end_time_ns);
EXPECT_EQ(0u, discard.dockyard_ids.size());
StreamSetsRequest request;
EXPECT_EQ(0u, request.start_time_ns);
EXPECT_EQ(0u, request.end_time_ns);
EXPECT_EQ(0u, request.sample_count);
EXPECT_EQ(StreamSetsRequest::AVERAGE_PER_COLUMN, request.render_style);
EXPECT_EQ(0u, request.dockyard_ids.size());
}
TEST_F(SystemMonitorDockyardTest, IgnoreSamples) {
{
constexpr uint64_t SAMPLE_COUNT = 40;
RandomSampleGenerator gen;
gen.dockyard_id = dockyard_.GetDockyardId("fake0:345:iTest");
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_);
}
// Discard some samples.
IgnoreSamplesRequest ignore;
ignore.prefix = "fake0:";
ignore.suffix = ":iTest";
dockyard_.IgnoreSamples(
std::move(ignore), [](const dockyard::IgnoreSamplesRequest& request,
const dockyard::IgnoreSamplesResponse& response) {
EXPECT_EQ(request.RequestId(), response.RequestId());
});
dockyard_.ProcessRequests();
{
constexpr uint64_t SAMPLE_COUNT = 40;
RandomSampleGenerator gen;
gen.dockyard_id = dockyard_.GetDockyardId("fake0:345:iTest");
gen.seed = 1234;
gen.time_style = RandomSampleGenerator::TIME_STYLE_LINEAR;
gen.start = 500;
gen.finish = 700;
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 that straddles the time when those samples were not
// ignored and then some time when they were ignored.
StreamSetsRequest request;
request.start_time_ns = 400;
request.end_time_ns = 600;
request.sample_count = 12;
request.render_style = StreamSetsRequest::AVERAGE_PER_COLUMN;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("fake0:345:iTest"));
dockyard_.GetStreamSets(
std::move(request),
[](const StreamSetsRequest& request, const StreamSetsResponse& response) {
// Check results.
EXPECT_EQ(request.RequestId(), response.RequestId());
EXPECT_EQ(10ULL, response.lowest_value);
EXPECT_EQ(100ULL, response.highest_value);
ASSERT_EQ(1UL, response.data_sets.size());
// Check the samples themselves. The samples that arrived prior to the
// request to ignore some samples will still be there. Samples that
// arrived (i.e. were generated) after the request to ignore them are
// ignored.
EXPECT_EQ(41u, response.data_sets[0][0]);
EXPECT_EQ(58u, response.data_sets[0][1]);
EXPECT_EQ(72u, response.data_sets[0][2]);
EXPECT_EQ(83u, response.data_sets[0][3]);
EXPECT_EQ(94u, response.data_sets[0][4]);
EXPECT_EQ(99u, 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]);
EXPECT_EQ(dockyard::NO_DATA, response.data_sets[0][10]);
EXPECT_EQ(dockyard::NO_DATA, response.data_sets[0][11]);
});
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, Discard) {
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_);
// Discard some samples.
DiscardSamplesRequest discard;
discard.start_time_ns = 0;
discard.end_time_ns = 300;
discard.dockyard_ids.push_back(dockyard_.GetDockyardId("fake0"));
dockyard_.DiscardSamples(
std::move(discard), [](const DiscardSamplesRequest& request,
const DiscardSamplesResponse& response) {
EXPECT_EQ(request.RequestId(), response.RequestId());
});
dockyard_.ProcessRequests();
// Add pending request.
StreamSetsRequest request;
request.start_time_ns = 100;
request.end_time_ns = 500;
request.sample_count = SAMPLE_COUNT;
request.render_style = StreamSetsRequest::RECENT;
request.dockyard_ids.push_back(dockyard_.GetDockyardId("fake0"));
dockyard_.GetStreamSets(
std::move(request), [SAMPLE_COUNT](const StreamSetsRequest& request,
const StreamSetsResponse& response) {
// Check results.
EXPECT_EQ(request.RequestId(), response.RequestId());
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(dockyard::NO_DATA, response.data_sets[0][0]);
EXPECT_EQ(dockyard::NO_DATA, response.data_sets[0][9]);
EXPECT_EQ(dockyard::NO_DATA, response.data_sets[0][19]);
EXPECT_EQ(29ULL, response.data_sets[0][29]);
EXPECT_EQ(99ULL, response.data_sets[0][39]);
});
dockyard_.ProcessRequests();
}
TEST_F(SystemMonitorDockyardTest, MessageTypes) {
#define TEST_MESSAGE_TYPES(x) \
do { \
dockyard::x##Request r1; \
EXPECT_EQ(r1.GetMessageType(), dockyard::MessageType::k##x##Request); \
} while (false)
TEST_MESSAGE_TYPES(Connection);
TEST_MESSAGE_TYPES(DiscardSamples);
TEST_MESSAGE_TYPES(IgnoreSamples);
TEST_MESSAGE_TYPES(StreamSets);
TEST_MESSAGE_TYPES(UnignoreSamples);
#undef TEST_MESSAGE_TYPES
}
} // namespace
} // namespace dockyard