summaryrefslogtreecommitdiffstats
path: root/src/jaegertracing/opentelemetry-cpp/api/test/context/runtime_context_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/jaegertracing/opentelemetry-cpp/api/test/context/runtime_context_test.cc')
-rw-r--r--src/jaegertracing/opentelemetry-cpp/api/test/context/runtime_context_test.cc135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/jaegertracing/opentelemetry-cpp/api/test/context/runtime_context_test.cc b/src/jaegertracing/opentelemetry-cpp/api/test/context/runtime_context_test.cc
new file mode 100644
index 000000000..e85fc6350
--- /dev/null
+++ b/src/jaegertracing/opentelemetry-cpp/api/test/context/runtime_context_test.cc
@@ -0,0 +1,135 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#include "opentelemetry/context/runtime_context.h"
+#include "opentelemetry/context/context.h"
+
+#include <gtest/gtest.h>
+
+using namespace opentelemetry;
+
+// Tests that GetCurrent returns the current context
+TEST(RuntimeContextTest, GetCurrent)
+{
+ std::map<std::string, context::ContextValue> map_test = {{"test_key", (int64_t)123}};
+ context::Context test_context = context::Context(map_test);
+ auto old_context = context::RuntimeContext::Attach(test_context);
+ EXPECT_EQ(context::RuntimeContext::GetCurrent(), test_context);
+}
+
+// Tests that detach resets the context to the previous context
+TEST(RuntimeContextTest, Detach)
+{
+ std::map<std::string, context::ContextValue> map_test = {{"test_key", (int64_t)123}};
+ context::Context test_context = context::Context(map_test);
+ context::Context foo_context = context::Context(map_test);
+
+ auto test_context_token = context::RuntimeContext::Attach(test_context);
+ auto foo_context_token = context::RuntimeContext::Attach(foo_context);
+
+ foo_context_token.reset();
+ EXPECT_EQ(context::RuntimeContext::GetCurrent(), test_context);
+ test_context_token.reset();
+}
+
+// Tests that detach returns false when the wrong context is provided
+TEST(RuntimeContextTest, DetachWrongContext)
+{
+ std::map<std::string, context::ContextValue> map_test = {{"test_key", (int64_t)123}};
+ context::Context test_context = context::Context(map_test);
+ auto test_context_token = context::RuntimeContext::Attach(test_context);
+ EXPECT_TRUE(context::RuntimeContext::Detach(*test_context_token));
+ EXPECT_FALSE(context::RuntimeContext::Detach(*test_context_token));
+}
+
+// Tests that the ThreadLocalContext can handle three attached contexts
+TEST(RuntimeContextTest, ThreeAttachDetach)
+{
+ std::map<std::string, context::ContextValue> map_test = {{"test_key", (int64_t)123}};
+ context::Context test_context = context::Context(map_test);
+ context::Context foo_context = context::Context(map_test);
+ context::Context other_context = context::Context(map_test);
+ auto test_context_token = context::RuntimeContext::Attach(test_context);
+ auto foo_context_token = context::RuntimeContext::Attach(foo_context);
+ auto other_context_token = context::RuntimeContext::Attach(other_context);
+
+ EXPECT_TRUE(context::RuntimeContext::Detach(*other_context_token));
+ EXPECT_TRUE(context::RuntimeContext::Detach(*foo_context_token));
+ EXPECT_TRUE(context::RuntimeContext::Detach(*test_context_token));
+}
+
+// Tests that SetValue returns a context with the passed in data and the
+// RuntimeContext data when a context is not passed into the
+// RuntimeContext::SetValue method.
+TEST(RuntimeContextTest, SetValueRuntimeContext)
+{
+ context::Context foo_context = context::Context("foo_key", (int64_t)596);
+ auto old_context_token = context::RuntimeContext::Attach(foo_context);
+ context::Context test_context = context::RuntimeContext::SetValue("test_key", (int64_t)123);
+ EXPECT_EQ(nostd::get<int64_t>(test_context.GetValue("test_key")), 123);
+ EXPECT_EQ(nostd::get<int64_t>(test_context.GetValue("foo_key")), 596);
+}
+
+// Tests that SetValue returns a context with the passed in data and the
+// passed in context data when a context* is passed into the
+// RuntimeContext::SetValue method.
+TEST(RuntimeContextTest, SetValueOtherContext)
+{
+ context::Context foo_context = context::Context("foo_key", (int64_t)596);
+ context::Context test_context =
+ context::RuntimeContext::SetValue("test_key", (int64_t)123, &foo_context);
+ EXPECT_EQ(nostd::get<int64_t>(test_context.GetValue("test_key")), 123);
+ EXPECT_EQ(nostd::get<int64_t>(test_context.GetValue("foo_key")), 596);
+}
+
+// Tests that SetValue returns the ContextValue associated with the
+// passed in string and the current Runtime Context
+TEST(RuntimeContextTest, GetValueRuntimeContext)
+{
+ context::Context foo_context = context::Context("foo_key", (int64_t)596);
+ auto old_context_token = context::RuntimeContext::Attach(foo_context);
+ EXPECT_EQ(nostd::get<int64_t>(context::RuntimeContext::GetValue("foo_key")), 596);
+}
+
+// Tests that SetValue returns the ContextValue associated with the
+// passed in string and the passed in context
+TEST(RuntimeContextTest, GetValueOtherContext)
+{
+ context::Context foo_context = context::Context("foo_key", (int64_t)596);
+ EXPECT_EQ(nostd::get<int64_t>(context::RuntimeContext::GetValue("foo_key", &foo_context)), 596);
+}
+
+// Test that any possible order of context detaching doesn't mess up the stack.
+TEST(RuntimeContextTest, DetachOutOfOrder)
+{
+ std::vector<size_t> indices;
+ indices.push_back(0);
+ indices.push_back(1);
+ indices.push_back(2);
+ indices.push_back(3);
+
+ std::vector<context::Context> contexts;
+ for (auto i : indices)
+ {
+ contexts.push_back(context::Context("index", (int64_t)i));
+ }
+
+ do
+ {
+ std::vector<nostd::unique_ptr<context::Token>> tokens;
+
+ for (auto &c : contexts)
+ {
+ tokens.push_back(context::RuntimeContext::Attach(c));
+ }
+
+ for (size_t i : indices)
+ {
+ auto token = std::move(tokens.at(i));
+ context::RuntimeContext::Detach(*token);
+ }
+
+ EXPECT_EQ(context::RuntimeContext::GetCurrent(), context::Context());
+
+ } while (std::next_permutation(indices.begin(), indices.end()));
+}