blob: f9b5db64fffcceaffd17c62cd02a3a17361e870d [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* 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
*
* http://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 "src/trace_processor/util/protozero_to_text.h"
#include "perfetto/ext/base/string_utils.h"
#include "perfetto/protozero/scattered_heap_buffer.h"
#include "src/protozero/test/example_proto/test_messages.pbzero.h"
#include "src/trace_processor/importers/proto/track_event.descriptor.h"
#include "src/trace_processor/test_messages.descriptor.h"
#include "src/trace_processor/util/descriptors.h"
#include "test/gtest_and_gmock.h"
#include "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pbzero.h"
#include "protos/perfetto/trace/track_event/track_event.pbzero.h"
namespace perfetto {
namespace trace_processor {
namespace protozero_to_text {
namespace {
constexpr size_t kChunkSize = 42;
using ::protozero::test::protos::pbzero::EveryField;
using ::protozero::test::protos::pbzero::PackedRepeatedFields;
using ::testing::_;
using ::testing::ElementsAre;
using ::testing::Eq;
using ::testing::StartsWith;
TEST(ProtozeroToTextTest, TrackEventBasic) {
using perfetto::protos::pbzero::TrackEvent;
protozero::HeapBuffered<TrackEvent> msg{kChunkSize, kChunkSize};
msg->set_track_uuid(4);
msg->set_timestamp_delta_us(3);
auto binary_proto = msg.SerializeAsArray();
EXPECT_EQ(
"track_uuid: 4\ntimestamp_delta_us: 3",
DebugTrackEventProtozeroToText(
".perfetto.protos.TrackEvent",
protozero::ConstBytes{binary_proto.data(), binary_proto.size()}));
EXPECT_EQ(
"track_uuid: 4 timestamp_delta_us: 3",
ShortDebugTrackEventProtozeroToText(
".perfetto.protos.TrackEvent",
protozero::ConstBytes{binary_proto.data(), binary_proto.size()}));
}
TEST(ProtozeroToTextTest, TrackEventNestedMsg) {
using perfetto::protos::pbzero::TrackEvent;
protozero::HeapBuffered<TrackEvent> msg{kChunkSize, kChunkSize};
msg->set_track_uuid(4);
auto* state = msg->set_cc_scheduler_state();
state->set_deadline_us(7);
auto* machine = state->set_state_machine();
auto* minor_state = machine->set_minor_state();
minor_state->set_commit_count(8);
state->set_observing_begin_frame_source(true);
msg->set_timestamp_delta_us(3);
auto binary_proto = msg.SerializeAsArray();
EXPECT_EQ(
R"(track_uuid: 4
cc_scheduler_state {
deadline_us: 7
state_machine {
minor_state {
commit_count: 8
}
}
observing_begin_frame_source: true
}
timestamp_delta_us: 3)",
DebugTrackEventProtozeroToText(
".perfetto.protos.TrackEvent",
protozero::ConstBytes{binary_proto.data(), binary_proto.size()}));
EXPECT_EQ(
"track_uuid: 4 cc_scheduler_state { deadline_us: 7 state_machine { "
"minor_state { commit_count: 8 } } observing_begin_frame_source: true } "
"timestamp_delta_us: 3",
ShortDebugTrackEventProtozeroToText(
".perfetto.protos.TrackEvent",
protozero::ConstBytes{binary_proto.data(), binary_proto.size()}));
}
TEST(ProtozeroToTextTest, TrackEventEnumNames) {
using perfetto::protos::pbzero::TrackEvent;
protozero::HeapBuffered<TrackEvent> msg{kChunkSize, kChunkSize};
msg->set_type(TrackEvent::TYPE_SLICE_BEGIN);
auto binary_proto = msg.SerializeAsArray();
EXPECT_EQ(
"type: TYPE_SLICE_BEGIN",
DebugTrackEventProtozeroToText(
".perfetto.protos.TrackEvent",
protozero::ConstBytes{binary_proto.data(), binary_proto.size()}));
EXPECT_EQ(
"type: TYPE_SLICE_BEGIN",
DebugTrackEventProtozeroToText(
".perfetto.protos.TrackEvent",
protozero::ConstBytes{binary_proto.data(), binary_proto.size()}));
}
TEST(ProtozeroToTextTest, CustomDescriptorPoolBasic) {
using perfetto::protos::pbzero::TrackEvent;
protozero::HeapBuffered<TrackEvent> msg{kChunkSize, kChunkSize};
msg->set_track_uuid(4);
msg->set_timestamp_delta_us(3);
auto binary_proto = msg.SerializeAsArray();
DescriptorPool pool;
auto status = pool.AddFromFileDescriptorSet(kTrackEventDescriptor.data(),
kTrackEventDescriptor.size());
ASSERT_TRUE(status.ok());
EXPECT_EQ("track_uuid: 4\ntimestamp_delta_us: 3",
ProtozeroToText(pool, ".perfetto.protos.TrackEvent", binary_proto,
kIncludeNewLines));
EXPECT_EQ("track_uuid: 4 timestamp_delta_us: 3",
ProtozeroToText(pool, ".perfetto.protos.TrackEvent", binary_proto,
kSkipNewLines));
}
TEST(ProtozeroToTextTest, CustomDescriptorPoolNestedMsg) {
using perfetto::protos::pbzero::TrackEvent;
protozero::HeapBuffered<TrackEvent> msg{kChunkSize, kChunkSize};
msg->set_track_uuid(4);
auto* state = msg->set_cc_scheduler_state();
state->set_deadline_us(7);
auto* machine = state->set_state_machine();
auto* minor_state = machine->set_minor_state();
minor_state->set_commit_count(8);
state->set_observing_begin_frame_source(true);
msg->set_timestamp_delta_us(3);
auto binary_proto = msg.SerializeAsArray();
DescriptorPool pool;
auto status = pool.AddFromFileDescriptorSet(kTrackEventDescriptor.data(),
kTrackEventDescriptor.size());
ASSERT_TRUE(status.ok());
EXPECT_EQ(
R"(track_uuid: 4
cc_scheduler_state {
deadline_us: 7
state_machine {
minor_state {
commit_count: 8
}
}
observing_begin_frame_source: true
}
timestamp_delta_us: 3)",
ProtozeroToText(pool, ".perfetto.protos.TrackEvent", binary_proto,
kIncludeNewLines));
EXPECT_EQ(
"track_uuid: 4 cc_scheduler_state { deadline_us: 7 state_machine { "
"minor_state { commit_count: 8 } } observing_begin_frame_source: true } "
"timestamp_delta_us: 3",
ProtozeroToText(pool, ".perfetto.protos.TrackEvent", binary_proto,
kSkipNewLines));
}
TEST(ProtozeroToTextTest, ProtozeroEnumToText) {
using perfetto::protos::pbzero::TrackEvent;
EXPECT_EQ("TYPE_SLICE_END",
ProtozeroEnumToText(".perfetto.protos.TrackEvent.Type",
TrackEvent::TYPE_SLICE_END));
}
// Sets up a descriptor pool with all the messages from
// "src/protozero/test/example_proto/test_messages.proto"
class ProtozeroToTextTestMessageTest : public testing::Test {
protected:
void SetUp() override {
auto status = pool_.AddFromFileDescriptorSet(
kTestMessagesDescriptor.data(), kTestMessagesDescriptor.size());
ASSERT_TRUE(status.ok());
}
DescriptorPool pool_;
};
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntInt32) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_int32(42);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_int32: 42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntSint32) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_sint32(-42);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_sint32: -42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntUint32) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_uint32(3000000000);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_uint32: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntInt64) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_int64(3000000000);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_int64: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntSint64) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_sint64(-3000000000);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_sint64: -3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntBool) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_bool(true);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_bool: true");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntSmallEnum) {
protozero::HeapBuffered<EveryField> msg;
msg->set_small_enum(protozero::test::protos::pbzero::TO_BE);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"small_enum: TO_BE");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntSignedEnum) {
protozero::HeapBuffered<EveryField> msg;
msg->set_signed_enum(protozero::test::protos::pbzero::NEGATIVE);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"signed_enum: NEGATIVE");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntBigEnum) {
protozero::HeapBuffered<EveryField> msg;
msg->set_big_enum(protozero::test::protos::pbzero::END);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"big_enum: END");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntEnumUnknown) {
protozero::HeapBuffered<EveryField> msg;
msg->AppendVarInt(EveryField::kSmallEnumFieldNumber, 42);
ASSERT_EQ(EveryField::kSmallEnumFieldNumber, 51);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"51: 42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntUnknown) {
protozero::HeapBuffered<EveryField> msg;
msg->AppendVarInt(/*field_id=*/9999, /*value=*/42);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"9999: 42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntMismatch) {
protozero::HeapBuffered<EveryField> msg;
ASSERT_EQ(EveryField::kFieldStringFieldNumber, 500);
msg->AppendVarInt(EveryField::kFieldStringFieldNumber, 42);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"500: 42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldVarIntForPacked) {
// Even though field_int32 has [packed = true], it still accepts a non-packed
// representation.
protozero::HeapBuffered<PackedRepeatedFields> msg;
msg->AppendVarInt(PackedRepeatedFields::kFieldInt32FieldNumber, 42);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_int32: 42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed32Signed) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_sfixed32(-42);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_sfixed32: -42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed32Unsigned) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_fixed32(3000000000);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_fixed32: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed32Float) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_float(24.125);
EXPECT_THAT(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
StartsWith("field_float: 24.125"));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed32Unknown) {
protozero::HeapBuffered<EveryField> msg;
msg->AppendFixed<uint32_t>(/*field_id=*/9999, /*value=*/0x1);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"9999: 0x00000001");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed32Mismatch) {
protozero::HeapBuffered<EveryField> msg;
ASSERT_EQ(EveryField::kFieldStringFieldNumber, 500);
msg->AppendFixed<uint32_t>(EveryField::kFieldStringFieldNumber, 0x1);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"500: 0x00000001");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed64Signed) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_sfixed64(-42);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_sfixed64: -42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed64Unsigned) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_fixed64(3000000000);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"field_fixed64: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed64Double) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_double(24.125);
EXPECT_THAT(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
StartsWith("field_double: 24.125"));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed64Unknown) {
protozero::HeapBuffered<EveryField> msg;
msg->AppendFixed<uint64_t>(/*field_id=*/9999, /*value=*/0x1);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"9999: 0x0000000000000001");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldFixed64Mismatch) {
protozero::HeapBuffered<EveryField> msg;
ASSERT_EQ(EveryField::kFieldStringFieldNumber, 500);
msg->AppendFixed<uint64_t>(EveryField::kFieldStringFieldNumber, 0x1);
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"500: 0x0000000000000001");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedString) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_string("Hello");
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
R"(field_string: "Hello")");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedBytes) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_bytes("Hello");
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
R"(field_bytes: "Hello")");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedUnknown) {
protozero::HeapBuffered<EveryField> msg;
msg->AppendString(9999, "Hello");
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
R"(9999: "Hello")");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedMismatch) {
protozero::HeapBuffered<EveryField> msg;
ASSERT_EQ(EveryField::kFieldBoolFieldNumber, 13);
msg->AppendString(EveryField::kFieldBoolFieldNumber, "Hello");
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"# Packed type 8 not supported. Printing raw string.\n"
R"(13: "Hello")");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedForNonPacked) {
// Even though repeated_int32 doesn't have [packed = true], it still accepts a
// packed representation.
protozero::HeapBuffered<EveryField> msg;
protozero::PackedVarInt buf;
buf.Append<int32_t>(-42);
buf.Append<int32_t>(2147483647);
msg->AppendBytes(EveryField::kRepeatedInt32FieldNumber, buf.data(),
buf.size());
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
"repeated_int32: -42\nrepeated_int32: 2147483647");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedVarIntInt32) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append<int32_t>(-42);
buf.Append<int32_t>(2147483647);
msg->set_field_int32(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_int32: -42\nfield_int32: 2147483647");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedVarIntInt64) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append<int64_t>(-42);
buf.Append<int64_t>(3000000000);
msg->set_field_int64(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_int64: -42\nfield_int64: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedVarIntUint32) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append<uint32_t>(42);
buf.Append<uint32_t>(3000000000);
msg->set_field_uint32(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_uint32: 42\nfield_uint32: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedVarIntUint64) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append<uint64_t>(42);
buf.Append<uint64_t>(3000000000000);
msg->set_field_uint64(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_uint64: 42\nfield_uint64: 3000000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixed32Uint32) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<uint32_t> buf;
buf.Append(42);
buf.Append(3000000000);
msg->set_field_fixed32(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_fixed32: 42\nfield_fixed32: 3000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixed32Int32) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<int32_t> buf;
buf.Append(-42);
buf.Append(42);
msg->set_field_sfixed32(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_sfixed32: -42\nfield_sfixed32: 42");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixed32Float) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<float> buf;
buf.Append(-42);
buf.Append(42.125);
msg->set_field_float(buf);
std::string output =
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines);
EXPECT_THAT(base::SplitString(output, "\n"),
ElementsAre(StartsWith("field_float: -42"),
StartsWith("field_float: 42.125")));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixed64Uint64) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<uint64_t> buf;
buf.Append(42);
buf.Append(3000000000000);
msg->set_field_fixed64(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_fixed64: 42\nfield_fixed64: 3000000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixed64Int64) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<int64_t> buf;
buf.Append(-42);
buf.Append(3000000000000);
msg->set_field_sfixed64(buf);
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_sfixed64: -42\nfield_sfixed64: 3000000000000");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixed64Double) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<double> buf;
buf.Append(-42);
buf.Append(42.125);
msg->set_field_double(buf);
EXPECT_THAT(
base::SplitString(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"\n"),
ElementsAre(StartsWith("field_double: -42"),
StartsWith("field_double: 42.125")));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedSmallEnum) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append(1);
buf.Append(0);
buf.Append(-1);
msg->set_small_enum(buf);
EXPECT_THAT(
base::SplitString(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"\n"),
ElementsAre(Eq("small_enum: TO_BE"), Eq("small_enum: NOT_TO_BE"),
Eq("51: -1")));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedSignedEnum) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append(1);
buf.Append(0);
buf.Append(-1);
buf.Append(-100);
msg->set_signed_enum(buf);
EXPECT_THAT(
base::SplitString(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"\n"),
ElementsAre(Eq("signed_enum: POSITIVE"), Eq("signed_enum: NEUTRAL"),
Eq("signed_enum: NEGATIVE"), Eq("52: -100")));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedBigEnum) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append(10);
buf.Append(100500);
buf.Append(-1);
msg->set_big_enum(buf);
EXPECT_THAT(
base::SplitString(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"\n"),
ElementsAre(Eq("big_enum: BEGIN"), Eq("big_enum: END"), Eq("53: -1")));
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixedErrShort) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
std::string buf;
buf = "\x01";
// buf does not contain enough data for a fixed 64
msg->AppendBytes(PackedRepeatedFields::kFieldFixed64FieldNumber, buf.data(),
buf.size());
// "protoc --decode", instead, returns an error on stderr and doesn't output
// anything at all.
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"# Packed decoding failure for field field_fixed64\n");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedFixedGarbage) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedFixedSizeInt<uint64_t> buf;
buf.Append(42);
buf.Append(3000000000000);
std::string buf_and_garbage(reinterpret_cast<const char*>(buf.data()),
buf.size());
buf_and_garbage += "\x01";
// buf contains extra garbage
msg->AppendBytes(PackedRepeatedFields::kFieldFixed64FieldNumber,
buf_and_garbage.data(), buf_and_garbage.size());
// "protoc --decode", instead, returns an error on stderr and doesn't output
// anything at all.
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"# Packed decoding failure for field field_fixed64\n");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedVarIntShort) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
std::string buf;
buf = "\xFF";
// for the varint to be valid, buf should contain another byte.
msg->AppendBytes(PackedRepeatedFields::kFieldInt32FieldNumber, buf.data(),
buf.size());
// "protoc --decode", instead, returns an error on stderr and doesn't output
// anything at all.
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"# Packed decoding failure for field field_int32\n");
}
TEST_F(ProtozeroToTextTestMessageTest, FieldLengthLimitedPackedVarIntGarbage) {
protozero::HeapBuffered<PackedRepeatedFields> msg;
protozero::PackedVarInt buf;
buf.Append(42);
buf.Append(105);
std::string buf_and_garbage(reinterpret_cast<const char*>(buf.data()),
buf.size());
buf_and_garbage += "\xFF";
// buf contains extra garbage
msg->AppendBytes(PackedRepeatedFields::kFieldInt32FieldNumber,
buf_and_garbage.data(), buf_and_garbage.size());
// "protoc --decode", instead:
// * doesn't output anything.
// * returns an error on stderr.
EXPECT_EQ(
ProtozeroToText(pool_, ".protozero.test.protos.PackedRepeatedFields",
msg.SerializeAsArray(), kIncludeNewLines),
"field_int32: 42\n"
"field_int32: 105\n"
"# Packed decoding failure for field field_int32\n");
}
TEST_F(ProtozeroToTextTestMessageTest, ExtraBytes) {
protozero::HeapBuffered<EveryField> msg;
EveryField* nested = msg->add_field_nested();
nested->set_field_string("hello");
std::string garbage("\377\377");
nested->AppendRawProtoBytes(garbage.data(), garbage.size());
// "protoc --decode", instead:
// * doesn't output anything.
// * returns an error on stderr.
EXPECT_EQ(ProtozeroToText(pool_, ".protozero.test.protos.EveryField",
msg.SerializeAsArray(), kIncludeNewLines),
R"(field_nested {
field_string: "hello"
# Extra bytes: "\377\377"
})");
}
TEST_F(ProtozeroToTextTestMessageTest, NonExistingType) {
protozero::HeapBuffered<EveryField> msg;
msg->set_field_string("hello");
ASSERT_EQ(EveryField::kFieldStringFieldNumber, 500);
// "protoc --decode", instead:
// * doesn't output anything.
// * returns an error on stderr.
EXPECT_EQ(ProtozeroToText(pool_, ".non.existing.type", msg.SerializeAsArray(),
kIncludeNewLines),
R"(500: "hello")");
}
} // namespace
} // namespace protozero_to_text
} // namespace trace_processor
} // namespace perfetto