Source code

Revision control

Copy as Markdown

Other Tools

//
// Copyright 2024 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "absl/log/internal/structured_proto.h"
#include <cstddef>
#include <cstdint>
#include <string>
#include <utility>
#include <vector>
#include "gtest/gtest.h"
#include "absl/base/config.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "absl/utility/utility.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace log_internal {
namespace {
using ::testing::TestWithParam;
struct StructuredProtoTestCase {
std::string test_name;
StructuredProtoField field;
std::vector<char> expected_encoded_field;
};
using StructuredProtoTest = TestWithParam<StructuredProtoTestCase>;
TEST_P(StructuredProtoTest, Encoding) {
const StructuredProtoTestCase& test_case = GetParam();
// Greater than or equal to since BufferSizeForStructuredProtoField() is just
// an estimate of the data size and not an exact measurement.
ASSERT_GE(BufferSizeForStructuredProtoField(test_case.field),
test_case.expected_encoded_field.size());
std::vector<char> buf;
buf.resize(1024);
absl::Span<char> buf_span(buf);
EXPECT_TRUE(EncodeStructuredProtoField(test_case.field, buf_span));
size_t encoded_field_size = buf.size() - buf_span.size();
ASSERT_EQ(encoded_field_size, test_case.expected_encoded_field.size());
buf.resize(encoded_field_size);
EXPECT_EQ(buf, test_case.expected_encoded_field);
}
INSTANTIATE_TEST_SUITE_P(
StructuredProtoTestSuiteInstantiation,
StructuredProtoTest, // This is the name of your parameterized test
testing::ValuesIn<StructuredProtoTestCase>({
{
"Varint",
{
42,
StructuredProtoField::Value{
absl::in_place_type<StructuredProtoField::Varint>,
int32_t{23},
},
},
{'\xD0', '\x02', '\x17'},
},
{
"I64",
{
42,
StructuredProtoField::Value{
absl::in_place_type<StructuredProtoField::I64>,
int64_t{23},
},
},
{'\xD1', '\x02', '\x17', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00'},
},
{
"LengthDelimited",
{
42,
// Use a string_view so the terminating NUL is excluded.
absl::string_view("Hello"),
},
{'\xD2', '\x02', '\x05', 'H', 'e', 'l', 'l', 'o'},
},
{
"I32",
{
42,
StructuredProtoField::Value{
absl::in_place_type<StructuredProtoField::I32>,
int32_t{23},
},
},
{'\xD5', '\x02', '\x17', '\x00', '\x00', '\x00'},
},
}),
[](const testing::TestParamInfo<StructuredProtoTest::ParamType>& info) {
return info.param.test_name;
});
} // namespace
} // namespace log_internal
ABSL_NAMESPACE_END
} // namespace absl