Skip to content

Commit 4142882

Browse files
authored
impl(common): enhance DebugFormatter support (#11898)
- std::map<std::string, T> Also make the tests clearer by renaming the `SubMessage` field.
1 parent 8859070 commit 4142882

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

google/cloud/internal/debug_string.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,20 @@ class DebugFormatter {
9999
return *this;
100100
}
101101

102+
template <typename T>
103+
DebugFormatter& Field(absl::string_view field_name,
104+
std::map<std::string, T> const& value) {
105+
for (auto const& e : value) {
106+
absl::StrAppend(&str_, Sep(), field_name, " {");
107+
++indent_;
108+
absl::StrAppend(&str_, Sep(), "key: ", "\"", e.first, "\"");
109+
absl::StrAppend(&str_, e.second.DebugString("value", options_, indent_));
110+
--indent_;
111+
absl::StrAppend(&str_, Sep(), "}");
112+
}
113+
return *this;
114+
}
115+
102116
DebugFormatter& StringField(absl::string_view field_name, std::string value);
103117

104118
std::string Build();

google/cloud/internal/debug_string_test.cc

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ namespace internal {
2626
namespace {
2727

2828
struct SubMessage {
29-
double value;
29+
double sub_field;
3030

3131
std::string DebugString(absl::string_view name,
3232
TracingOptions const& options = {},
3333
int indent = 0) const {
34-
return DebugFormatter(name, options, indent).Field("value", value).Build();
34+
return DebugFormatter(name, options, indent)
35+
.Field("sub_field", sub_field)
36+
.Build();
3537
}
3638
};
3739

@@ -46,7 +48,7 @@ TEST(DebugFormatter, SingleLine) {
4648
R"(message_name {)"
4749
R"( field1: 42)"
4850
R"( sub_message {)"
49-
R"( value: 3.14159)"
51+
R"( sub_field: 3.14159)"
5052
R"( })"
5153
R"( field2: "foobar")"
5254
R"( field3: true)"
@@ -64,7 +66,7 @@ TEST(DebugFormatter, MultiLine) {
6466
R"(message_name {
6567
field1: 42
6668
sub_message {
67-
value: 3.14159
69+
sub_field: 3.14159
6870
}
6971
field2: "foobar"
7072
field3: true
@@ -83,7 +85,7 @@ TEST(DebugFormatter, Truncated) {
8385
R"(message_name {)"
8486
R"( field1: 42)"
8587
R"( sub_message {)"
86-
R"( value: 3.14159)"
88+
R"( sub_field: 3.14159)"
8789
R"( })"
8890
R"( field2: "foo...<truncated>...")"
8991
R"( field3: true)"
@@ -131,6 +133,34 @@ TEST(DebugFormatter, Duration) {
131133
}
132134

133135
TEST(DebugFormatter, Map) {
136+
std::map<std::string, SubMessage> m = {{"k1", SubMessage{3.1}},
137+
{"k2", SubMessage{4.2}}};
138+
EXPECT_EQ(DebugFormatter("message_name", TracingOptions{})
139+
.Field("field1", m)
140+
.Build(),
141+
R"(message_name {)"
142+
R"( field1 {)"
143+
R"( key: "k1")"
144+
R"( value {)"
145+
R"( sub_field: 3.1)"
146+
R"( })"
147+
R"( })"
148+
R"( field1 {)"
149+
R"( key: "k2")"
150+
R"( value {)"
151+
R"( sub_field: 4.2)"
152+
R"( })"
153+
R"( })"
154+
R"( })");
155+
m.clear();
156+
EXPECT_EQ(DebugFormatter("message_name", TracingOptions{})
157+
.Field("field1", m)
158+
.Build(),
159+
R"(message_name {)"
160+
R"( })");
161+
}
162+
163+
TEST(DebugFormatter, MapString) {
134164
std::map<std::string, std::string> m = {{"k1", "v1"}, {"k2", "v2"}};
135165
EXPECT_EQ(DebugFormatter("message_name", TracingOptions{})
136166
.Field("field1", m)
@@ -183,7 +213,7 @@ TEST(DebugFormatter, Optional) {
183213
.Build(),
184214
R"(message_name {)"
185215
R"( field1 {)"
186-
R"( value: 3.14159)"
216+
R"( sub_field: 3.14159)"
187217
R"( })"
188218
R"( })");
189219
m = absl::nullopt;
@@ -201,13 +231,13 @@ TEST(DebugFormatter, Vector) {
201231
.Build(),
202232
R"(message_name {)"
203233
R"( field1 {)"
204-
R"( value: 1)"
234+
R"( sub_field: 1)"
205235
R"( })"
206236
R"( field1 {)"
207-
R"( value: 2)"
237+
R"( sub_field: 2)"
208238
R"( })"
209239
R"( field1 {)"
210-
R"( value: 3)"
240+
R"( sub_field: 3)"
211241
R"( })"
212242
R"( })");
213243
v.clear();

0 commit comments

Comments
 (0)