/*
 * 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
