]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | #include <opentracing/mocktracer/tracer.h> |
2 | #include <cstdio> | |
3 | #include <exception> | |
4 | ||
5 | #include "mock_span.h" | |
6 | #include "mock_span_context.h" | |
7 | #include "propagation.h" | |
8 | ||
9 | #include <opentracing/dynamic_load.h> | |
10 | #include <opentracing/mocktracer/tracer_factory.h> | |
11 | #include <cstdio> | |
12 | #include <cstring> | |
13 | #include <exception> | |
14 | ||
15 | namespace opentracing { | |
16 | BEGIN_OPENTRACING_ABI_NAMESPACE | |
17 | namespace mocktracer { | |
18 | ||
19 | template <class Carrier> | |
20 | static expected<void> InjectImpl(const PropagationOptions& propagation_options, | |
21 | const opentracing::SpanContext& span_context, | |
22 | Carrier& writer) { | |
23 | if (propagation_options.inject_error_code.value() != 0) { | |
24 | return opentracing::make_unexpected(propagation_options.inject_error_code); | |
25 | } | |
26 | auto mock_span_context = dynamic_cast<const MockSpanContext*>(&span_context); | |
27 | if (mock_span_context == nullptr) { | |
28 | return opentracing::make_unexpected( | |
29 | opentracing::invalid_span_context_error); | |
30 | } | |
31 | return mock_span_context->Inject(propagation_options, writer); | |
32 | } | |
33 | ||
34 | template <class Carrier> | |
35 | opentracing::expected<std::unique_ptr<opentracing::SpanContext>> ExtractImpl( | |
36 | const PropagationOptions& propagation_options, Carrier& reader) { | |
37 | if (propagation_options.extract_error_code.value() != 0) { | |
38 | return opentracing::make_unexpected(propagation_options.extract_error_code); | |
39 | } | |
40 | MockSpanContext* mock_span_context; | |
41 | try { | |
42 | mock_span_context = new MockSpanContext{}; | |
43 | } catch (const std::bad_alloc&) { | |
44 | return opentracing::make_unexpected( | |
45 | make_error_code(std::errc::not_enough_memory)); | |
46 | } | |
47 | std::unique_ptr<opentracing::SpanContext> span_context(mock_span_context); | |
48 | auto result = mock_span_context->Extract(propagation_options, reader); | |
49 | if (!result) { | |
50 | return opentracing::make_unexpected(result.error()); | |
51 | } | |
52 | if (!*result) { | |
53 | span_context.reset(); | |
54 | } | |
55 | return std::move(span_context); | |
56 | } | |
57 | ||
58 | MockTracer::MockTracer(MockTracerOptions&& options) | |
59 | : recorder_{std::move(options.recorder)}, | |
60 | propagation_options_{std::move(options.propagation_options)} {} | |
61 | ||
62 | std::unique_ptr<Span> MockTracer::StartSpanWithOptions( | |
63 | string_view operation_name, const StartSpanOptions& options) const | |
64 | noexcept try { | |
65 | return std::unique_ptr<Span>{new MockSpan{shared_from_this(), recorder_.get(), | |
66 | operation_name, options}}; | |
67 | } catch (const std::exception& e) { | |
68 | fprintf(stderr, "Failed to start span: %s\n", e.what()); | |
69 | return nullptr; | |
70 | } | |
71 | ||
72 | void MockTracer::Close() noexcept { | |
73 | if (recorder_ != nullptr) { | |
74 | recorder_->Close(); | |
75 | } | |
76 | } | |
77 | ||
78 | expected<void> MockTracer::Inject(const SpanContext& sc, | |
79 | std::ostream& writer) const { | |
80 | return InjectImpl(propagation_options_, sc, writer); | |
81 | } | |
82 | ||
83 | expected<void> MockTracer::Inject(const SpanContext& sc, | |
84 | const TextMapWriter& writer) const { | |
85 | return InjectImpl(propagation_options_, sc, writer); | |
86 | } | |
87 | ||
88 | expected<void> MockTracer::Inject(const SpanContext& sc, | |
89 | const HTTPHeadersWriter& writer) const { | |
90 | return InjectImpl(propagation_options_, sc, writer); | |
91 | } | |
92 | ||
93 | expected<std::unique_ptr<SpanContext>> MockTracer::Extract( | |
94 | std::istream& reader) const { | |
95 | return ExtractImpl(propagation_options_, reader); | |
96 | } | |
97 | ||
98 | expected<std::unique_ptr<SpanContext>> MockTracer::Extract( | |
99 | const TextMapReader& reader) const { | |
100 | return ExtractImpl(propagation_options_, reader); | |
101 | } | |
102 | ||
103 | expected<std::unique_ptr<SpanContext>> MockTracer::Extract( | |
104 | const HTTPHeadersReader& reader) const { | |
105 | return ExtractImpl(propagation_options_, reader); | |
106 | } | |
107 | } // namespace mocktracer | |
108 | END_OPENTRACING_ABI_NAMESPACE | |
109 | } // namespace opentracing |