26 #include <gmock/gmock.h>
27 #include <gtest/gtest.h>
29 #include "absl/memory/memory.h"
30 #include "opencensus/stats/testing/test_utils.h"
44 using ::grpc::lb::v1::LoadBalancingFeedback;
45 using ::grpc::load_reporter::CensusViewProvider;
46 using ::grpc::load_reporter::CpuStatsProvider;
47 using ::grpc::load_reporter::LoadReporter;
48 using ::opencensus::stats::ViewDescriptor;
54 constexpr
uint64_t kNumFeedbackSamplesInWindow =
57 class MockCensusViewProvider :
public CensusViewProvider {
59 MOCK_METHOD0(FetchViewData, CensusViewProvider::ViewDataMap());
61 const ::opencensus::stats::ViewDescriptor& FindViewDescriptor(
63 auto it = view_descriptor_map().find(view_name);
69 class MockCpuStatsProvider :
public CpuStatsProvider {
71 MOCK_METHOD0(GetCpuStats, CpuStatsProvider::CpuStatsSample());
78 MockCensusViewProvider* mock_census_view_provider() {
79 return static_cast<MockCensusViewProvider*
>(
83 void PrepareCpuExpectation(
size_t call_num) {
84 auto mock_cpu_stats_provider =
static_cast<MockCpuStatsProvider*
>(
87 for (
size_t i = 0;
i < call_num; ++
i) {
88 EXPECT_CALL(*mock_cpu_stats_provider, GetCpuStats())
90 .RetiresOnSaturation();
96 {13, 53}, {64, 96}, {245, 345}, {314, 785},
97 {874, 1230}, {1236, 2145}, {1864, 2974}};
126 void SetUp()
override {
135 auto mock_cpu =
new MockCpuStatsProvider();
136 auto mock_census =
new MockCensusViewProvider();
142 .RetiresOnSaturation();
145 std::unique_ptr<CensusViewProvider>(mock_census),
146 std::unique_ptr<CpuStatsProvider>(mock_cpu));
150 class LbFeedbackTest :
public LoadReporterTest {
154 void VerifyLbFeedback(
const LoadBalancingFeedback& lb_feedback,
size_t start,
156 const CpuStatsProvider::CpuStatsSample*
base =
158 double expected_cpu_util =
163 ASSERT_THAT(
static_cast<double>(lb_feedback.server_utilization()),
165 double qps_sum = 0, eps_sum = 0;
166 for (
size_t i = 0;
i <
count; ++
i) {
170 double expected_qps = qps_sum /
count;
171 double expected_eps = eps_sum /
count;
174 ASSERT_THAT(
static_cast<double>(lb_feedback.calls_per_second()),
175 DoubleNear(expected_qps, expected_qps * 0.3));
176 ASSERT_THAT(
static_cast<double>(lb_feedback.errors_per_second()),
177 DoubleNear(expected_eps, expected_eps * 0.3));
179 "Verified LB feedback matches the samples of index [%zu, %zu).",
184 {546.1, 153.1}, {62.1, 54.1}, {578.1, 154.2}, {978.1, 645.1},
185 {1132.1, 846.4}, {531.5, 315.4}, {874.1, 324.9}};
190 EXPECT_CALL(*mock_census_view_provider(), FetchViewData())
200 TEST_F(LbFeedbackTest, Normal) {
202 std::vector<CensusViewProvider::ViewDataMap> view_data_map_list;
204 double qps =
p.first;
205 double eps =
p.second;
208 double ok_count_1 = ok_count / 3.0;
209 double ok_count_2 = ok_count - ok_count_1;
210 auto end_count_vd = ::opencensus::stats::testing::TestUtils::MakeViewData(
211 mock_census_view_provider()->FindViewDescriptor(
223 auto end_bytes_sent_vd =
224 ::opencensus::stats::testing::TestUtils::MakeViewData(
225 mock_census_view_provider()->FindViewDescriptor(
236 auto end_bytes_received_vd =
237 ::opencensus::stats::testing::TestUtils::MakeViewData(
238 mock_census_view_provider()->FindViewDescriptor(
249 auto end_latency_vd = ::opencensus::stats::testing::TestUtils::MakeViewData(
250 mock_census_view_provider()->FindViewDescriptor(
261 view_data_map_list.push_back(
269 for (
size_t i = 0;
i < view_data_map_list.size(); ++
i) {
270 EXPECT_CALL(*mock_census_view_provider(), FetchViewData())
271 .WillOnce(
Return(view_data_map_list[i]))
272 .RetiresOnSaturation();
275 PrepareCpuExpectation(kNumFeedbackSamplesInWindow + 2);
279 for (
size_t i = 0;
i < kNumFeedbackSamplesInWindow / 2; ++
i) {
284 VerifyLbFeedback(
load_reporter_->GenerateLoadBalancingFeedback(), 0,
285 kNumFeedbackSamplesInWindow / 2);
288 for (
size_t i = 0;
i < (kNumFeedbackSamplesInWindow + 1) / 2; ++
i) {
292 VerifyLbFeedback(
load_reporter_->GenerateLoadBalancingFeedback(), 0,
293 kNumFeedbackSamplesInWindow);
295 for (
size_t i = 0;
i < 2; ++
i) {
299 VerifyLbFeedback(
load_reporter_->GenerateLoadBalancingFeedback(), 2,
300 kNumFeedbackSamplesInWindow);
303 using LoadReportTest = LoadReporterTest;
305 TEST_F(LoadReportTest, BasicReport) {
307 CensusViewProvider::ViewDataMap vdm1;
310 ::opencensus::stats::testing::TestUtils::MakeViewData(
311 mock_census_view_provider()->FindViewDescriptor(
321 ::opencensus::stats::testing::TestUtils::MakeViewData(
322 mock_census_view_provider()->FindViewDescriptor(
340 ::opencensus::stats::testing::TestUtils::MakeViewData(
341 mock_census_view_provider()->FindViewDescriptor(
359 ::opencensus::stats::testing::TestUtils::MakeViewData(
360 mock_census_view_provider()->FindViewDescriptor(
378 ::opencensus::stats::testing::TestUtils::MakeViewData(
379 mock_census_view_provider()->FindViewDescriptor(
398 ::opencensus::stats::testing::TestUtils::MakeViewData(
399 mock_census_view_provider()->FindViewDescriptor(
407 ::opencensus::stats::testing::TestUtils::MakeViewData(
408 mock_census_view_provider()->FindViewDescriptor(
415 CensusViewProvider::ViewDataMap vdm2;
418 ::opencensus::stats::testing::TestUtils::MakeViewData(
419 mock_census_view_provider()->FindViewDescriptor(
424 ::opencensus::stats::testing::TestUtils::MakeViewData(
425 mock_census_view_provider()->FindViewDescriptor(
434 ::opencensus::stats::testing::TestUtils::MakeViewData(
435 mock_census_view_provider()->FindViewDescriptor(
444 ::opencensus::stats::testing::TestUtils::MakeViewData(
445 mock_census_view_provider()->FindViewDescriptor(
454 ::opencensus::stats::testing::TestUtils::MakeViewData(
455 mock_census_view_provider()->FindViewDescriptor(
465 ::opencensus::stats::testing::TestUtils::MakeViewData(
466 mock_census_view_provider()->FindViewDescriptor(
473 ::opencensus::stats::testing::TestUtils::MakeViewData(
474 mock_census_view_provider()->FindViewDescriptor(
480 EXPECT_CALL(*mock_census_view_provider(), FetchViewData())
483 PrepareCpuExpectation(2);
503 int main(
int argc,
char** argv) {