|
34 | 34 | #include "util/newconfig/ConfigFileJson.hpp" |
35 | 35 | #include "util/newconfig/ConfigValue.hpp" |
36 | 36 | #include "util/newconfig/Types.hpp" |
| 37 | +#include "util/prometheus/Counter.hpp" |
37 | 38 |
|
38 | 39 | #include <boost/asio/io_context.hpp> |
39 | 40 | #include <boost/asio/spawn.hpp> |
|
59 | 60 | using namespace etl; |
60 | 61 | using namespace util::config; |
61 | 62 | using testing::Return; |
| 63 | +using namespace util::prometheus; |
62 | 64 |
|
63 | 65 | constexpr static auto const kTWO_SOURCES_LEDGER_RESPONSE = R"({ |
64 | 66 | "etl_sources": [ |
@@ -641,6 +643,71 @@ TEST_F(LoadBalancerForwardToRippledTests, source0Fails) |
641 | 643 | }); |
642 | 644 | } |
643 | 645 |
|
| 646 | +struct LoadBalancerForwardToRippledPrometheusTests : LoadBalancerForwardToRippledTests, WithMockPrometheus {}; |
| 647 | + |
| 648 | +TEST_F(LoadBalancerForwardToRippledPrometheusTests, forwardingCacheEnabled) |
| 649 | +{ |
| 650 | + configJson_.as_object()["forwarding"] = boost::json::object{{"cache_timeout", 10.}}; |
| 651 | + EXPECT_CALL(sourceFactory_, makeSource).Times(2); |
| 652 | + auto loadBalancer = makeLoadBalancer(); |
| 653 | + |
| 654 | + auto const request = boost::json::object{{"command", "server_info"}}; |
| 655 | + |
| 656 | + auto& cacheHitCounter = makeMock<util::prometheus::CounterInt>("forwarding_cache_hit_counter", ""); |
| 657 | + auto& cacheMissCounter = makeMock<CounterInt>("forwarding_cache_miss_counter", ""); |
| 658 | + auto& successDurationCounter = |
| 659 | + makeMock<CounterInt>("forwarding_duration_milliseconds_counter", "{status=\"success\"}"); |
| 660 | + |
| 661 | + EXPECT_CALL(cacheMissCounter, add(1)); |
| 662 | + EXPECT_CALL(cacheHitCounter, add(1)).Times(3); |
| 663 | + EXPECT_CALL(successDurationCounter, add(testing::_)); |
| 664 | + |
| 665 | + EXPECT_CALL( |
| 666 | + sourceFactory_.sourceAt(0), |
| 667 | + forwardToRippled(request, clientIP_, LoadBalancer::kUSER_FORWARDING_X_USER_VALUE, testing::_) |
| 668 | + ) |
| 669 | + .WillOnce(Return(response_)); |
| 670 | + |
| 671 | + runSpawn([&](boost::asio::yield_context yield) { |
| 672 | + EXPECT_EQ(loadBalancer->forwardToRippled(request, clientIP_, false, yield), response_); |
| 673 | + EXPECT_EQ(loadBalancer->forwardToRippled(request, clientIP_, false, yield), response_); |
| 674 | + EXPECT_EQ(loadBalancer->forwardToRippled(request, clientIP_, false, yield), response_); |
| 675 | + EXPECT_EQ(loadBalancer->forwardToRippled(request, clientIP_, false, yield), response_); |
| 676 | + }); |
| 677 | +} |
| 678 | + |
| 679 | +TEST_F(LoadBalancerForwardToRippledPrometheusTests, source0Fails) |
| 680 | +{ |
| 681 | + EXPECT_CALL(sourceFactory_, makeSource).Times(2); |
| 682 | + auto loadBalancer = makeLoadBalancer(); |
| 683 | + |
| 684 | + auto& cacheMissCounter = makeMock<CounterInt>("forwarding_cache_miss_counter", ""); |
| 685 | + auto& retriesCounter = makeMock<CounterInt>("forwarding_retries_counter", ""); |
| 686 | + auto& successDurationCounter = |
| 687 | + makeMock<CounterInt>("forwarding_duration_milliseconds_counter", "{status=\"success\"}"); |
| 688 | + auto& failDurationCounter = makeMock<CounterInt>("forwarding_duration_milliseconds_counter", "{status=\"fail\"}"); |
| 689 | + |
| 690 | + EXPECT_CALL(cacheMissCounter, add(1)); |
| 691 | + EXPECT_CALL(retriesCounter, add(1)); |
| 692 | + EXPECT_CALL(successDurationCounter, add(testing::_)); |
| 693 | + EXPECT_CALL(failDurationCounter, add(testing::_)); |
| 694 | + |
| 695 | + EXPECT_CALL( |
| 696 | + sourceFactory_.sourceAt(0), |
| 697 | + forwardToRippled(request_, clientIP_, LoadBalancer::kUSER_FORWARDING_X_USER_VALUE, testing::_) |
| 698 | + ) |
| 699 | + .WillOnce(Return(std::unexpected{rpc::ClioError::EtlConnectionError})); |
| 700 | + EXPECT_CALL( |
| 701 | + sourceFactory_.sourceAt(1), |
| 702 | + forwardToRippled(request_, clientIP_, LoadBalancer::kUSER_FORWARDING_X_USER_VALUE, testing::_) |
| 703 | + ) |
| 704 | + .WillOnce(Return(response_)); |
| 705 | + |
| 706 | + runSpawn([&](boost::asio::yield_context yield) { |
| 707 | + EXPECT_EQ(loadBalancer->forwardToRippled(request_, clientIP_, false, yield), response_); |
| 708 | + }); |
| 709 | +} |
| 710 | + |
644 | 711 | struct LoadBalancerForwardToRippledErrorTestBundle { |
645 | 712 | std::string testName; |
646 | 713 | rpc::ClioError firstSourceError; |
|
0 commit comments