baggage_propagator_test.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <initializer_list>
  5. #include <map>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include "opentelemetry/baggage/baggage.h"
  10. #include "opentelemetry/baggage/baggage_context.h"
  11. #include "opentelemetry/baggage/propagation/baggage_propagator.h"
  12. #include "opentelemetry/context/context.h"
  13. #include "opentelemetry/context/propagation/text_map_propagator.h"
  14. #include "opentelemetry/nostd/function_ref.h"
  15. #include "opentelemetry/nostd/shared_ptr.h"
  16. #include "opentelemetry/nostd/string_view.h"
  17. using namespace opentelemetry;
  18. using namespace opentelemetry::baggage::propagation;
  19. class BaggageCarrierTest : public context::propagation::TextMapCarrier
  20. {
  21. public:
  22. BaggageCarrierTest() = default;
  23. nostd::string_view Get(nostd::string_view key) const noexcept override
  24. {
  25. auto it = headers_.find(std::string(key));
  26. if (it != headers_.end())
  27. {
  28. return nostd::string_view(it->second);
  29. }
  30. return "";
  31. }
  32. void Set(nostd::string_view key, nostd::string_view value) noexcept override
  33. {
  34. headers_[std::string(key)] = std::string(value);
  35. }
  36. std::map<std::string, std::string> headers_;
  37. };
  38. static BaggagePropagator format;
  39. TEST(BaggagePropagatorTest, ExtractNoBaggageHeader)
  40. {
  41. BaggageCarrierTest carrier;
  42. carrier.headers_ = {};
  43. context::Context ctx1 = context::Context{};
  44. context::Context ctx2 = format.Extract(carrier, ctx1);
  45. auto ctx2_baggage = baggage::GetBaggage(ctx2);
  46. EXPECT_EQ(ctx2_baggage->ToHeader(), "");
  47. }
  48. TEST(BaggagePropagatorTest, ExtractAndInjectBaggage)
  49. {
  50. // create header string for baggage larger than allowed size (kMaxKeyValueSize)
  51. std::string very_large_baggage_header =
  52. std::string(baggage::Baggage::kMaxKeyValueSize / 2 + 1, 'k') + "=" +
  53. std::string(baggage::Baggage::kMaxKeyValueSize / 2 + 1, 'v');
  54. std::map<std::string, std::string> baggages = {
  55. {"key1=val1,key2=val2", "key1=val1,key2=val2"}, // valid header
  56. {"key1 = val1, key2 =val2 ", "key1=val1,key2=val2"}, // valid header with spaces
  57. {"key1=val1,key2=val2;prop=1", "key1=val1,key2=val2;prop=1"}, // valid header with properties
  58. {"key%2C1=val1,key2=val2%2Cval3",
  59. "key%2C1=val1,key2=val2%2Cval3"}, // valid header with url escape
  60. {"key1=val1,key2=val2,a,val3", "key1=val1,key2=val2"}, // valid header with invalid value
  61. {"key1=,key2=val2", "key1=,key2=val2"}, // valid header with empty value
  62. {"invalid_header", ""}, // invalid header
  63. {very_large_baggage_header, ""}}; // baggage header larger than allowed size.
  64. for (const auto &baggage : baggages)
  65. {
  66. BaggageCarrierTest carrier1;
  67. carrier1.headers_[baggage::kBaggageHeader.data()] = baggage.first;
  68. context::Context ctx1 = context::Context{};
  69. context::Context ctx2 = format.Extract(carrier1, ctx1);
  70. BaggageCarrierTest carrier2;
  71. format.Inject(carrier2, ctx2);
  72. EXPECT_EQ(carrier2.headers_[baggage::kBaggageHeader.data()], baggage.second);
  73. std::vector<std::string> fields;
  74. format.Fields([&fields](nostd::string_view field) {
  75. fields.push_back(field.data());
  76. return true;
  77. });
  78. EXPECT_EQ(fields.size(), 1);
  79. EXPECT_EQ(fields[0], baggage::kBaggageHeader.data());
  80. }
  81. }
  82. TEST(BaggagePropagatorTest, InjectEmptyHeader)
  83. {
  84. // Test Missing baggage from context
  85. BaggageCarrierTest carrier;
  86. context::Context ctx = context::Context{};
  87. format.Inject(carrier, ctx);
  88. EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end());
  89. {
  90. // Test empty baggage in context
  91. BaggageCarrierTest carrier1;
  92. carrier1.headers_[baggage::kBaggageHeader.data()] = "";
  93. context::Context ctx1 = context::Context{};
  94. context::Context ctx2 = format.Extract(carrier1, ctx1);
  95. format.Inject(carrier, ctx2);
  96. EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end());
  97. }
  98. {
  99. // Invalid baggage in context
  100. BaggageCarrierTest carrier1;
  101. carrier1.headers_[baggage::kBaggageHeader.data()] = "InvalidBaggageData";
  102. context::Context ctx1 = context::Context{};
  103. context::Context ctx2 = format.Extract(carrier1, ctx1);
  104. format.Inject(carrier, ctx2);
  105. EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end());
  106. }
  107. }