OptionalBlobEncoder encode empty string on no input.

Bug: webrtc:14801
Change-Id: I934849322294ae10f0d7cd405e73bc48892543c9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/296661
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39502}
This commit is contained in:
philipel 2023-03-08 12:45:19 +01:00 committed by WebRTC LUCI CQ
parent f4dfa1ce01
commit f3e90cd03a
2 changed files with 33 additions and 6 deletions

View File

@ -35,6 +35,10 @@ std::string EncodeOptionalBlobs(
} }
} }
if (num_blobs_present == 0) {
return {};
}
const bool all_blobs_present = num_blobs_present == blobs.size(); const bool all_blobs_present = num_blobs_present == blobs.size();
if (!all_blobs_present) { if (!all_blobs_present) {
reserve_size_bits += blobs.size(); reserve_size_bits += blobs.size();
@ -74,11 +78,11 @@ std::string EncodeOptionalBlobs(
std::vector<absl::optional<std::string>> DecodeOptionalBlobs( std::vector<absl::optional<std::string>> DecodeOptionalBlobs(
absl::string_view encoded_blobs, absl::string_view encoded_blobs,
size_t num_of_blobs) { size_t num_of_blobs) {
std::vector<absl::optional<std::string>> res(num_of_blobs);
if (encoded_blobs.empty() || num_of_blobs == 0) { if (encoded_blobs.empty() || num_of_blobs == 0) {
return {}; return res;
} }
std::vector<absl::optional<std::string>> res(num_of_blobs);
BitstreamReader reader(encoded_blobs); BitstreamReader reader(encoded_blobs);
const bool all_blobs_present = reader.ReadBit(); const bool all_blobs_present = reader.ReadBit();

View File

@ -86,7 +86,19 @@ TEST(OptionalBlobEncoding, SomeBlobsPresent) {
TEST(OptionalBlobEncoding, NoBlobsPresent) { TEST(OptionalBlobEncoding, NoBlobsPresent) {
std::string encoded = std::string encoded =
EncodeOptionalBlobs({absl::nullopt, absl::nullopt, absl::nullopt}); EncodeOptionalBlobs({absl::nullopt, absl::nullopt, absl::nullopt});
std::string expected = BitBuilder().Bit(0).Bit(0).Bit(0).Bit(0).AsString(); EXPECT_THAT(encoded, IsEmpty());
}
TEST(OptionalBlobEncoding, EmptyBlobsPresent) {
std::string encoded = EncodeOptionalBlobs({absl::nullopt, "", absl::nullopt});
std::string expected = BitBuilder()
.Bit(0)
.Bit(0)
.Bit(1)
.Bit(0)
.ByteAlign()
.Bytes({0x0})
.AsString();
EXPECT_EQ(encoded, expected); EXPECT_EQ(encoded, expected);
} }
@ -138,13 +150,24 @@ TEST(OptionalBlobDecoding, SomeBlobsPresent) {
} }
TEST(OptionalBlobDecoding, NoBlobsPresent) { TEST(OptionalBlobDecoding, NoBlobsPresent) {
std::string encoded = auto decoded = DecodeOptionalBlobs("", 3);
BitBuilder().Bit(0).Bit(0).Bit(0).Bit(0).ByteAlign().AsString();
auto decoded = DecodeOptionalBlobs(encoded, 3);
EXPECT_THAT(decoded, EXPECT_THAT(decoded,
ElementsAre(absl::nullopt, absl::nullopt, absl::nullopt)); ElementsAre(absl::nullopt, absl::nullopt, absl::nullopt));
} }
TEST(OptionalBlobDecoding, EmptyBlobsPresent) {
std::string encoded = BitBuilder()
.Bit(0)
.Bit(0)
.Bit(1)
.Bit(0)
.ByteAlign()
.Bytes({0x0})
.AsString();
auto decoded = DecodeOptionalBlobs(encoded, 3);
EXPECT_THAT(decoded, ElementsAre(absl::nullopt, "", absl::nullopt));
}
TEST(OptionalBlobDecoding, ZeroBlobs) { TEST(OptionalBlobDecoding, ZeroBlobs) {
std::string encoded; std::string encoded;
auto decoded = DecodeOptionalBlobs(encoded, 0); auto decoded = DecodeOptionalBlobs(encoded, 0);