| // 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 |