kv_properties_test.cc 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <stddef.h>
  5. #include <string>
  6. #include <utility>
  7. #include <vector>
  8. #include <opentelemetry/common/kv_properties.h>
  9. #include "opentelemetry/nostd/function_ref.h"
  10. #include "opentelemetry/nostd/string_view.h"
  11. // ------------------------- Entry class tests ---------------------------------
  12. using namespace opentelemetry;
  13. using opentelemetry::common::KeyValueProperties;
  14. // Test constructor that takes a key-value pair
  15. TEST(EntryTest, KeyValueConstruction)
  16. {
  17. opentelemetry::nostd::string_view key = "test_key";
  18. opentelemetry::nostd::string_view val = "test_value";
  19. KeyValueProperties::Entry e(key, val);
  20. EXPECT_EQ(key.size(), e.GetKey().size());
  21. EXPECT_EQ(key, e.GetKey());
  22. EXPECT_EQ(val.size(), e.GetValue().size());
  23. EXPECT_EQ(val, e.GetValue());
  24. }
  25. // Test copy constructor
  26. TEST(EntryTest, Copy)
  27. {
  28. KeyValueProperties::Entry e("test_key", "test_value");
  29. const KeyValueProperties::Entry &copy(e);
  30. EXPECT_EQ(copy.GetKey(), e.GetKey());
  31. EXPECT_EQ(copy.GetValue(), e.GetValue());
  32. }
  33. // Test assignment operator
  34. TEST(EntryTest, Assignment)
  35. {
  36. KeyValueProperties::Entry e("test_key", "test_value");
  37. KeyValueProperties::Entry empty;
  38. empty = e;
  39. EXPECT_EQ(empty.GetKey(), e.GetKey());
  40. EXPECT_EQ(empty.GetValue(), e.GetValue());
  41. }
  42. TEST(EntryTest, SetValue)
  43. {
  44. KeyValueProperties::Entry e("test_key", "test_value");
  45. opentelemetry::nostd::string_view new_val = "new_value";
  46. e.SetValue(new_val);
  47. EXPECT_EQ(new_val.size(), e.GetValue().size());
  48. EXPECT_EQ(new_val, e.GetValue());
  49. }
  50. // ------------------------- KeyValueStringTokenizer tests ---------------------------------
  51. using opentelemetry::common::KeyValueStringTokenizer;
  52. using opentelemetry::common::KeyValueStringTokenizerOptions;
  53. TEST(KVStringTokenizer, SinglePair)
  54. {
  55. bool valid_kv;
  56. nostd::string_view key, value;
  57. opentelemetry::nostd::string_view str = "k1=v1";
  58. KeyValueStringTokenizerOptions opts;
  59. KeyValueStringTokenizer tk(str, opts);
  60. EXPECT_TRUE(tk.next(valid_kv, key, value));
  61. EXPECT_TRUE(valid_kv);
  62. EXPECT_EQ(key, "k1");
  63. EXPECT_EQ(value, "v1");
  64. EXPECT_FALSE(tk.next(valid_kv, key, value));
  65. }
  66. TEST(KVStringTokenizer, AcceptEmptyEntries)
  67. {
  68. bool valid_kv;
  69. nostd::string_view key, value;
  70. opentelemetry::nostd::string_view str = ":k1=v1::k2=v2: ";
  71. KeyValueStringTokenizerOptions opts;
  72. opts.member_separator = ':';
  73. opts.ignore_empty_members = false;
  74. KeyValueStringTokenizer tk(str, opts);
  75. EXPECT_TRUE(tk.next(valid_kv, key, value)); // empty pair
  76. EXPECT_TRUE(tk.next(valid_kv, key, value));
  77. EXPECT_TRUE(valid_kv);
  78. EXPECT_EQ(key, "k1");
  79. EXPECT_EQ(value, "v1");
  80. EXPECT_TRUE(tk.next(valid_kv, key, value)); // empty pair
  81. EXPECT_EQ(key, "");
  82. EXPECT_EQ(value, "");
  83. EXPECT_TRUE(tk.next(valid_kv, key, value));
  84. EXPECT_TRUE(tk.next(valid_kv, key, value)); // empty pair
  85. EXPECT_FALSE(tk.next(valid_kv, key, value));
  86. }
  87. TEST(KVStringTokenizer, ValidPairsWithEmptyEntries)
  88. {
  89. opentelemetry::nostd::string_view str = "k1:v1===k2:v2==";
  90. bool valid_kv;
  91. nostd::string_view key, value;
  92. KeyValueStringTokenizerOptions opts;
  93. opts.member_separator = '=';
  94. opts.key_value_separator = ':';
  95. KeyValueStringTokenizer tk(str, opts);
  96. EXPECT_TRUE(tk.next(valid_kv, key, value));
  97. EXPECT_TRUE(valid_kv);
  98. EXPECT_EQ(key, "k1");
  99. EXPECT_EQ(value, "v1");
  100. EXPECT_TRUE(tk.next(valid_kv, key, value));
  101. EXPECT_TRUE(valid_kv);
  102. EXPECT_EQ(key, "k2");
  103. EXPECT_EQ(value, "v2");
  104. EXPECT_FALSE(tk.next(valid_kv, key, value));
  105. }
  106. TEST(KVStringTokenizer, InvalidPairs)
  107. {
  108. opentelemetry::nostd::string_view str = "k1=v1,invalid ,, k2=v2 ,invalid";
  109. KeyValueStringTokenizer tk(str);
  110. bool valid_kv;
  111. nostd::string_view key, value;
  112. EXPECT_TRUE(tk.next(valid_kv, key, value));
  113. EXPECT_TRUE(valid_kv);
  114. EXPECT_EQ(key, "k1");
  115. EXPECT_EQ(value, "v1");
  116. EXPECT_TRUE(tk.next(valid_kv, key, value));
  117. EXPECT_FALSE(valid_kv);
  118. EXPECT_TRUE(tk.next(valid_kv, key, value));
  119. EXPECT_TRUE(valid_kv);
  120. EXPECT_EQ(key, "k2");
  121. EXPECT_EQ(value, "v2");
  122. EXPECT_TRUE(tk.next(valid_kv, key, value));
  123. EXPECT_FALSE(valid_kv);
  124. EXPECT_FALSE(tk.next(valid_kv, key, value));
  125. }
  126. TEST(KVStringTokenizer, NumTokens)
  127. {
  128. struct
  129. {
  130. const char *input;
  131. size_t expected;
  132. } testcases[] = {{"k1=v1", 1},
  133. {" ", 1},
  134. {"k1=v1,k2=v2,k3=v3", 3},
  135. {"k1=v1,", 1},
  136. {"k1=v1,k2=v2,invalidmember", 3},
  137. {"", 0}};
  138. for (auto &testcase : testcases)
  139. {
  140. KeyValueStringTokenizer tk(testcase.input);
  141. EXPECT_EQ(tk.NumTokens(), testcase.expected);
  142. }
  143. }
  144. //------------------------- KeyValueProperties tests ---------------------------------
  145. TEST(KeyValueProperties, PopulateKVIterableContainer)
  146. {
  147. std::vector<std::pair<std::string, std::string>> kv_pairs = {{"k1", "v1"}, {"k2", "v2"}};
  148. auto kv_properties = KeyValueProperties(kv_pairs);
  149. EXPECT_EQ(kv_properties.Size(), 2);
  150. std::string value;
  151. bool present = kv_properties.GetValue("k1", value);
  152. EXPECT_TRUE(present);
  153. EXPECT_EQ(value, "v1");
  154. present = kv_properties.GetValue("k2", value);
  155. EXPECT_TRUE(present);
  156. EXPECT_EQ(value, "v2");
  157. }
  158. TEST(KeyValueProperties, AddEntry)
  159. {
  160. auto kv_properties = KeyValueProperties(1);
  161. kv_properties.AddEntry("k1", "v1");
  162. std::string value;
  163. bool present = kv_properties.GetValue("k1", value);
  164. EXPECT_TRUE(present);
  165. EXPECT_EQ(value, "v1");
  166. kv_properties.AddEntry("k2", "v2"); // entry will not be added as max size reached.
  167. EXPECT_EQ(kv_properties.Size(), 1);
  168. present = kv_properties.GetValue("k2", value);
  169. EXPECT_FALSE(present);
  170. }
  171. TEST(KeyValueProperties, GetValue)
  172. {
  173. auto kv_properties = KeyValueProperties(1);
  174. kv_properties.AddEntry("k1", "v1");
  175. std::string value;
  176. bool present = kv_properties.GetValue("k1", value);
  177. EXPECT_TRUE(present);
  178. EXPECT_EQ(value, "v1");
  179. present = kv_properties.GetValue("k3", value);
  180. EXPECT_FALSE(present);
  181. }
  182. TEST(KeyValueProperties, GetAllEntries)
  183. {
  184. std::vector<std::pair<std::string, std::string>> kv_pairs = {
  185. {"k1", "v1"}, {"k2", "v2"}, {"k3", "v3"}};
  186. const size_t kNumPairs = 3;
  187. opentelemetry::nostd::string_view keys[kNumPairs] = {"k1", "k2", "k3"};
  188. opentelemetry::nostd::string_view values[kNumPairs] = {"v1", "v2", "v3"};
  189. auto kv_properties = KeyValueProperties(kv_pairs);
  190. size_t index = 0;
  191. kv_properties.GetAllEntries(
  192. [&keys, &values, &index](nostd::string_view key, nostd::string_view value) {
  193. EXPECT_EQ(key, keys[index]);
  194. EXPECT_EQ(value, values[index]);
  195. index++;
  196. return true;
  197. });
  198. EXPECT_EQ(index, kNumPairs);
  199. }