| // | |
| // 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 | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // 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" | |
| 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{ | |
| std::in_place_type<StructuredProtoField::Varint>, | |
| int32_t{23}, | |
| }, | |
| }, | |
| {'\xD0', '\x02', '\x17'}, | |
| }, | |
| { | |
| "VarintBool", | |
| { | |
| 42, | |
| StructuredProtoField::Value{ | |
| std::in_place_type<StructuredProtoField::Varint>, | |
| true, | |
| }, | |
| }, | |
| {'\xD0', '\x02', '\x01'}, | |
| }, | |
| { | |
| "I64", | |
| { | |
| 42, | |
| StructuredProtoField::Value{ | |
| std::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{ | |
| std::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 |