// // 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 #include #include #include #include #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 expected_encoded_field; }; using StructuredProtoTest = TestWithParam; 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 buf; buf.resize(1024); absl::Span 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({ { "Varint", { 42, StructuredProtoField::Value{ absl::in_place_type, int32_t{23}, }, }, {'\xD0', '\x02', '\x17'}, }, { "I64", { 42, StructuredProtoField::Value{ absl::in_place_type, 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, int32_t{23}, }, }, {'\xD5', '\x02', '\x17', '\x00', '\x00', '\x00'}, }, }), [](const testing::TestParamInfo& info) { return info.param.test_name; }); } // namespace } // namespace log_internal ABSL_NAMESPACE_END } // namespace absl