Skip to content

Commit 100293f

Browse files
authored
impl(pubsub): add friend function to return an attribute value (#12722)
1 parent 3d4244d commit 100293f

File tree

3 files changed

+79
-49
lines changed

3 files changed

+79
-49
lines changed

google/cloud/pubsub/message.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,21 @@ namespace google {
2222
namespace cloud {
2323
namespace pubsub_internal {
2424
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
25+
26+
::google::pubsub::v1::PubsubMessage const& ToProto(pubsub::Message const& m) {
27+
return m.proto_;
28+
}
29+
30+
::google::pubsub::v1::PubsubMessage&& ToProto(pubsub::Message&& m) {
31+
return std::move(m.proto_);
32+
}
33+
34+
pubsub::Message FromProto(::google::pubsub::v1::PubsubMessage m) {
35+
return pubsub::Message(std::move(m));
36+
}
37+
38+
std::size_t MessageSize(pubsub::Message const& m) { return m.MessageSize(); }
39+
2540
std::size_t MessageProtoSize(::google::pubsub::v1::PubsubMessage const& m) {
2641
// see https://cloud.google.com/pubsub/pricing
2742
auto constexpr kTimestampOverhead = 20;
@@ -33,6 +48,20 @@ std::size_t MessageProtoSize(::google::pubsub::v1::PubsubMessage const& m) {
3348
}
3449
return s;
3550
}
51+
52+
void SetAttribute(std::string const& key, std::string value,
53+
pubsub::Message& m) {
54+
(*m.proto_.mutable_attributes())[key] = std::move(value);
55+
}
56+
57+
std::string GetAttribute(std::string const& key, pubsub::Message& m) {
58+
auto value = m.proto_.attributes().find(key);
59+
if (value != m.proto_.attributes().end()) {
60+
return value->second;
61+
}
62+
return std::string{};
63+
}
64+
3665
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
3766
} // namespace pubsub_internal
3867

google/cloud/pubsub/message.h

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,13 @@ ::google::pubsub::v1::PubsubMessage&& ToProto(pubsub::Message&&);
3838
pubsub::Message FromProto(::google::pubsub::v1::PubsubMessage);
3939
/// Estimate the size of a message.
4040
std::size_t MessageSize(pubsub::Message const&);
41+
std::size_t MessageProtoSize(::google::pubsub::v1::PubsubMessage const& m);
4142
// For Open Telemetry tracing only. Inserts or sets an attribute on the message.
4243
void SetAttribute(std::string const& key, std::string value, pubsub::Message&);
44+
// For Open Telemetry tracing only. Gets the value for a given attribute key on
45+
// the message.
46+
std::string GetAttribute(std::string const& key, pubsub::Message& m);
47+
4348
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
4449
} // namespace pubsub_internal
4550

@@ -128,6 +133,8 @@ class Message {
128133
friend void pubsub_internal::SetAttribute(std::string const& key,
129134
std::string value,
130135
pubsub::Message&);
136+
friend std::string pubsub_internal::GetAttribute(std::string const& key,
137+
pubsub::Message&);
131138

132139
/// Construct `Message` objects.
133140
friend class MessageBuilder;
@@ -267,35 +274,6 @@ class MessageBuilder {
267274

268275
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
269276
} // namespace pubsub
270-
271-
namespace pubsub_internal {
272-
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
273-
inline ::google::pubsub::v1::PubsubMessage const& ToProto(
274-
pubsub::Message const& m) {
275-
return m.proto_;
276-
}
277-
278-
inline ::google::pubsub::v1::PubsubMessage&& ToProto(pubsub::Message&& m) {
279-
return std::move(m.proto_);
280-
}
281-
282-
inline pubsub::Message FromProto(::google::pubsub::v1::PubsubMessage m) {
283-
return pubsub::Message(std::move(m));
284-
}
285-
286-
inline std::size_t MessageSize(pubsub::Message const& m) {
287-
return m.MessageSize();
288-
}
289-
290-
std::size_t MessageProtoSize(::google::pubsub::v1::PubsubMessage const& m);
291-
292-
inline void SetAttribute(std::string const& key, std::string value,
293-
pubsub::Message& m) {
294-
(*m.proto_.mutable_attributes())[key] = std::move(value);
295-
}
296-
297-
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
298-
} // namespace pubsub_internal
299277
} // namespace cloud
300278
} // namespace google
301279

google/cloud/pubsub/message_test.cc

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "google/cloud/testing_util/is_proto_equal.h"
1717
#include <google/protobuf/text_format.h>
1818
#include <gmock/gmock.h>
19+
#include <gtest/gtest.h>
1920
#include <sstream>
2021
#include <tuple>
2122

@@ -27,21 +28,24 @@ namespace {
2728

2829
using ::google::cloud::testing_util::IsProtoEqual;
2930
using ::testing::HasSubstr;
31+
using ::testing::IsEmpty;
3032
using ::testing::Pair;
3133
using ::testing::UnorderedElementsAre;
3234

3335
TEST(Message, Empty) {
3436
auto const m = MessageBuilder{}.Build();
35-
EXPECT_TRUE(m.data().empty());
36-
EXPECT_TRUE(m.attributes().empty());
37+
EXPECT_THAT(m.data(), IsEmpty());
38+
39+
EXPECT_THAT(m.attributes(), IsEmpty());
3740
}
3841

3942
TEST(Message, SetDataSimple) {
4043
auto const m0 = MessageBuilder{}.SetData("contents-0").Build();
4144
EXPECT_EQ("contents-0", m0.data());
42-
EXPECT_TRUE(m0.attributes().empty());
43-
EXPECT_TRUE(m0.ordering_key().empty());
44-
EXPECT_TRUE(m0.message_id().empty());
45+
EXPECT_THAT(m0.attributes(), IsEmpty());
46+
EXPECT_THAT(m0.ordering_key(), IsEmpty());
47+
48+
EXPECT_THAT(m0.message_id(), IsEmpty());
4549

4650
auto const m1 = MessageBuilder{}.SetData("contents-1").Build();
4751
EXPECT_EQ("contents-1", m1.data());
@@ -56,9 +60,10 @@ TEST(Message, SetDataSimple) {
5660
TEST(Message, SetOrderingKey) {
5761
auto const m0 = MessageBuilder{}.SetOrderingKey("key-0").Build();
5862
EXPECT_EQ("key-0", m0.ordering_key());
59-
EXPECT_TRUE(m0.attributes().empty());
60-
EXPECT_TRUE(m0.data().empty());
61-
EXPECT_TRUE(m0.message_id().empty());
63+
EXPECT_THAT(m0.attributes(), IsEmpty());
64+
EXPECT_THAT(m0.data(), IsEmpty());
65+
66+
EXPECT_THAT(m0.message_id(), IsEmpty());
6267

6368
auto const m1 = MessageBuilder{}.SetOrderingKey("key-1").Build();
6469
EXPECT_EQ("key-1", m1.ordering_key());
@@ -76,11 +81,13 @@ TEST(Message, InsertAttributeSimple) {
7681
.InsertAttribute("k2", "v2")
7782
.InsertAttribute("k2", "v3")
7883
.Build();
79-
EXPECT_TRUE(m0.data().empty());
84+
EXPECT_THAT(m0.data(), IsEmpty());
85+
8086
EXPECT_THAT(m0.attributes(),
8187
UnorderedElementsAre(Pair("k1", "v1"), Pair("k2", "v2")));
82-
EXPECT_TRUE(m0.ordering_key().empty());
83-
EXPECT_TRUE(m0.message_id().empty());
88+
EXPECT_THAT(m0.ordering_key(), IsEmpty());
89+
90+
EXPECT_THAT(m0.message_id(), IsEmpty());
8491
}
8592

8693
TEST(Message, SetAttributeSimple) {
@@ -89,11 +96,13 @@ TEST(Message, SetAttributeSimple) {
8996
.SetAttribute("k2", "v2")
9097
.SetAttribute("k2", "v3")
9198
.Build();
92-
EXPECT_TRUE(m0.data().empty());
99+
EXPECT_THAT(m0.data(), IsEmpty());
100+
93101
EXPECT_THAT(m0.attributes(),
94102
UnorderedElementsAre(Pair("k1", "v1"), Pair("k2", "v3")));
95-
EXPECT_TRUE(m0.ordering_key().empty());
96-
EXPECT_TRUE(m0.message_id().empty());
103+
EXPECT_THAT(m0.ordering_key(), IsEmpty());
104+
105+
EXPECT_THAT(m0.message_id(), IsEmpty());
97106
}
98107

99108
TEST(Message, SetAttributesIteratorSimple) {
@@ -103,21 +112,25 @@ TEST(Message, SetAttributesIteratorSimple) {
103112
auto const m0 = MessageBuilder{}
104113
.SetAttributes(attributes.begin(), attributes.end())
105114
.Build();
106-
EXPECT_TRUE(m0.data().empty());
115+
EXPECT_THAT(m0.data(), IsEmpty());
116+
107117
EXPECT_THAT(m0.attributes(),
108118
UnorderedElementsAre(Pair("k1", "v1"), Pair("k2", "v2")));
109-
EXPECT_TRUE(m0.ordering_key().empty());
110-
EXPECT_TRUE(m0.message_id().empty());
119+
EXPECT_THAT(m0.ordering_key(), IsEmpty());
120+
121+
EXPECT_THAT(m0.message_id(), IsEmpty());
111122
}
112123

113124
TEST(Message, SetAttributesVectorStdPairSimple) {
114125
auto const m0 =
115126
MessageBuilder{}.SetAttributes({{"k0", "v0"}, {"k1", "v1"}}).Build();
116-
EXPECT_TRUE(m0.data().empty());
127+
EXPECT_THAT(m0.data(), IsEmpty());
128+
117129
EXPECT_THAT(m0.attributes(),
118130
UnorderedElementsAre(Pair("k0", "v0"), Pair("k1", "v1")));
119-
EXPECT_TRUE(m0.ordering_key().empty());
120-
EXPECT_TRUE(m0.message_id().empty());
131+
EXPECT_THAT(m0.ordering_key(), IsEmpty());
132+
133+
EXPECT_THAT(m0.message_id(), IsEmpty());
121134
}
122135

123136
TEST(Message, SetAttributesVectorStdTupleSimple) {
@@ -263,6 +276,16 @@ TEST(Message, SetAttributeFriend) {
263276
UnorderedElementsAre(Pair("k1", "v1"), Pair("k2", "v3")));
264277
}
265278

279+
TEST(Message, GetAttributeFriend) {
280+
auto m0 = MessageBuilder{}.SetAttributes({{"k0", "v0"}}).Build();
281+
282+
auto const v0 = pubsub_internal::GetAttribute("k0", m0);
283+
auto const v1 = pubsub_internal::GetAttribute("k1", m0);
284+
285+
EXPECT_EQ(v0, "v0");
286+
EXPECT_THAT(v1, IsEmpty());
287+
}
288+
266289
} // namespace
267290
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
268291
} // namespace pubsub

0 commit comments

Comments
 (0)