Skip to content

Commit

Permalink
Change the test of StringBytesField and SecretDataBytesField by testi…
Browse files Browse the repository at this point in the history
…ng SerializeWithTagInto and GetSerializedSizeIncludingTag, instead of SerializeInto and GetSerializedSize.

We make GetSerializedSize and SerializeInto protected to ensure we have all instances. In upcoming CLs I will inline those.

PiperOrigin-RevId: 705154827
Change-Id: I5df9931ec854688805bd1e47e2716704a39161ba
  • Loading branch information
tholenst authored and copybara-github committed Dec 11, 2024
1 parent 853fcbe commit 4416be5
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 25 deletions.
7 changes: 4 additions & 3 deletions tink/internal/proto_parser_fields.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,10 @@ class BytesField : public Field<Struct> {
SizeOfStringLikeValue(values.*value_) != 0;
}

WireType GetWireType() const override { return WireType::kLengthDelimited; }
int GetFieldNumber() const override { return field_number_; }

protected:
absl::Status SerializeInto(SerializationState& out,
const Struct& values) const override {
size_t size = SizeOfStringLikeValue(values.*value_);
Expand All @@ -240,9 +244,6 @@ class BytesField : public Field<Struct> {
return VarintLength(size) + size;
}

WireType GetWireType() const override { return WireType::kLengthDelimited; }
int GetFieldNumber() const override { return field_number_; }

private:
StringLike Struct::*value_;
int field_number_;
Expand Down
73 changes: 51 additions & 22 deletions tink/internal/proto_parser_fields_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -399,10 +399,23 @@ TEST(StringBytesField, SerializeEmpty) {
s.string_member_1 = "";
std::string buffer = "a";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.GetSerializedSize(s), Eq(1));
EXPECT_THAT(field.SerializeInto(state, s), IsOk());
EXPECT_THAT(field.GetSerializedSizeIncludingTag(s), Eq(0));
EXPECT_THAT(field.SerializeWithTagInto(state, s), IsOk());
EXPECT_THAT(state.GetBuffer().size(), Eq(1));
}

TEST(StringBytesField, SerializeEmptyAlwaysSerialize) {
BytesField<ParsedStruct, std::string> field(
kBytesField1Number, &ParsedStruct::string_member_1,
ProtoFieldOptions::kAlwaysSerialize);
ParsedStruct s;
s.string_member_1 = "";
std::string buffer = "ab";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.GetSerializedSizeIncludingTag(s), Eq(2));
EXPECT_THAT(field.SerializeWithTagInto(state, s), IsOk());
EXPECT_THAT(state.GetBuffer().size(), Eq(0));
EXPECT_THAT(HexEncode(buffer), Eq("00"));
EXPECT_THAT(HexEncode(buffer), Eq("1a00"));
}

TEST(StringBytesField, SerializeNonEmpty) {
Expand All @@ -412,13 +425,14 @@ TEST(StringBytesField, SerializeNonEmpty) {
s.string_member_1 = "This is some text";
std::string buffer = "BUFFERBUFFERBUFFERBUFFER";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.GetSerializedSize(s), Eq(18));
EXPECT_THAT(field.SerializeInto(state, s), IsOk());
EXPECT_THAT(field.GetSerializedSizeIncludingTag(s), Eq(19));
EXPECT_THAT(field.SerializeWithTagInto(state, s), IsOk());
EXPECT_THAT(state.GetBuffer().size(),
Eq(buffer.size() - field.GetSerializedSize(s)));
EXPECT_THAT(&(state.GetBuffer())[0], Eq(&buffer[field.GetSerializedSize(s)]));
EXPECT_THAT(buffer, Eq(absl::StrCat(HexDecodeOrDie("11"), "This is some text",
"BUFFER")));
Eq(buffer.size() - field.GetSerializedSizeIncludingTag(s)));
EXPECT_THAT(&(state.GetBuffer())[0],
Eq(&buffer[field.GetSerializedSizeIncludingTag(s)]));
EXPECT_THAT(buffer, Eq(absl::StrCat(HexDecodeOrDie("1a11"),
"This is some text", "UFFER")));
}

TEST(StringBytesField, SerializeTooSmallBuffer) {
Expand All @@ -428,7 +442,7 @@ TEST(StringBytesField, SerializeTooSmallBuffer) {
s.string_member_1 = "This is some text";
std::string buffer = "BUFFERBUFFERBUFF";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.SerializeInto(state, s), Not(IsOk()));
EXPECT_THAT(field.SerializeWithTagInto(state, s), Not(IsOk()));
}

// The buffer won't even hold the varint.
Expand All @@ -439,7 +453,7 @@ TEST(StringBytesField, SerializeVerySmallBuffer) {
s.string_member_1 = "This is some text";
std::string buffer;
SerializationState buffer_span = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.SerializeInto(buffer_span, s), Not(IsOk()));
EXPECT_THAT(field.SerializeWithTagInto(buffer_span, s), Not(IsOk()));
}

TEST(StringBytesField, RequiresSerialization) {
Expand Down Expand Up @@ -527,10 +541,24 @@ TEST(SecretDataBytesField, SerializeEmpty) {
s.secret_data_member_1 = SecretDataFromStringView("");
std::string buffer = "a";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.GetSerializedSize(s), Eq(1));
EXPECT_THAT(field.SerializeInto(state, s), IsOk());
EXPECT_THAT(field.GetSerializedSizeIncludingTag(s), Eq(0));
EXPECT_THAT(field.SerializeWithTagInto(state, s), IsOk());
EXPECT_THAT(state.GetBuffer().size(), Eq(1));
EXPECT_THAT(HexEncode(buffer), Eq("61"));
}

TEST(SecretDataBytesField, SerializeEmptyAlwaysSerialize) {
BytesField<ParsedStruct, SecretData> field(
kBytesField1Number, &ParsedStruct::secret_data_member_1,
ProtoFieldOptions::kAlwaysSerialize);
ParsedStruct s;
s.secret_data_member_1 = SecretDataFromStringView("");
std::string buffer = "ab";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.GetSerializedSizeIncludingTag(s), Eq(2));
EXPECT_THAT(field.SerializeWithTagInto(state, s), IsOk());
EXPECT_THAT(state.GetBuffer().size(), Eq(0));
EXPECT_THAT(HexEncode(buffer), Eq("00"));
EXPECT_THAT(HexEncode(buffer), Eq("1a00"));
}

TEST(SecretDataBytesField, SerializeNonEmpty) {
Expand All @@ -540,13 +568,14 @@ TEST(SecretDataBytesField, SerializeNonEmpty) {
s.secret_data_member_1 = SecretDataFromStringView("This is some text");
std::string buffer = "BUFFERBUFFERBUFFERBUFFER";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.GetSerializedSize(s), Eq(18));
EXPECT_THAT(field.SerializeInto(state, s), IsOk());
EXPECT_THAT(field.GetSerializedSizeIncludingTag(s), Eq(19));
EXPECT_THAT(field.SerializeWithTagInto(state, s), IsOk());
EXPECT_THAT(state.GetBuffer().size(),
Eq(buffer.size() - field.GetSerializedSize(s)));
EXPECT_THAT(&(state.GetBuffer())[0], Eq(&buffer[field.GetSerializedSize(s)]));
EXPECT_THAT(buffer, Eq(absl::StrCat(HexDecodeOrDie("11"), "This is some text",
"BUFFER")));
Eq(buffer.size() - field.GetSerializedSizeIncludingTag(s)));
EXPECT_THAT(&(state.GetBuffer())[0],
Eq(&buffer[field.GetSerializedSizeIncludingTag(s)]));
EXPECT_THAT(buffer, Eq(absl::StrCat(HexDecodeOrDie("1a11"),
"This is some text", "UFFER")));
}

TEST(SecretDataBytesField, SerializeTooSmallBuffer) {
Expand All @@ -556,7 +585,7 @@ TEST(SecretDataBytesField, SerializeTooSmallBuffer) {
s.secret_data_member_1 = SecretDataFromStringView("This is some text");
std::string buffer = "BUFFERBUFFERBUFF";
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.SerializeInto(state, s), Not(IsOk()));
EXPECT_THAT(field.SerializeWithTagInto(state, s), Not(IsOk()));
}

// The buffer won't even hold the varint.
Expand All @@ -567,7 +596,7 @@ TEST(SecretDataBytesField, SerializeVerySmallBuffer) {
s.secret_data_member_1 = SecretDataFromStringView("This is some text");
std::string buffer;
SerializationState state = SerializationState(absl::MakeSpan(buffer));
EXPECT_THAT(field.SerializeInto(state, s), Not(IsOk()));
EXPECT_THAT(field.SerializeWithTagInto(state, s), Not(IsOk()));
}

TEST(SecretDataBytesField, RequiresSerialization) {
Expand Down

0 comments on commit 4416be5

Please sign in to comment.