Skip to content

Commit 9811f8c

Browse files
committed
Unit tests
1 parent 16d532b commit 9811f8c

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ add_executable(tests
2222
test_datadog_agent.cpp
2323
test_glob.cpp
2424
test_limiter.cpp
25+
test_metrics.cpp
2526
test_msgpack.cpp
2627
test_parse_util.cpp
2728
test_smoke.cpp
@@ -30,6 +31,7 @@ add_executable(tests
3031
test_trace_id.cpp
3132
test_trace_segment.cpp
3233
test_tracer_config.cpp
34+
test_tracer_telemetry.cpp
3335
test_tracer.cpp
3436
test_trace_sampler.cpp
3537
)

test/test_metrics.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// This test covers operations defined for metrics defined in `metrics.h`.
2+
3+
#include <datadog/metrics.h>
4+
5+
#include "test.h"
6+
7+
using namespace datadog::tracing;
8+
9+
TEST_CASE("Counter metrics") {
10+
CounterMetric metric = {"test.counter.metric", {"testing-testing:123"}, true};
11+
12+
metric.inc();
13+
metric.add(41);
14+
REQUIRE(metric.value() == 42);
15+
auto captured_value = metric.capture_and_reset_value();
16+
REQUIRE(captured_value == 42);
17+
REQUIRE(metric.value() == 0);
18+
}
19+
20+
TEST_CASE("Gauge metrics") {
21+
GaugeMetric metric = {"test.gauge.metric", {"testing-testing:123"}, true};
22+
23+
metric.inc();
24+
metric.add(50);
25+
metric.sub(8);
26+
metric.dec();
27+
REQUIRE(metric.value() == 42);
28+
auto captured_value = metric.capture_and_reset_value();
29+
REQUIRE(captured_value == 42);
30+
REQUIRE(metric.value() == 0);
31+
32+
metric.add(10);
33+
metric.sub(11);
34+
REQUIRE(metric.value() == 0);
35+
}

test/test_tracer_telemetry.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// These are tests for `TracerTelemetry`. TracerTelemetry is used to measure
2+
// activity in other parts of the tracer implementation, and construct messages
3+
// that are sent to the datadog agent.
4+
5+
#include <datadog/span_defaults.h>
6+
#include <datadog/tracer_telemetry.h>
7+
8+
#include <datadog/json.hpp>
9+
10+
#include "mocks/loggers.h"
11+
#include "test.h"
12+
13+
using namespace datadog::tracing;
14+
15+
TEST_CASE("Tracer telemetry") {
16+
const std::time_t mock_time = 1672484400;
17+
const Clock clock = [mock_time]() {
18+
TimePoint result;
19+
result.wall = std::chrono::system_clock::from_time_t(mock_time);
20+
return result;
21+
};
22+
auto logger = std::make_shared<MockLogger>();
23+
auto span_defaults = std::make_shared<SpanDefaults>();
24+
span_defaults->service = "testsvc";
25+
span_defaults->environment = "test";
26+
TracerTelemetry tracer_telemetry = {true, clock, logger, span_defaults};
27+
28+
SECTION("generates app-started message") {
29+
auto app_started_message =
30+
tracer_telemetry.app_started(nlohmann::json::object());
31+
auto app_started = nlohmann::json::parse(app_started_message);
32+
REQUIRE(app_started["request_type"] == "app-started");
33+
}
34+
35+
SECTION("generates a heartbeat message") {
36+
auto heartbeat_message = tracer_telemetry.heartbeat_and_telemetry();
37+
auto message_batch = nlohmann::json::parse(heartbeat_message);
38+
REQUIRE(message_batch["payload"].size() == 1);
39+
auto heartbeat = message_batch["payload"][0];
40+
REQUIRE(heartbeat["request_type"] == "app-heartbeat");
41+
}
42+
43+
SECTION("captures metrics and sends generate-metrics payload") {
44+
tracer_telemetry.metrics().tracer.trace_segments_created_new.inc();
45+
REQUIRE(
46+
tracer_telemetry.metrics().tracer.trace_segments_created_new.value() ==
47+
1);
48+
tracer_telemetry.capture_metrics();
49+
REQUIRE(
50+
tracer_telemetry.metrics().tracer.trace_segments_created_new.value() ==
51+
0);
52+
auto heartbeat_and_telemetry_message =
53+
tracer_telemetry.heartbeat_and_telemetry();
54+
auto message_batch = nlohmann::json::parse(heartbeat_and_telemetry_message);
55+
REQUIRE(message_batch["payload"].size() == 2);
56+
auto generate_metrics = message_batch["payload"][1];
57+
REQUIRE(generate_metrics["request_type"] == "generate-metrics");
58+
auto payload = generate_metrics["payload"];
59+
auto series = payload["series"];
60+
REQUIRE(series.size() == 1);
61+
auto metric = series[0];
62+
REQUIRE(metric["metric"] == "trace_segments_created");
63+
auto tags = metric["tags"];
64+
REQUIRE(tags.size() == 1);
65+
REQUIRE(tags[0] == "new_continued:new");
66+
auto points = metric["points"];
67+
REQUIRE(points.size() == 1);
68+
REQUIRE(points[0][0] == mock_time);
69+
REQUIRE(points[0][1] == 1);
70+
}
71+
72+
SECTION("generates an app-closing event") {
73+
auto app_closing_message = tracer_telemetry.app_closing();
74+
auto message_batch = nlohmann::json::parse(app_closing_message);
75+
REQUIRE(message_batch["payload"].size() == 1);
76+
auto heartbeat = message_batch["payload"][0];
77+
REQUIRE(heartbeat["request_type"] == "app-closing");
78+
}
79+
}

0 commit comments

Comments
 (0)