File: baggage_propagator_test.cc

package info (click to toggle)
opentelemetry-cpp 1.23.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,372 kB
  • sloc: cpp: 96,239; sh: 1,766; makefile: 36; python: 31
file content (123 lines) | stat: -rw-r--r-- 4,593 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#include <gtest/gtest.h>
#include <initializer_list>
#include <map>
#include <string>
#include <utility>
#include <vector>

#include "opentelemetry/baggage/baggage.h"
#include "opentelemetry/baggage/baggage_context.h"
#include "opentelemetry/baggage/propagation/baggage_propagator.h"
#include "opentelemetry/context/context.h"
#include "opentelemetry/context/propagation/text_map_propagator.h"
#include "opentelemetry/nostd/function_ref.h"
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/nostd/string_view.h"

using namespace opentelemetry;
using namespace opentelemetry::baggage::propagation;

class BaggageCarrierTest : public context::propagation::TextMapCarrier
{
public:
  BaggageCarrierTest() = default;
  nostd::string_view Get(nostd::string_view key) const noexcept override
  {
    auto it = headers_.find(std::string(key));
    if (it != headers_.end())
    {
      return nostd::string_view(it->second);
    }
    return "";
  }
  void Set(nostd::string_view key, nostd::string_view value) noexcept override
  {
    headers_[std::string(key)] = std::string(value);
  }

  std::map<std::string, std::string> headers_;
};

static BaggagePropagator format;

TEST(BaggagePropagatorTest, ExtractNoBaggageHeader)
{
  BaggageCarrierTest carrier;
  carrier.headers_      = {};
  context::Context ctx1 = context::Context{};
  context::Context ctx2 = format.Extract(carrier, ctx1);
  auto ctx2_baggage     = baggage::GetBaggage(ctx2);
  EXPECT_EQ(ctx2_baggage->ToHeader(), "");
}

TEST(BaggagePropagatorTest, ExtractAndInjectBaggage)
{
  // create header string for baggage larger than allowed size (kMaxKeyValueSize)
  std::string very_large_baggage_header =
      std::string(baggage::Baggage::kMaxKeyValueSize / 2 + 1, 'k') + "=" +
      std::string(baggage::Baggage::kMaxKeyValueSize / 2 + 1, 'v');

  std::map<std::string, std::string> baggages = {
      {"key1=val1,key2=val2", "key1=val1,key2=val2"},                // valid header
      {"key1 =   val1,  key2 =val2   ", "key1=val1,key2=val2"},      // valid header with spaces
      {"key1=val1,key2=val2;prop=1", "key1=val1,key2=val2;prop=1"},  // valid header with properties
      {"key%2C1=val1,key2=val2%2Cval3",
       "key%2C1=val1,key2=val2%2Cval3"},                      // valid header with url escape
      {"key1=val1,key2=val2,a,val3", "key1=val1,key2=val2"},  // valid header with invalid value
      {"key1=,key2=val2", "key1=,key2=val2"},                 // valid header with empty value
      {"invalid_header", ""},                                 // invalid header
      {very_large_baggage_header, ""}};  // baggage header larger than allowed size.

  for (const auto &baggage : baggages)
  {
    BaggageCarrierTest carrier1;
    carrier1.headers_[baggage::kBaggageHeader.data()] = baggage.first;
    context::Context ctx1                             = context::Context{};
    context::Context ctx2                             = format.Extract(carrier1, ctx1);

    BaggageCarrierTest carrier2;
    format.Inject(carrier2, ctx2);
    EXPECT_EQ(carrier2.headers_[baggage::kBaggageHeader.data()], baggage.second);

    std::vector<std::string> fields;
    format.Fields([&fields](nostd::string_view field) {
      fields.push_back(field.data());
      return true;
    });
    EXPECT_EQ(fields.size(), 1);
    EXPECT_EQ(fields[0], baggage::kBaggageHeader.data());
  }
}

TEST(BaggagePropagatorTest, InjectEmptyHeader)
{
  // Test Missing baggage from context
  BaggageCarrierTest carrier;
  context::Context ctx = context::Context{};
  format.Inject(carrier, ctx);
  EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end());

  {
    // Test empty baggage in context
    BaggageCarrierTest carrier1;
    carrier1.headers_[baggage::kBaggageHeader.data()] = "";
    context::Context ctx1                             = context::Context{};
    context::Context ctx2                             = format.Extract(carrier1, ctx1);
    format.Inject(carrier, ctx2);
    EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end());
  }
  {
    // Invalid baggage in context
    BaggageCarrierTest carrier1;
    carrier1.headers_[baggage::kBaggageHeader.data()] = "InvalidBaggageData";
    context::Context ctx1                             = context::Context{};
    context::Context ctx2                             = format.Extract(carrier1, ctx1);

    format.Inject(carrier, ctx2);
    EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end());
  }
}