// Protocol Buffers - Google's data interchange format
// Copyright 2023 Google LLC.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

#include <array>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <optional>
#include <string>
#include <string_view>
#include <utility>
#include <vector>

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "absl/cleanup/cleanup.h"
#include "absl/numeric/bits.h"
#include "absl/strings/escaping.h"
#include "absl/strings/string_view.h"
#include "google/protobuf/test_messages_proto3.upb.h"
#include "upb/base/status.h"
#include "upb/base/status.hpp"
#include "upb/base/string_view.h"
#include "upb/base/upcast.h"
#include "upb/json/decode.h"
#include "upb/json/encode.h"
#include "upb/mem/alloc.h"
#include "upb/mem/arena.h"
#include "upb/mem/arena.hpp"
#include "upb/message/accessors.h"
#include "upb/message/array.h"
#include "upb/message/compare.h"
#include "upb/message/internal/accessors.h"
#include "upb/message/internal/extension.h"
#include "upb/message/internal/message.h"
#include "upb/message/map.h"
#include "upb/message/message.h"
#include "upb/message/test.upb.h"
#include "upb/message/test.upb_minitable.h"
#include "upb/message/test.upbdefs.h"
#include "upb/message/unknown_fields.h"
#include "upb/message/value.h"
#include "upb/mini_descriptor/decode.h"
#include "upb/mini_table/debug_string.h"
#include "upb/mini_table/extension.h"
#include "upb/mini_table/extension_registry.h"
#include "upb/mini_table/field.h"
#include "upb/mini_table/internal/message.h"
#include "upb/mini_table/message.h"
#include "upb/reflection/def.h"
#include "upb/reflection/def.hpp"
#include "upb/reflection/message.h"
#include "upb/test/fuzz_util.h"
#include "upb/text/debug_string.h"
#include "upb/wire/decode.h"
#include "upb/wire/encode.h"
#include "upb/wire/eps_copy_input_stream.h"
#include "upb/wire/internal/eps_copy_input_stream.h"
#include "upb/wire/types.h"
#include "upb/wire/writer.h"

// Must be last
#include "upb/port/def.inc"

void VerifyMessage(const upb_test_TestExtensions* ext_msg) {
  EXPECT_TRUE(upb_test_TestExtensions_has_optional_int32_ext(ext_msg));
  // EXPECT_FALSE(upb_test_TestExtensions_Nested_has_optional_int32_ext(ext_msg));
  EXPECT_TRUE(upb_test_has_optional_msg_ext(ext_msg));

  EXPECT_EQ(123, upb_test_TestExtensions_optional_int32_ext(ext_msg));
  const protobuf_test_messages_proto3_TestAllTypesProto3* ext_submsg =
      upb_test_optional_msg_ext(ext_msg);
  EXPECT_TRUE(ext_submsg != nullptr);
  EXPECT_EQ(456,
            protobuf_test_messages_proto3_TestAllTypesProto3_optional_int32(
                ext_submsg));
}

TEST(MessageTest, Extensions) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());

  EXPECT_FALSE(upb_test_TestExtensions_has_optional_int32_ext(ext_msg));
  // EXPECT_FALSE(upb_test_TestExtensions_Nested_has_optional_int32_ext(ext_msg));
  EXPECT_FALSE(upb_test_has_optional_msg_ext(ext_msg));

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestExtensions_getmsgdef(defpool.ptr()));
  EXPECT_TRUE(m.ptr() != nullptr);

  std::string json = R"json(
  {
      "[upb_test.TestExtensions.optional_int32_ext]": 123,
      "[upb_test.TestExtensions.Nested.repeated_int32_ext]": [2, 4, 6],
      "[upb_test.optional_msg_ext]": {"optional_int32": 456}
  }
  )json";
  upb::Status status;
  EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), UPB_UPCAST(ext_msg),
                             m.ptr(), defpool.ptr(), 0, arena.ptr(),
                             status.ptr()))
      << status.error_message();

  VerifyMessage(ext_msg);

  // Test round-trip through binary format.
  size_t size;
  char* serialized =
      upb_test_TestExtensions_serialize(ext_msg, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  ASSERT_GE(size, 0u);

  upb_test_TestExtensions* ext_msg2 = upb_test_TestExtensions_parse_ex(
      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
      arena.ptr());
  VerifyMessage(ext_msg2);

  // Test round-trip through JSON format.
  size_t json_size = upb_JsonEncode(UPB_UPCAST(ext_msg), m.ptr(), defpool.ptr(),
                                    0, nullptr, 0, status.ptr());
  char* json_buf =
      static_cast<char*>(upb_Arena_Malloc(arena.ptr(), json_size + 1));
  upb_JsonEncode(UPB_UPCAST(ext_msg), m.ptr(), defpool.ptr(), 0, json_buf,
                 json_size + 1, status.ptr());
  upb_test_TestExtensions* ext_msg3 = upb_test_TestExtensions_new(arena.ptr());
  EXPECT_TRUE(upb_JsonDecode(json_buf, json_size, UPB_UPCAST(ext_msg3), m.ptr(),
                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
      << status.error_message();
  VerifyMessage(ext_msg3);

  // Test setters and mutable accessors
  upb_test_TestExtensions* ext_msg4 = upb_test_TestExtensions_new(arena.ptr());
  upb_test_TestExtensions_set_optional_int32_ext(ext_msg4, 123, arena.ptr());
  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_int32(
      upb_test_mutable_optional_msg_ext(ext_msg4, arena.ptr()), 456);
  VerifyMessage(ext_msg4);
}

TEST(MessageTest, ExtensionsDeterministic) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());

  EXPECT_FALSE(upb_test_TestExtensions_has_optional_int32_ext(ext_msg));
  // EXPECT_FALSE(upb_test_TestExtensions_Nested_has_optional_int32_ext(ext_msg));
  EXPECT_FALSE(upb_test_has_optional_msg_ext(ext_msg));

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestExtensions_getmsgdef(defpool.ptr()));
  EXPECT_TRUE(m.ptr() != nullptr);

  std::string json = R"json(
  {
      "[upb_test.TestExtensions.optional_int32_ext]": 123,
      "[upb_test.TestExtensions.Nested.repeated_int32_ext]": [],
      "[upb_test.optional_msg_ext]": {"optional_int32": 456}
  }
  )json";
  upb::Status status;
  EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), UPB_UPCAST(ext_msg),
                             m.ptr(), defpool.ptr(), 0, arena.ptr(),
                             status.ptr()))
      << status.error_message();

  VerifyMessage(ext_msg);

  size_t size;
  char* serialized =
      upb_test_TestExtensions_serialize(ext_msg, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  ASSERT_GE(size, 0u);

  size_t deterministic_size;
  char* deterministic_serialized = upb_test_TestExtensions_serialize_ex(
      ext_msg, kUpb_EncodeOption_Deterministic, arena.ptr(),
      &deterministic_size);
  ASSERT_TRUE(deterministic_serialized != nullptr);
  ASSERT_EQ(deterministic_size, size);
}

TEST(MessageTest, ExtensionsSkipUnknownDeterministic) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
  upb_test_TestExtensions_set_optional_int32_ext(ext_msg, 123, arena.ptr());

  size_t deterministic_size;
  char* deterministic_serialized = upb_test_TestExtensions_serialize_ex(
      ext_msg, kUpb_EncodeOption_Deterministic | kUpb_EncodeOption_SkipUnknown,
      arena.ptr(), &deterministic_size);
  ASSERT_TRUE(deterministic_serialized != nullptr);
}

TEST(MessageTest, ExtensionsEmpty) {
  upb::Arena arena;

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestExtensions_getmsgdef(defpool.ptr()));
  EXPECT_TRUE(m.ptr() != nullptr);

  for (int options : {0, int{kUpb_EncodeOption_Deterministic}}) {
    std::string json_with_empty = R"json(
  {
      "[upb_test.TestExtensions.optional_int32_ext]": 123,
      "[upb_test.TestExtensions.Nested.repeated_int32_ext]": []
  }
  )json";
    upb::Status status_empty;
    upb_test_TestExtensions* ext_msg_with_empty =
        upb_test_TestExtensions_new(arena.ptr());
    EXPECT_TRUE(upb_JsonDecode(json_with_empty.data(), json_with_empty.size(),
                               UPB_UPCAST(ext_msg_with_empty), m.ptr(),
                               defpool.ptr(), 0, arena.ptr(),
                               status_empty.ptr()))
        << status_empty.error_message();

    std::string json = R"json(
  {
      "[upb_test.TestExtensions.optional_int32_ext]": 123
  }
  )json";
    upb::Status status;
    upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
    EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), UPB_UPCAST(ext_msg),
                               m.ptr(), defpool.ptr(), 0, arena.ptr(),
                               status.ptr()))
        << status.error_message();

    size_t size_with_empty;
    char* serialized = upb_test_TestExtensions_serialize_ex(
        ext_msg_with_empty, options, arena.ptr(), &size_with_empty);
    ASSERT_TRUE(serialized != nullptr);
    ASSERT_GE(size_with_empty, 0u);

    size_t size;
    serialized = upb_test_TestExtensions_serialize_ex(ext_msg, options,
                                                      arena.ptr(), &size);
    ASSERT_TRUE(serialized != nullptr);
    // Presence or absence of an empty extension should not affect the
    // serialized output.
    ASSERT_EQ(size_with_empty, size);
  }
}

void VerifyMessageSet(const upb_test_TestMessageSet* mset_msg) {
  ASSERT_TRUE(mset_msg != nullptr);
  bool has = upb_test_MessageSetMember_has_message_set_extension(mset_msg);
  EXPECT_TRUE(has);
  if (!has) return;
  const upb_test_MessageSetMember* member =
      upb_test_MessageSetMember_message_set_extension(mset_msg);
  EXPECT_TRUE(member != nullptr);
  EXPECT_TRUE(upb_test_MessageSetMember_has_optional_int32(member));
  EXPECT_EQ(234, upb_test_MessageSetMember_optional_int32(member));
}

TEST(MessageTest, LargeMessageSetExtension) {
  upb::Arena arena;
  upb_ExtensionRegistry* reg = upb_ExtensionRegistry_New(arena.ptr());
  ASSERT_TRUE(reg != nullptr);

  upb_MiniTableExtension ext;
  memset(&ext, 0, sizeof(ext));
  ext.UPB_PRIVATE(field).UPB_ONLYBITS(number) = (1 << 29) + 5;
  ext.UPB_PRIVATE(extendee) = &upb_0test__TestMessageSet_msg_init;

  EXPECT_EQ(upb_ExtensionRegistry_Add(reg, &ext),
            kUpb_ExtensionRegistryStatus_Ok);
}

TEST(MessageTest, MessageSet) {
  upb::Arena arena;
  upb_test_TestMessageSet* ext_msg = upb_test_TestMessageSet_new(arena.ptr());

  EXPECT_FALSE(upb_test_MessageSetMember_has_message_set_extension(ext_msg));

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));
  EXPECT_TRUE(m.ptr() != nullptr);

  std::string json = R"json(
  {
      "[upb_test.MessageSetMember]": {"optional_int32": 234}
  }
  )json";
  upb::Status status;
  EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), UPB_UPCAST(ext_msg),
                             m.ptr(), defpool.ptr(), 0, arena.ptr(),
                             status.ptr()))
      << status.error_message();

  VerifyMessageSet(ext_msg);

  // Test round-trip through binary format.
  size_t size;
  char* serialized =
      upb_test_TestMessageSet_serialize(ext_msg, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  ASSERT_GE(size, 0u);

  upb_test_TestMessageSet* ext_msg2 = upb_test_TestMessageSet_parse_ex(
      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
      arena.ptr());
  VerifyMessageSet(ext_msg2);

  // Test round-trip through JSON format.
  size_t json_size = upb_JsonEncode(UPB_UPCAST(ext_msg), m.ptr(), defpool.ptr(),
                                    0, nullptr, 0, status.ptr());
  char* json_buf =
      static_cast<char*>(upb_Arena_Malloc(arena.ptr(), json_size + 1));
  upb_JsonEncode(UPB_UPCAST(ext_msg), m.ptr(), defpool.ptr(), 0, json_buf,
                 json_size + 1, status.ptr());
  upb_test_TestMessageSet* ext_msg3 = upb_test_TestMessageSet_new(arena.ptr());
  EXPECT_TRUE(upb_JsonDecode(json_buf, json_size, UPB_UPCAST(ext_msg3), m.ptr(),
                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
      << status.error_message();
  VerifyMessageSet(ext_msg3);
}

TEST(MessageTest, UnknownMessageSet) {
  static const char data[] = "ABCDE";
  upb_StringView data_view = upb_StringView_FromString(data);
  upb::Arena arena;
  upb_test_FakeMessageSet* fake = upb_test_FakeMessageSet_new(arena.ptr());

  // Add a MessageSet item that is unknown (there is no matching extension in
  // the .proto file)
  upb_test_FakeMessageSet_Item* item =
      upb_test_FakeMessageSet_add_item(fake, arena.ptr());
  upb_test_FakeMessageSet_Item_set_type_id(item, 12345);
  upb_test_FakeMessageSet_Item_set_message(item, data_view);

  // Set unknown fields inside the message set to test that we can skip them.
  upb_test_FakeMessageSet_Item_set_unknown_varint(item, 12345678);
  upb_test_FakeMessageSet_Item_set_unknown_fixed32(item, 12345678);
  upb_test_FakeMessageSet_Item_set_unknown_fixed64(item, 12345678);
  upb_test_FakeMessageSet_Item_set_unknown_bytes(item, data_view);
  upb_test_FakeMessageSet_Item_mutable_unknowngroup(item, arena.ptr());

  // Round trip through a true MessageSet where this item_id is unknown.
  size_t size;
  char* serialized =
      upb_test_FakeMessageSet_serialize(fake, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  ASSERT_GE(size, 0u);

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));
  EXPECT_TRUE(m.ptr() != nullptr);
  upb_test_TestMessageSet* message_set = upb_test_TestMessageSet_parse_ex(
      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
      arena.ptr());
  ASSERT_TRUE(message_set != nullptr);

  char* serialized2 =
      upb_test_TestMessageSet_serialize(message_set, arena.ptr(), &size);
  ASSERT_TRUE(serialized2 != nullptr);
  ASSERT_GE(size, 0u);

  // Parse back into a fake MessageSet and verify that the unknown MessageSet
  // item was preserved in full (both type_id and message).
  upb_test_FakeMessageSet* fake2 =
      upb_test_FakeMessageSet_parse(serialized2, size, arena.ptr());
  ASSERT_TRUE(fake2 != nullptr);

  const upb_test_FakeMessageSet_Item* const* items =
      upb_test_FakeMessageSet_item(fake2, &size);
  ASSERT_EQ(1u, size);
  EXPECT_EQ(12345, upb_test_FakeMessageSet_Item_type_id(items[0]));
  EXPECT_TRUE(upb_StringView_IsEqual(
      data_view, upb_test_FakeMessageSet_Item_message(items[0])));

  // The non-MessageSet unknown fields should have been discarded.
  EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknown_varint(items[0]));
  EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknown_fixed32(items[0]));
  EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknown_fixed64(items[0]));
  EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknown_bytes(items[0]));
  EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknowngroup(items[0]));
}

TEST(MessageTest, MessageSetSubmessageEncoding) {
  upb::Arena arena;

  // Create a normal extension message and use the set the doppelgänger message
  // set member extension on it. This will allow us to serialize as a normal
  // extension and then attempt to parse it as a message set.
  // This mimics the behavior of an encoder that is message set unaware.
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
  upb_test_MessageSetMember* ext_member =
      upb_test_MessageSetMember_new(arena.ptr());
  upb_test_MessageSetMember_set_optional_int32(ext_member, 234);
  upb_test_MessageSetMember_set_doppelganger_message_set_extension(
      ext_msg, ext_member, arena.ptr());

  size_t size;
  char* serialized =
      upb_test_TestExtensions_serialize(ext_msg, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  ASSERT_GE(size, 0u);

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));
  EXPECT_TRUE(m.ptr() != nullptr);

  upb_test_TestMessageSet* message_set = upb_test_TestMessageSet_parse_ex(
      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
      arena.ptr());
  ASSERT_TRUE(message_set != nullptr);

  VerifyMessageSet(message_set);
}

TEST(MessageTest, Proto2Enum) {
  upb::Arena arena;
  upb_test_Proto2FakeEnumMessage* fake_msg =
      upb_test_Proto2FakeEnumMessage_new(arena.ptr());

  upb_test_Proto2FakeEnumMessage_set_optional_enum(fake_msg, 999);

  int32_t* vals = upb_test_Proto2FakeEnumMessage_resize_repeated_enum(
      fake_msg, 6, arena.ptr());
  vals[0] = upb_test_Proto2EnumMessage_ZERO;
  vals[1] = 7;  // Unknown small.
  vals[2] = upb_test_Proto2EnumMessage_SMALL;
  vals[3] = 888;  // Unknown large.
  vals[4] = upb_test_Proto2EnumMessage_LARGE;
  vals[5] = upb_test_Proto2EnumMessage_NEGATIVE;

  vals = upb_test_Proto2FakeEnumMessage_resize_packed_enum(fake_msg, 6,
                                                           arena.ptr());
  vals[0] = upb_test_Proto2EnumMessage_ZERO;
  vals[1] = 7;  // Unknown small.
  vals[2] = upb_test_Proto2EnumMessage_SMALL;
  vals[3] = 888;  // Unknown large.
  vals[4] = upb_test_Proto2EnumMessage_LARGE;
  vals[5] = upb_test_Proto2EnumMessage_NEGATIVE;

  size_t size;
  char* pb =
      upb_test_Proto2FakeEnumMessage_serialize(fake_msg, arena.ptr(), &size);

  // Parsing as enums puts unknown values into unknown fields.
  upb_test_Proto2EnumMessage* enum_msg =
      upb_test_Proto2EnumMessage_parse(pb, size, arena.ptr());
  ASSERT_TRUE(enum_msg != nullptr);

  EXPECT_EQ(false, upb_test_Proto2EnumMessage_has_optional_enum(enum_msg));
  const int32_t* vals_const =
      upb_test_Proto2EnumMessage_repeated_enum(enum_msg, &size);
  EXPECT_EQ(4u, size);  // Two unknown values moved to the unknown field set.

  // Parsing back into the fake message shows the original data, except the
  // repeated enum is rearranged.
  pb = upb_test_Proto2EnumMessage_serialize(enum_msg, arena.ptr(), &size);
  upb_test_Proto2FakeEnumMessage* fake_msg2 =
      upb_test_Proto2FakeEnumMessage_parse(pb, size, arena.ptr());
  ASSERT_TRUE(fake_msg2 != nullptr);

  EXPECT_EQ(true, upb_test_Proto2FakeEnumMessage_has_optional_enum(fake_msg2));
  EXPECT_EQ(999, upb_test_Proto2FakeEnumMessage_optional_enum(fake_msg2));

  int32_t expected[] = {
      upb_test_Proto2EnumMessage_ZERO,
      upb_test_Proto2EnumMessage_SMALL,
      upb_test_Proto2EnumMessage_LARGE,
      upb_test_Proto2EnumMessage_NEGATIVE,
      7,
      888,
  };

  vals_const = upb_test_Proto2FakeEnumMessage_repeated_enum(fake_msg2, &size);
  EXPECT_EQ(6u, size);
  EXPECT_THAT(std::vector<int32_t>(vals_const, vals_const + size),
              ::testing::ElementsAreArray(expected));

  vals_const = upb_test_Proto2FakeEnumMessage_packed_enum(fake_msg2, &size);
  EXPECT_EQ(6u, size);
  EXPECT_THAT(std::vector<int32_t>(vals_const, vals_const + size),
              ::testing::ElementsAreArray(expected));
}

TEST(MessageTest, TestBadUTF8) {
  upb::Arena arena;
  std::string serialized("r\x03\xed\xa0\x81");
  EXPECT_EQ(nullptr, protobuf_test_messages_proto3_TestAllTypesProto3_parse(
                         serialized.data(), serialized.size(), arena.ptr()));
}

// On a 32 bit platform, upb_StringView has the same size as an int64 field, but
// lower alignment requirements - when selecting the representation for oneof,
// both size and alignment need to be considered.
TEST(MessageTest, OneOf32BitStringViewInt64Alignment) {
  upb::Arena arena;
  upb_StringView md = {nullptr, 0};
  uint32_t field_tag;
  {
    upb_DefPool* d = upb_DefPool_New();
    auto free = absl::MakeCleanup([d]() { upb_DefPool_Free(d); });
    const upb_MessageDef* def = upb_test_TestOneOfAlignment_getmsgdef(d);
    const upb_FieldDef* field_def =
        upb_MessageDef_FindFieldByName(def, "should_be_sixty_four_aligned");
    field_tag = upb_FieldDef_Number(field_def);
    EXPECT_TRUE(upb_MessageDef_MiniDescriptorEncode(def, arena.ptr(), &md));
  }
  upb_Status status;
  upb_Status_Clear(&status);
  const upb_MiniTable* table = _upb_MiniTable_Build(
      md.data, md.size, kUpb_MiniTablePlatform_32Bit, arena.ptr(), &status);
  if (!status.ok) {
    FAIL() << "Could not build minitable: " << status.msg;
  }
  const upb_MiniTableField* mtfield =
      upb_MiniTable_FindFieldByNumber(table, field_tag);
  uint16_t offset = UPB_PRIVATE(_upb_MiniTableField_Offset)(mtfield);
  size_t alignment = 1 << absl::countr_zero(offset);
  // Must align to at least 64 bit
  EXPECT_GE(alignment, 8u);
}

TEST(MessageTest, DecodeRequiredFieldsTopLevelMessage) {
  upb::Arena arena;
  upb_test_TestRequiredFields* test_msg;
  upb_test_EmptyMessage* empty_msg;

  // Succeeds, because we did not request required field checks.
  test_msg = upb_test_TestRequiredFields_parse(nullptr, 0, arena.ptr());
  EXPECT_NE(nullptr, test_msg);

  // Fails, because required fields are missing.
  EXPECT_EQ(kUpb_DecodeStatus_MissingRequired,
            upb_Decode(nullptr, 0, UPB_UPCAST(test_msg),
                       &upb_0test__TestRequiredFields_msg_init, nullptr,
                       kUpb_DecodeOption_CheckRequired, arena.ptr()));

  upb_test_TestRequiredFields_set_required_int32(test_msg, 1);
  size_t size;
  char* serialized =
      upb_test_TestRequiredFields_serialize(test_msg, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  EXPECT_NE(0u, size);

  // Fails, but the code path is slightly different because the serialized
  // payload is not empty.
  EXPECT_EQ(kUpb_DecodeStatus_MissingRequired,
            upb_Decode(serialized, size, UPB_UPCAST(test_msg),
                       &upb_0test__TestRequiredFields_msg_init, nullptr,
                       kUpb_DecodeOption_CheckRequired, arena.ptr()));

  empty_msg = upb_test_EmptyMessage_new(arena.ptr());
  upb_test_TestRequiredFields_set_required_int32(test_msg, 1);
  upb_test_TestRequiredFields_set_required_int64(test_msg, 2);
  upb_test_TestRequiredFields_set_required_message(test_msg, empty_msg);

  // Succeeds, because required fields are present (though not in the input).
  EXPECT_EQ(kUpb_DecodeStatus_Ok,
            upb_Decode(nullptr, 0, UPB_UPCAST(test_msg),
                       &upb_0test__TestRequiredFields_msg_init, nullptr,
                       kUpb_DecodeOption_CheckRequired, arena.ptr()));

  // Serialize a complete payload.
  serialized =
      upb_test_TestRequiredFields_serialize(test_msg, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  EXPECT_NE(0u, size);

  upb_test_TestRequiredFields* test_msg2 = upb_test_TestRequiredFields_parse_ex(
      serialized, size, nullptr, kUpb_DecodeOption_CheckRequired, arena.ptr());
  EXPECT_NE(nullptr, test_msg2);

  // When we add an incomplete sub-message, this is not flagged by the parser.
  // This makes parser checking unsuitable for MergeFrom().
  upb_test_TestRequiredFields_set_optional_message(
      test_msg2, upb_test_TestRequiredFields_new(arena.ptr()));
  EXPECT_EQ(kUpb_DecodeStatus_Ok,
            upb_Decode(serialized, size, UPB_UPCAST(test_msg2),
                       &upb_0test__TestRequiredFields_msg_init, nullptr,
                       kUpb_DecodeOption_CheckRequired, arena.ptr()));
}

TEST(MessageTest, DecodeRequiredFieldsSubMessage) {
  upb::Arena arena;
  upb_test_TestRequiredFields* test_msg =
      upb_test_TestRequiredFields_new(arena.ptr());
  upb_test_SubMessageHasRequired* sub_msg =
      upb_test_SubMessageHasRequired_new(arena.ptr());
  upb_test_EmptyMessage* empty_msg = upb_test_EmptyMessage_new(arena.ptr());

  upb_test_SubMessageHasRequired_set_optional_message(sub_msg, test_msg);
  size_t size;
  char* serialized =
      upb_test_SubMessageHasRequired_serialize(sub_msg, arena.ptr(), &size);
  EXPECT_NE(0u, size);

  // No parse error when parsing normally.
  EXPECT_NE(nullptr, upb_test_SubMessageHasRequired_parse(serialized, size,
                                                          arena.ptr()));

  // Parse error when verifying required fields, due to incomplete sub-message.
  EXPECT_EQ(nullptr, upb_test_SubMessageHasRequired_parse_ex(
                         serialized, size, nullptr,
                         kUpb_DecodeOption_CheckRequired, arena.ptr()));

  upb_test_TestRequiredFields_set_required_int32(test_msg, 1);
  upb_test_TestRequiredFields_set_required_int64(test_msg, 2);
  upb_test_TestRequiredFields_set_required_message(test_msg, empty_msg);

  serialized =
      upb_test_SubMessageHasRequired_serialize(sub_msg, arena.ptr(), &size);
  EXPECT_NE(0u, size);

  // No parse error; sub-message now is complete.
  EXPECT_NE(nullptr, upb_test_SubMessageHasRequired_parse_ex(
                         serialized, size, nullptr,
                         kUpb_DecodeOption_CheckRequired, arena.ptr()));
}

TEST(MessageTest, EncodeRequiredFields) {
  upb::Arena arena;
  upb_test_TestRequiredFields* test_msg =
      upb_test_TestRequiredFields_new(arena.ptr());

  // Succeeds, we didn't ask for required field checking.
  size_t size;
  char* serialized =
      upb_test_TestRequiredFields_serialize_ex(test_msg, 0, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
  EXPECT_EQ(size, 0u);

  // Fails, we asked for required field checking but the required field is
  // missing.
  serialized = upb_test_TestRequiredFields_serialize_ex(
      test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
  ASSERT_TRUE(serialized == nullptr);

  // Fails, some required fields are present but not others.
  upb_test_TestRequiredFields_set_required_int32(test_msg, 1);
  serialized = upb_test_TestRequiredFields_serialize_ex(
      test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
  ASSERT_TRUE(serialized == nullptr);

  // Succeeds, all required fields are set.
  upb_test_EmptyMessage* empty_msg = upb_test_EmptyMessage_new(arena.ptr());
  upb_test_TestRequiredFields_set_required_int64(test_msg, 2);
  upb_test_TestRequiredFields_set_required_message(test_msg, empty_msg);
  serialized = upb_test_TestRequiredFields_serialize_ex(
      test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
}

TEST(MessageTest, MaxRequiredFields) {
  upb::Arena arena;
  upb_test_TestMaxRequiredFields* test_msg =
      upb_test_TestMaxRequiredFields_new(arena.ptr());

  // Fails, we asked for required field checking but the required field is
  // missing.
  size_t size;
  char* serialized = upb_test_TestMaxRequiredFields_serialize_ex(
      test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
  ASSERT_TRUE(serialized == nullptr);

  upb::DefPool defpool;
  upb::MessageDefPtr m(upb_test_TestMaxRequiredFields_getmsgdef(defpool.ptr()));
  upb_MessageValue val;
  val.int32_val = 1;
  for (int i = 1; i <= 61; i++) {
    upb::FieldDefPtr f = m.FindFieldByNumber(i);
    ASSERT_TRUE(f);
    ASSERT_TRUE(upb_Message_SetFieldByDef(UPB_UPCAST(test_msg), f.ptr(), val,
                                          arena.ptr()));
  }

  // Fails, field 63 still isn't set.
  serialized = upb_test_TestMaxRequiredFields_serialize_ex(
      test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
  ASSERT_TRUE(serialized == nullptr);

  // Succeeds, all required fields are set.
  upb::FieldDefPtr f = m.FindFieldByNumber(62);
  ASSERT_TRUE(f);
  ASSERT_TRUE(upb_Message_SetFieldByDef(UPB_UPCAST(test_msg), f.ptr(), val,
                                        arena.ptr()));
  serialized = upb_test_TestMaxRequiredFields_serialize_ex(
      test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
  ASSERT_TRUE(serialized != nullptr);
}

TEST(MessageTest, MapField) {
  upb::Arena arena;
  upb_test_TestMapFieldExtra* test_msg_extra =
      upb_test_TestMapFieldExtra_new(arena.ptr());

  ASSERT_TRUE(upb_test_TestMapFieldExtra_map_field_set(
      test_msg_extra, 0, upb_test_TestMapFieldExtra_THREE, arena.ptr()));

  size_t size;
  char* serialized = upb_test_TestMapFieldExtra_serialize_ex(
      test_msg_extra, 0, arena.ptr(), &size);
  ASSERT_NE(nullptr, serialized);
  ASSERT_NE(0u, size);

  upb_test_TestMapField* test_msg =
      upb_test_TestMapField_parse(serialized, size, arena.ptr());
  ASSERT_NE(nullptr, test_msg);

  ASSERT_FALSE(upb_test_TestMapField_map_field_get(test_msg, 0, nullptr));
  serialized =
      upb_test_TestMapField_serialize_ex(test_msg, 0, arena.ptr(), &size);
  ASSERT_NE(0u, size);
  // parse into second instance
  upb_test_TestMapFieldExtra* test_msg_extra2 =
      upb_test_TestMapFieldExtra_parse(serialized, size, arena.ptr());
  ASSERT_NE(nullptr, test_msg_extra2);
  ASSERT_TRUE(
      upb_test_TestMapFieldExtra_map_field_get(test_msg_extra2, 0, nullptr));
}

TEST(MessageTest, MapFieldDeterministicEncoding) {
  upb::Arena arena1;
  upb_test_TestMapField* test_msg1 = upb_test_TestMapField_new(arena1.ptr());
  for (int i = 0; i <= 1000; i++) {
    ASSERT_TRUE(upb_test_TestMapField_map_field_set(
        test_msg1, i, upb_test_TestMapField_ZERO, arena1.ptr()));
  }
  for (int i = 1001; i <= 2000; i++) {
    ASSERT_TRUE(upb_test_TestMapField_map_field_set(
        test_msg1, i, upb_test_TestMapField_ONE, arena1.ptr()));
  }
  for (int i = 2001; i <= 3000; i++) {
    ASSERT_TRUE(upb_test_TestMapField_map_field_set(
        test_msg1, i, upb_test_TestMapField_TWO, arena1.ptr()));
  }
  size_t size1;
  char* serialized1;
  upb_EncodeStatus status1 = upb_Encode(
      UPB_UPCAST(test_msg1), &upb_0test__TestMapField_msg_init,
      kUpb_EncodeOption_Deterministic, arena1.ptr(), &serialized1, &size1);
  ASSERT_EQ(status1, kUpb_EncodeStatus_Ok);
  ASSERT_NE(nullptr, serialized1);

  upb::Arena arena2;
  upb_test_TestMapField* test_msg2 = upb_test_TestMapField_new(arena2.ptr());
  // Add the same values in reverse order.
  for (int i = 3000; i >= 2001; i--) {
    ASSERT_TRUE(upb_test_TestMapField_map_field_set(
        test_msg2, i, upb_test_TestMapField_TWO, arena2.ptr()));
  }
  for (int i = 2000; i >= 1001; i--) {
    ASSERT_TRUE(upb_test_TestMapField_map_field_set(
        test_msg2, i, upb_test_TestMapField_ONE, arena2.ptr()));
  }
  for (int i = 1000; i >= 0; i--) {
    ASSERT_TRUE(upb_test_TestMapField_map_field_set(
        test_msg2, i, upb_test_TestMapField_ZERO, arena2.ptr()));
  }
  size_t size2;
  char* serialized2;
  upb_EncodeStatus status2 = upb_Encode(
      UPB_UPCAST(test_msg2), &upb_0test__TestMapField_msg_init,
      kUpb_EncodeOption_Deterministic, arena2.ptr(), &serialized2, &size2);
  ASSERT_EQ(status2, kUpb_EncodeStatus_Ok);
  ASSERT_NE(nullptr, serialized2);

  EXPECT_EQ(size1, size2);
  EXPECT_EQ(0, memcmp(serialized1, serialized2, size1));
}

TEST(MessageTest, AdjacentAliasedUnknown) {
  const upb_MiniTable* table = &upb_0test__EmptyMessage_msg_init;
  upb::Arena arena;
  upb_Message* msg = upb_Message_New(table, arena.ptr());
  char region[900];
  memset(region, 0, sizeof(region));
  region[0] = 0x0A;  // Tag number 1
  region[1] = 0xA9;
  region[2] = 0x02;
  region[300] = 0x12;  // Tag number 2
  region[301] = 0xA9;
  region[302] = 0x02;
  region[600] = 0x1A;  // Tag number 3
  region[601] = 0xA9;
  region[602] = 0x02;
  // All adjacent fields should be part of a single unknown field entry
  {
    upb_DecodeStatus status =
        upb_Decode(region, sizeof(region), msg, table, nullptr,
                   kUpb_DecodeOption_AliasString, arena.ptr());
    ASSERT_EQ(status, kUpb_DecodeStatus_Ok);
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown data;
    ASSERT_TRUE(upb_Message_NextUnknown2(msg, &data, &iter));
    ASSERT_EQ(data.type, kUpb_MessageUnknownType_StringView);
    EXPECT_EQ(region, data.value.bytes.data);
    EXPECT_EQ(sizeof(region), data.value.bytes.size);
    EXPECT_FALSE(upb_Message_NextUnknown2(msg, &data, &iter));
  }

  upb_Message_Clear(msg, table);

  // Separate decodes should not produce merged aliases, even with adjacent
  // entries as we don't know that they're part of the same object
  {
    EXPECT_EQ(kUpb_DecodeStatus_Ok,
              upb_Decode(region, 300, msg, table, nullptr,
                         kUpb_DecodeOption_AliasString, arena.ptr()));
    EXPECT_EQ(kUpb_DecodeStatus_Ok,
              upb_Decode(region + 300, 300, msg, table, nullptr,
                         kUpb_DecodeOption_AliasString, arena.ptr()));
    EXPECT_EQ(kUpb_DecodeStatus_Ok,
              upb_Decode(region + 600, 300, msg, table, nullptr,
                         kUpb_DecodeOption_AliasString, arena.ptr()));
    upb_MessageUnknown data;
    uintptr_t iter = kUpb_Message_UnknownBegin;
    ASSERT_TRUE(upb_Message_NextUnknown2(msg, &data, &iter));
    ASSERT_EQ(data.type, kUpb_MessageUnknownType_StringView);
    EXPECT_EQ(region, data.value.bytes.data);
    EXPECT_EQ(300u, data.value.bytes.size);
    ASSERT_TRUE(upb_Message_NextUnknown2(msg, &data, &iter));
    ASSERT_EQ(data.type, kUpb_MessageUnknownType_StringView);
    EXPECT_EQ(region + 300, data.value.bytes.data);
    EXPECT_EQ(300u, data.value.bytes.size);
    ASSERT_TRUE(upb_Message_NextUnknown2(msg, &data, &iter));
    ASSERT_EQ(data.type, kUpb_MessageUnknownType_StringView);
    EXPECT_EQ(region + 600, data.value.bytes.data);
    EXPECT_EQ(300u, data.value.bytes.size);
    ASSERT_FALSE(upb_Message_NextUnknown2(msg, &data, &iter));
  }
}

TEST(MessageTest, Freeze) {
  const upb_MiniTable* m = &upb_0test__TestFreeze_msg_init;
  upb::Arena arena;

  {
    upb_test_TestFreeze* raw = upb_test_TestFreeze_new(arena.ptr());
    upb_Message* msg = UPB_UPCAST(raw);
    ASSERT_FALSE(upb_Message_IsFrozen(msg));
    upb_Message_Freeze(msg, m);
    ASSERT_TRUE(upb_Message_IsFrozen(msg));
  }
  {
    upb_test_TestFreeze* raw = upb_test_TestFreeze_new(arena.ptr());
    upb_Message* msg = UPB_UPCAST(raw);
    size_t size;
    upb_Array* arr = _upb_test_TestFreeze_array_int_mutable_upb_array(
        raw, &size, arena.ptr());
    ASSERT_NE(arr, nullptr);
    ASSERT_EQ(size, 0u);
    ASSERT_FALSE(upb_Array_IsFrozen(arr));
    upb_Map* map =
        _upb_test_TestFreeze_map_int_mutable_upb_map(raw, arena.ptr());
    ASSERT_NE(map, nullptr);
    ASSERT_FALSE(upb_Map_IsFrozen(map));
    upb_test_TestFreeze* nest = upb_test_TestFreeze_new(arena.ptr());
    upb_test_set_nest(raw, nest, arena.ptr());
    ASSERT_FALSE(upb_Message_IsFrozen(UPB_UPCAST(nest)));

    upb_Message_Freeze(msg, m);
    ASSERT_TRUE(upb_Message_IsFrozen(msg));
    ASSERT_TRUE(upb_Array_IsFrozen(arr));
    ASSERT_TRUE(upb_Map_IsFrozen(map));
    ASSERT_TRUE(upb_Message_IsFrozen(UPB_UPCAST(nest)));
  }
  {
    upb_test_TestFreeze* raw = upb_test_TestFreeze_new(arena.ptr());
    upb_Message* msg = UPB_UPCAST(raw);
    size_t size;
    upb_Array* arr = _upb_test_TestFreeze_array_int_mutable_upb_array(
        raw, &size, arena.ptr());
    ASSERT_NE(arr, nullptr);
    ASSERT_EQ(size, 0u);
    ASSERT_FALSE(upb_Array_IsFrozen(arr));
    upb_Map* map =
        _upb_test_TestFreeze_map_int_mutable_upb_map(raw, arena.ptr());
    ASSERT_NE(map, nullptr);
    ASSERT_FALSE(upb_Map_IsFrozen(map));
    upb_test_TestFreeze* nest = upb_test_TestFreeze_new(arena.ptr());
    upb_test_set_nest(raw, nest, arena.ptr());
    ASSERT_FALSE(upb_Message_IsFrozen(UPB_UPCAST(nest)));

    upb_Message_Freeze(UPB_UPCAST(nest), m);
    ASSERT_FALSE(upb_Message_IsFrozen(msg));
    ASSERT_FALSE(upb_Array_IsFrozen(arr));
    ASSERT_FALSE(upb_Map_IsFrozen(map));
    ASSERT_TRUE(upb_Message_IsFrozen(UPB_UPCAST(nest)));

    const upb_MiniTableField* fa = upb_MiniTable_FindFieldByNumber(m, 20);
    const upb_MiniTable* ma = upb_MiniTable_SubMessage(fa);
    upb_Array_Freeze(arr, ma);
    ASSERT_FALSE(upb_Message_IsFrozen(msg));
    ASSERT_TRUE(upb_Array_IsFrozen(arr));
    ASSERT_FALSE(upb_Map_IsFrozen(map));
    ASSERT_TRUE(upb_Message_IsFrozen(UPB_UPCAST(nest)));

    const upb_MiniTableField* fm = upb_MiniTable_FindFieldByNumber(m, 10);
    const upb_MiniTable* mm = upb_MiniTable_SubMessage(fm);
    upb_Map_Freeze(map, mm);
    ASSERT_FALSE(upb_Message_IsFrozen(msg));
    ASSERT_TRUE(upb_Array_IsFrozen(arr));
    ASSERT_TRUE(upb_Map_IsFrozen(map));
    ASSERT_TRUE(upb_Message_IsFrozen(UPB_UPCAST(nest)));
  }
  {
    upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
    upb_Message* msg = UPB_UPCAST(ext_msg);
    protobuf_test_messages_proto3_TestAllTypesProto3* submsg =
        protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
    upb_Message* submsg_upcast = UPB_UPCAST(submsg);

    ASSERT_FALSE(upb_Message_IsFrozen(msg));
    ASSERT_FALSE(upb_Message_IsFrozen(submsg_upcast));

    // Set a non-canonical extension containing a sub-message.
    bool set_ext_ok = UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
        msg, upb_test_optional_msg_ext_ext, &submsg, arena.ptr());
    ASSERT_TRUE(set_ext_ok);

    // Freezing the parent message should recursively freeze the non-canonical
    // extension's sub-message.
    upb_Message_Freeze(msg, &upb_0test__TestExtensions_msg_init);
    ASSERT_TRUE(upb_Message_IsFrozen(msg));
    ASSERT_TRUE(upb_Message_IsFrozen(submsg_upcast));
  }
}

TEST(MessageTest, FreezeNonCanonicalExtensions) {
  upb::Arena arena;
  upb_test_TestExtensions* msg = upb_test_TestExtensions_new(arena.ptr());

  // Create sub-message
  protobuf_test_messages_proto3_TestAllTypesProto3* ext_submsg =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_int32(
      ext_submsg, 456);

  // Attach as non-canonical extension
  EXPECT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      UPB_UPCAST(msg), upb_test_optional_msg_ext_ext, &ext_submsg,
      arena.ptr()));

  EXPECT_FALSE(upb_Message_IsFrozen(UPB_UPCAST(msg)));
  EXPECT_FALSE(upb_Message_IsFrozen(UPB_UPCAST(ext_submsg)));

  // Freeze the parent message
  upb_Message_Freeze(UPB_UPCAST(msg), &upb_0test__TestExtensions_msg_init);

  EXPECT_TRUE(upb_Message_IsFrozen(UPB_UPCAST(msg)));
  // The non-canonical extension sub-message must be recursively frozen too!
  EXPECT_TRUE(upb_Message_IsFrozen(UPB_UPCAST(ext_submsg)));
}

TEST(MessageTest, DiscardUnknownsNonCanonicalExtensions) {
  upb::Arena arena;
  upb_test_TestExtensions* msg = upb_test_TestExtensions_new(arena.ptr());

  // Create sub-message
  protobuf_test_messages_proto3_TestAllTypesProto3* ext_submsg =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());

  // Attach as non-canonical extension
  EXPECT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      UPB_UPCAST(msg), upb_test_optional_msg_ext_ext, &ext_submsg,
      arena.ptr()));

  // Add a canonical extension
  upb_test_TestExtensions_set_optional_int32_ext(msg, 123, arena.ptr());

  // Add some standard raw unknown bytes
  char raw_unknown[] = "\x08\x96\x01";  // tag 1 = 150
  EXPECT_TRUE(UPB_PRIVATE(_upb_Message_AddUnknown)(
      UPB_UPCAST(msg), raw_unknown, sizeof(raw_unknown) - 1, arena.ptr(),
      kUpb_AddUnknown_Copy));

  // Verify both are present initially
  {
    upb_MessageUnknown data;
    uintptr_t iter = kUpb_Message_UnknownBegin;
    bool has_non_canonical = false;
    bool has_bytes = false;
    while (upb_Message_NextUnknown2(UPB_UPCAST(msg), &data, &iter)) {
      if (data.type == kUpb_MessageUnknownType_NonCanonicalExtension) {
        has_non_canonical = true;
      } else if (data.type == kUpb_MessageUnknownType_StringView) {
        has_bytes = true;
      }
    }
    EXPECT_TRUE(has_non_canonical);
    EXPECT_TRUE(has_bytes);
  }

  // Discard unknown fields on the message
  _upb_Message_DiscardUnknown_shallow(UPB_UPCAST(msg));

  // Verify both non-canonical extension and raw unknown bytes are discarded!
  {
    upb_MessageUnknown data;
    uintptr_t iter = kUpb_Message_UnknownBegin;
    bool has_non_canonical = false;
    bool has_bytes = false;
    while (upb_Message_NextUnknown2(UPB_UPCAST(msg), &data, &iter)) {
      if (data.type == kUpb_MessageUnknownType_NonCanonicalExtension) {
        has_non_canonical = true;
      } else if (data.type == kUpb_MessageUnknownType_StringView) {
        has_bytes = true;
      }
    }
    EXPECT_FALSE(has_non_canonical);
    EXPECT_FALSE(has_bytes);
  }
  EXPECT_TRUE(upb_test_TestExtensions_has_optional_int32_ext(msg));
  EXPECT_EQ(upb_test_TestExtensions_optional_int32_ext(msg), 123);
}

TEST(MessageTest, AppendNonCanonicalExtensionDuplicates) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
  upb_Message* msg = UPB_UPCAST(ext_msg);

  int32_t val1 = 42;
  ASSERT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      msg, upb_test_TestExtensions_optional_int32_ext_ext, &val1, arena.ptr()));

  int32_t val2 = 43;
  ASSERT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      msg, upb_test_TestExtensions_optional_int32_ext_ext, &val2, arena.ptr()));

  // Count non-canonical extensions
  int count = 0;
  uintptr_t iter = kUpb_Message_UnknownBegin;
  upb_MessageUnknown unknown;
  while (upb_Message_NextUnknown2(msg, &unknown, &iter)) {
    if (unknown.type == kUpb_MessageUnknownType_NonCanonicalExtension) {
      if (unknown.value.extension->ext ==
          upb_test_TestExtensions_optional_int32_ext_ext) {
        count++;
      }
    }
  }
  EXPECT_EQ(count, 2);
}

TEST(MessageTest, CoexistCanonicalAndNonCanonicalExtension) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
  upb_Message* msg = UPB_UPCAST(ext_msg);

  // 1. Set as Non-Canonical
  int32_t val1 = 42;
  ASSERT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      msg, upb_test_TestExtensions_optional_int32_ext_ext, &val1, arena.ptr()));

  // 2. Set as Canonical
  upb_test_TestExtensions_set_optional_int32_ext(ext_msg, 43, arena.ptr());

  // Verify Canonical accessor sees 43
  EXPECT_TRUE(upb_test_TestExtensions_has_optional_int32_ext(ext_msg));
  EXPECT_EQ(upb_test_TestExtensions_optional_int32_ext(ext_msg), 43);

  // Verify Non-Canonical iterator sees 42
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    bool found = false;
    while (upb_Message_NextUnknown2(msg, &unknown, &iter)) {
      if (unknown.type == kUpb_MessageUnknownType_NonCanonicalExtension) {
        if (unknown.value.extension->ext ==
            upb_test_TestExtensions_optional_int32_ext_ext) {
          const int32_t* pval = (const int32_t*)&unknown.value.extension->data;
          EXPECT_EQ(*pval, 42);
          found = true;
          break;
        }
      }
    }
    EXPECT_TRUE(found);
  }
}

TEST(MessageTest, CoexistCanonicalAndNonCanonicalExtensionReverse) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
  upb_Message* msg = UPB_UPCAST(ext_msg);

  // 1. Set as Canonical
  upb_test_TestExtensions_set_optional_int32_ext(ext_msg, 43, arena.ptr());

  // 2. Set as Non-Canonical
  int32_t val1 = 42;
  ASSERT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      msg, upb_test_TestExtensions_optional_int32_ext_ext, &val1, arena.ptr()));

  // Verify Canonical accessor sees 43
  EXPECT_TRUE(upb_test_TestExtensions_has_optional_int32_ext(ext_msg));
  EXPECT_EQ(upb_test_TestExtensions_optional_int32_ext(ext_msg), 43);

  // Verify Non-Canonical iterator sees 42
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    bool found = false;
    while (upb_Message_NextUnknown2(msg, &unknown, &iter)) {
      if (unknown.type == kUpb_MessageUnknownType_NonCanonicalExtension) {
        if (unknown.value.extension->ext ==
            upb_test_TestExtensions_optional_int32_ext_ext) {
          const int32_t* pval = (const int32_t*)&unknown.value.extension->data;
          EXPECT_EQ(*pval, 42);
          found = true;
          break;
        }
      }
    }
    EXPECT_TRUE(found);
  }
}

/* Tests some somewhat tricky math used in size calculations while encoding */
TEST(MessageTest, SkippedVarintSize) {
  for (uint32_t clz = 0; clz <= 64; clz++) {
    // Optimized math used in encoding
    uint32_t skip =
        UPB_PRIVATE(upb_WireWriter_VarintUnusedSizeFromLeadingZeros64)(clz);
    // traditional varint size calculation
    uint64_t val = clz == 64 ? 0 : (~uint64_t{0} >> clz);
    uint32_t count = 0;
    do {
      count++;
      val >>= 7;
    } while (val);
    EXPECT_EQ(skip, 10 - count);
  }
}

TEST(MessageTest, MessageTooBig) {
  if (sizeof(size_t) <= 4) {
    GTEST_SKIP() << "Skipping test because size_t is too small";
  }
  if (UPB_MSAN || UPB_ASAN) {
    GTEST_SKIP() << "Skipping test because sanitizers that track shadow memory "
                    "increase overhead and lead to OOMs";
  }
  upb::Arena arena;
  size_t buf_size = 2 * 1024;
  void* bytes = upb_Arena_Malloc(arena.ptr(), buf_size);
  memset(bytes, 0, buf_size);
  upb_StringView bytes_view;
  bytes_view.data = (const char*)bytes;
  bytes_view.size = buf_size;
  upb_test_TestRepeatedMessageBig* msg =
      upb_test_TestRepeatedMessageBig_new(arena.ptr());

  {
    size_t size;
    upb_test_TestRepeatedMessageBig_resize_repeated_bytes(msg, 1024,
                                                          arena.ptr());
    upb_StringView* arr =
        upb_test_TestRepeatedMessageBig_mutable_repeated_bytes(msg, &size);

    for (size_t i = 0; i < size; i++) {
      arr[i] = bytes_view;
    }
    // Message is slightly more than 2mb to serialize
  }
  {
    upb_test_TestRepeatedMessageBig* parent =
        upb_test_TestRepeatedMessageBig_new(arena.ptr());
    upb_test_TestRepeatedMessageBig_resize_repeated_message(parent, 1024,
                                                            arena.ptr());
    size_t size;
    upb_test_TestRepeatedMessageBig** arr =
        upb_test_TestRepeatedMessageBig_mutable_repeated_message(parent, &size);

    for (size_t i = 0; i < size; i++) {
      arr[i] = msg;
    }
    // Message is slightly more than 2gb to serialize, but no individual length
    // delimited message is larger
    msg = parent;
  }
  char* ptr;
  size_t size;
  upb_EncodeStatus status;
  {
    upb::Arena out_arena;
    status =
        upb_Encode(UPB_UPCAST(msg), &upb_0test__TestRepeatedMessageBig_msg_init,
                   0, out_arena.ptr(), &ptr, &size);
    // If the top level message exceeds the limit, that's OK
  }
  if (status == kUpb_EncodeStatus_OutOfMemory) {
    GTEST_SKIP()
        << "Skipping test because we could not allocate a few gigabytes";
  }
  EXPECT_EQ(status, kUpb_EncodeStatus_Ok);
  {
    upb::Arena out_arena;
    status = upb_EncodeLengthPrefixed(
        UPB_UPCAST(msg), &upb_0test__TestRepeatedMessageBig_msg_init, 0,
        out_arena.ptr(), &ptr, &size);
  }
  if (status != kUpb_EncodeStatus_OutOfMemory &&
      status != kUpb_EncodeStatus_MaxSizeExceeded) {
    // If we ever try to length-delimit something larger than fits in 32 bits,
    // it's an error
    FAIL() << "Expected OutOfMemory or MaxSizeExceeded, got " << status;
  }
}

TEST(MessageTest, ArenaSpaceAllocatedAfterDecode) {
  upb::Arena arena;
  uintptr_t space_allocated_before =
      upb_Arena_SpaceAllocated(arena.ptr(), nullptr);
  char region[300];
  memset(region, 0, sizeof(region));
  region[0] = 0x0A;  // Tag number 1
  region[1] = 0xA9;
  region[2] = 0x02;
  upb_test_EmptyMessage* msg =
      upb_test_EmptyMessage_parse(region, sizeof(region), arena.ptr());
  EXPECT_NE(msg, nullptr);
  uintptr_t space_allocated_after =
      upb_Arena_SpaceAllocated(arena.ptr(), nullptr);
  EXPECT_GT(space_allocated_after, space_allocated_before + 297u);
}

TEST(MessageTest, NextUnknown2AndDeleteUnknown2) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());

  // 0. Verify a clean/empty message doesn't report unknowns and handles NULL
  //    internal data correctly.
  EXPECT_FALSE(upb_Message_HasUnknown(UPB_UPCAST(ext_msg)));
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    EXPECT_FALSE(
        upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
  }

  // Tag 5 (varint), value 147
  char region[] = {0x28, static_cast<char>(0x93), 0x01};
  upb_DecodeStatus decode_status =
      upb_Decode(region, sizeof(region), UPB_UPCAST(ext_msg),
                 &upb_0test__TestExtensions_msg_init, nullptr, 0, arena.ptr());
  ASSERT_EQ(decode_status, kUpb_DecodeStatus_Ok);

  // 2. Add a non-canonical extension of tag 1000
  int32_t val = 42;
  bool set_ext_ok = UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
      UPB_UPCAST(ext_msg), upb_test_TestExtensions_optional_int32_ext_ext, &val,
      arena.ptr());
  ASSERT_TRUE(set_ext_ok);

  // 2.5 Add a canonical extension of tag 1002 (should be skipped by
  //     NextUnknown2)
  upb_test_TestExtensions* sub_msg = upb_test_TestExtensions_new(arena.ptr());
  bool set_canonical_ok = upb_Message_SetExtension(
      UPB_UPCAST(ext_msg), upb_test_optional_msg_ext_ext, &sub_msg,
      arena.ptr());
  ASSERT_TRUE(set_canonical_ok);

  // 3. Iterate over the unknown fields using upb_Message_NextUnknown2
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    bool found_bytes = false;
    bool found_ext = false;

    while (upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter)) {
      if (unknown.type == kUpb_MessageUnknownType_StringView) {
        EXPECT_FALSE(found_bytes);
        found_bytes = true;
        EXPECT_EQ(unknown.value.bytes.size, sizeof(region));
        EXPECT_EQ(memcmp(unknown.value.bytes.data, region, sizeof(region)), 0);
      } else if (unknown.type ==
                 kUpb_MessageUnknownType_NonCanonicalExtension) {
        EXPECT_FALSE(found_ext);
        found_ext = true;
        const upb_Extension* ext =
            (const upb_Extension*)unknown.value.extension;
        EXPECT_EQ(ext->ext, upb_test_TestExtensions_optional_int32_ext_ext);
        EXPECT_EQ(ext->data.int32_val, 42);
      } else {
        FAIL() << "Unexpected unknown type: " << (int)unknown.type;
      }
    }
    EXPECT_TRUE(found_bytes);
    EXPECT_TRUE(found_ext);
  }

  // 4. Test upb_Message_HasUnknown (it uses upb_Message_NextUnknown2
  //    under the hood)
  EXPECT_TRUE(upb_Message_HasUnknown(UPB_UPCAST(ext_msg)));

  // 5. Test upb_Message_DeleteUnknown2 on non-canonical extension
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    bool deleted_ext = false;

    if (upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter)) {
      do {
        if (unknown.type == kUpb_MessageUnknownType_NonCanonicalExtension) {
          upb_Message_DeleteUnknownStatus status = upb_Message_DeleteUnknown2(
              UPB_UPCAST(ext_msg), &unknown, &iter, arena.ptr());
          EXPECT_TRUE(status == kUpb_DeleteUnknown_IterUpdated ||
                      status == kUpb_DeleteUnknown_DeletedLast);
          deleted_ext = true;
          if (status == kUpb_DeleteUnknown_DeletedLast) {
            break;
          }
          continue;
        }
      } while (upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    }
    EXPECT_TRUE(deleted_ext);

    // After deleting the extension, verify only the bytes unknown field
    // remains.
    iter = kUpb_Message_UnknownBegin;
    bool found_bytes = false;
    bool found_ext = false;
    while (upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter)) {
      if (unknown.type == kUpb_MessageUnknownType_StringView) {
        found_bytes = true;
      } else if (unknown.type ==
                 kUpb_MessageUnknownType_NonCanonicalExtension) {
        found_ext = true;
      }
    }
    EXPECT_TRUE(found_bytes);
    EXPECT_FALSE(found_ext);
  }

  // 6. Test deleting the remaining unknown bytes field.
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    bool deleted_bytes = false;

    if (upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter)) {
      do {
        if (unknown.type == kUpb_MessageUnknownType_StringView) {
          upb_Message_DeleteUnknownStatus status = upb_Message_DeleteUnknown2(
              UPB_UPCAST(ext_msg), &unknown, &iter, arena.ptr());
          EXPECT_EQ(status, kUpb_DeleteUnknown_DeletedLast);
          deleted_bytes = true;
          break;
        }
      } while (upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    }
    EXPECT_TRUE(deleted_bytes);
    EXPECT_FALSE(upb_Message_HasUnknown(UPB_UPCAST(ext_msg)));
  }
}

TEST(MessageTest, DeleteUnknown2Partial) {
  upb::Arena arena;
  upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());

  // Add 10 bytes of unknown data: tag 5, length delimited, value "12345678"
  // Tag 5, wire type 2: 0x2A
  // Length 8: 0x08
  // Data: "12345678"
  char region[] = {0x2A, 0x08, '1', '2', '3', '4', '5', '6', '7', '8'};
  upb_DecodeStatus decode_status =
      upb_Decode(region, sizeof(region), UPB_UPCAST(ext_msg),
                 &upb_0test__TestExtensions_msg_init, nullptr, 0, arena.ptr());
  ASSERT_EQ(decode_status, kUpb_DecodeStatus_Ok);

  // 1. Test Strip Prefix
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    ASSERT_EQ(unknown.type, kUpb_MessageUnknownType_StringView);
    ASSERT_EQ(unknown.value.bytes.size, sizeof(region));

    // We want to delete the first 2 bytes: {0x2A, 0x08}
    upb_MessageUnknown to_delete = unknown;
    to_delete.value.bytes.size = 2;

    upb_Message_DeleteUnknownStatus status = upb_Message_DeleteUnknown2(
        UPB_UPCAST(ext_msg), &to_delete, &iter, arena.ptr());
    EXPECT_EQ(status, kUpb_DeleteUnknown_IterUpdated);

    // After Strip Prefix, the remaining part should be returned in to_delete
    EXPECT_EQ(to_delete.value.bytes.size, sizeof(region) - 2);
    EXPECT_EQ(to_delete.value.bytes.data, unknown.value.bytes.data + 2);

    // Verify message state: Reset iter and verify the remaining part is there
    iter = kUpb_Message_UnknownBegin;
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    EXPECT_EQ(unknown.value.bytes.size, sizeof(region) - 2);
    EXPECT_EQ(unknown.value.bytes.data, to_delete.value.bytes.data);
  }

  // Reload the message with fresh data for the next test
  ext_msg = upb_test_TestExtensions_new(arena.ptr());
  decode_status =
      upb_Decode(region, sizeof(region), UPB_UPCAST(ext_msg),
                 &upb_0test__TestExtensions_msg_init, nullptr, 0, arena.ptr());
  ASSERT_EQ(decode_status, kUpb_DecodeStatus_Ok);

  // 2. Test Split in Middle
  {
    // Add a non-canonical extension to ensure in->size > 1, triggering memmove
    int32_t val = 42;
    ASSERT_TRUE(UPB_PRIVATE(_upb_Message_SetNonCanonicalExtension)(
        UPB_UPCAST(ext_msg), upb_test_TestExtensions_optional_int32_ext_ext,
        &val, arena.ptr()));

    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    ASSERT_EQ(unknown.type, kUpb_MessageUnknownType_StringView);

    // We want to delete bytes 4 and 5: {'3', '4'}
    upb_MessageUnknown to_delete = unknown;
    to_delete.value.bytes.data = unknown.value.bytes.data + 4;
    to_delete.value.bytes.size = 2;

    upb_Message_DeleteUnknownStatus status = upb_Message_DeleteUnknown2(
        UPB_UPCAST(ext_msg), &to_delete, &iter, arena.ptr());
    EXPECT_EQ(status, kUpb_DeleteUnknown_IterUpdated);

    // After Split in Middle, DeleteUnknown2 falls through and calls
    // NextUnknown2. It should return the SUFFIX block!
    EXPECT_EQ(to_delete.type, kUpb_MessageUnknownType_StringView);
    EXPECT_EQ(to_delete.value.bytes.size, 4u);
    EXPECT_EQ(to_delete.value.bytes.data, unknown.value.bytes.data + 6);

    // Verify message state: Reset iter and verify we have THREE blocks now
    // (Prefix, Suffix, Extension).
    iter = kUpb_Message_UnknownBegin;

    // First block (Prefix)
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    EXPECT_EQ(unknown.value.bytes.size, 4u);
    EXPECT_EQ(memcmp(unknown.value.bytes.data, region, 4), 0);

    // Second block (Suffix)
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    EXPECT_EQ(unknown.value.bytes.size, 4u);
    EXPECT_EQ(memcmp(unknown.value.bytes.data, region + 6, 4), 0);

    // Third block (Extension)
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    EXPECT_EQ(unknown.type, kUpb_MessageUnknownType_NonCanonicalExtension);

    // No more blocks
    EXPECT_FALSE(
        upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
  }

  // Reload the message with fresh data for the next test
  ext_msg = upb_test_TestExtensions_new(arena.ptr());
  decode_status =
      upb_Decode(region, sizeof(region), UPB_UPCAST(ext_msg),
                 &upb_0test__TestExtensions_msg_init, nullptr, 0, arena.ptr());
  ASSERT_EQ(decode_status, kUpb_DecodeStatus_Ok);

  // 3. Test Truncate Suffix
  {
    uintptr_t iter = kUpb_Message_UnknownBegin;
    upb_MessageUnknown unknown;
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    ASSERT_EQ(unknown.type, kUpb_MessageUnknownType_StringView);

    // We want to delete the last 2 bytes: {'7', '8'}
    upb_MessageUnknown to_delete = unknown;
    to_delete.value.bytes.data = unknown.value.bytes.data + 8;
    to_delete.value.bytes.size = 2;

    upb_Message_DeleteUnknownStatus status = upb_Message_DeleteUnknown2(
        UPB_UPCAST(ext_msg), &to_delete, &iter, arena.ptr());
    EXPECT_EQ(status, kUpb_DeleteUnknown_DeletedLast);

    // Verify message state
    iter = kUpb_Message_UnknownBegin;
    ASSERT_TRUE(upb_Message_NextUnknown2(UPB_UPCAST(ext_msg), &unknown, &iter));
    EXPECT_EQ(unknown.value.bytes.size, 8u);
    EXPECT_EQ(memcmp(unknown.value.bytes.data, region, 8), 0);
  }
}

TEST(MessageTest, NextSerializableField) {
  upb::Arena arena;
  upb_test_TestRequiredFields* test_msg =
      upb_test_TestRequiredFields_new(arena.ptr());

  const upb_MiniTable* mt = &upb_0test__TestRequiredFields_msg_init;
  const upb_MiniTableField* f = nullptr;
  uintptr_t iter = kUpb_Message_SerializableFieldBegin;

  // 1. When no fields are set, iteration should return false immediately.
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(test_msg), mt, &f, &iter));

  // 2. Set one field. Iteration should find exactly this field.
  upb_test_TestRequiredFields_set_required_int32(test_msg, 42);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(test_msg), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 1u);  // required_int32 is field 1

  // Next step should return false.
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(test_msg), mt, &f, &iter));

  // 3. Set another field. Iteration should find both.
  upb_test_TestRequiredFields_set_required_int64(test_msg, 100);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;

  // First field: field 1
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(test_msg), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 1u);

  // Second field: field 3 (required_int64 is field 3)
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(test_msg), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 3u);

  // End of iteration
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(test_msg), mt, &f, &iter));

  // 4. Proto2 presence for default values (0):
  // Setting an optional field to 0 sets its hasbit, so it is included.
  upb_test_TestRequiredFields* google_protobuf_msg =
      upb_test_TestRequiredFields_new(arena.ptr());
  upb_test_TestRequiredFields_set_optional_int32(google_protobuf_msg, 0);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(google_protobuf_msg), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 2u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(google_protobuf_msg), mt, &f, &iter));

  // 5. Repeated fields and map fields (NULL vs allocated):
  const upb_MiniTable* freeze_mt = &upb_0test__TestFreeze_msg_init;

  // - Repeated field:
  //   * NULL repeated field (default) is ignored.
  upb_test_TestFreeze* msg_arr = upb_test_TestFreeze_new(arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr), freeze_mt,
                                                 &f, &iter));
  //   * Allocated repeated field (even if empty with size = 0) has a
  //     non-NULL pointer and is considered set by NextSerializableField.
  upb_test_TestFreeze_resize_array_int(msg_arr, 0, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr), freeze_mt,
                                                &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 20u);
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr), freeze_mt,
                                                 &f, &iter));
  //   * Allocated non-empty repeated field (size > 0) is yielded.
  upb_test_TestFreeze* msg_arr_nonempty = upb_test_TestFreeze_new(arena.ptr());
  upb_test_TestFreeze_resize_array_int(msg_arr_nonempty, 3, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr_nonempty),
                                                freeze_mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 20u);
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr_nonempty),
                                                 freeze_mt, &f, &iter));

  // - Map field:
  //   * NULL map field (default) is ignored.
  upb_test_TestFreeze* msg_map = upb_test_TestFreeze_new(arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map), freeze_mt,
                                                 &f, &iter));
  //   * Allocated map field (even if empty with size = 0) has a
  //     non-NULL pointer and is considered set by NextSerializableField.
  upb_test_TestFreeze_map_int_set(msg_map, 1, 2, arena.ptr());
  upb_test_TestFreeze_map_int_delete(msg_map, 1);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map), freeze_mt,
                                                &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 10u);
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map), freeze_mt,
                                                 &f, &iter));
  //   * Allocated non-empty map field (size > 0) is yielded.
  upb_test_TestFreeze* msg_map_nonempty = upb_test_TestFreeze_new(arena.ptr());
  upb_test_TestFreeze_map_int_set(msg_map_nonempty, 1, 2, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map_nonempty),
                                                freeze_mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 10u);
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map_nonempty),
                                                 freeze_mt, &f, &iter));

  // 6. Submessages (NULL vs allocated):
  // - NULL submessage (default) is ignored.
  upb_test_TestRequiredFields* msg_sub =
      upb_test_TestRequiredFields_new(arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_sub), mt, &f, &iter));
  // - Allocated submessage is included.
  upb_test_TestRequiredFields_set_optional_message(
      msg_sub, upb_test_TestRequiredFields_new(arena.ptr()));
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_sub), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 4u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_sub), mt, &f, &iter));
}

extern "C" const upb_MiniTable
    protobuf_0test_0messages__proto3__TestAllTypesProto3_msg_init;

TEST(MessageTest, NextSerializableFieldProto3) {
  upb::Arena arena;
  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  const upb_MiniTable* mt =
      &protobuf_0test_0messages__proto3__TestAllTypesProto3_msg_init;

  const upb_MiniTableField* f = nullptr;
  uintptr_t iter = kUpb_Message_SerializableFieldBegin;

  // 1. When no fields are set, iteration should return false immediately.
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg), mt, &f, &iter));

  // 2. The field at MiniTable index 0: optional_int32 (number 1, index 0).
  // Non-default value (123) should be serializable.
  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_int32(msg, 123);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 1u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg), mt, &f, &iter));

  // 3. Proto3 scalar fields set to default (0, empty string) vs non-default:
  // - Setting a field to 0 or empty string should be ignored (skipped).
  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_int32(
      msg, 0);  // Reset
  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_string(
      msg, upb_StringView_FromString(""));  // Set to empty string
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg), mt, &f, &iter));

  // 4. Repeated fields and map fields (NULL vs allocated):
  // - Repeated field:
  //   * NULL repeated field (default) is ignored.
  protobuf_test_messages_proto3_TestAllTypesProto3* msg_arr =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_arr), mt, &f, &iter));
  //   * Allocated repeated field (even if empty with size = 0) has a
  //     non-NULL pointer and is considered set by NextSerializableField.
  protobuf_test_messages_proto3_TestAllTypesProto3_resize_repeated_int32(
      msg_arr, 0, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_arr), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 31u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_arr), mt, &f, &iter));
  //   * Allocated non-empty repeated field (size > 0) is yielded.
  protobuf_test_messages_proto3_TestAllTypesProto3* msg_arr_nonempty =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  protobuf_test_messages_proto3_TestAllTypesProto3_add_repeated_int32(
      msg_arr_nonempty, 99, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr_nonempty),
                                                mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 31u);
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_arr_nonempty),
                                                 mt, &f, &iter));

  // - Map field:
  //   * NULL map field (default) is ignored.
  protobuf_test_messages_proto3_TestAllTypesProto3* msg_map =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_map), mt, &f, &iter));
  //   * Allocated map field (even if empty with size = 0) has a
  //     non-NULL pointer and is considered set by NextSerializableField.
  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
      msg_map, 1, 2, arena.ptr());
  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_delete(
      msg_map, 1);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_map), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 56u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_map), mt, &f, &iter));
  //   * Allocated non-empty map field (size > 0) is yielded.
  protobuf_test_messages_proto3_TestAllTypesProto3* msg_map_nonempty =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
      msg_map_nonempty, 1, 2, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map_nonempty),
                                                mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 56u);
  EXPECT_FALSE(upb_Message_NextSerializableField(UPB_UPCAST(msg_map_nonempty),
                                                 mt, &f, &iter));

  // 5. Fields in oneofs (presence test for default values):
  // Since oneofs have presence, setting a oneof scalar to its default value (0)
  // should be included.
  protobuf_test_messages_proto3_TestAllTypesProto3* msg_oneof =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  protobuf_test_messages_proto3_TestAllTypesProto3_set_oneof_uint32(msg_oneof,
                                                                    0);
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_oneof), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 111u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_oneof), mt, &f, &iter));

  // 6. Submessages (NULL vs allocated):
  // - NULL submessage (default) should be ignored.
  protobuf_test_messages_proto3_TestAllTypesProto3* msg_sub =
      protobuf_test_messages_proto3_TestAllTypesProto3_new(arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_sub), mt, &f, &iter));
  // - Allocated submessage should be included.
  protobuf_test_messages_proto3_TestAllTypesProto3_mutable_optional_nested_message(
      msg_sub, arena.ptr());
  f = nullptr;
  iter = kUpb_Message_SerializableFieldBegin;
  EXPECT_TRUE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_sub), mt, &f, &iter));
  ASSERT_NE(f, nullptr);
  EXPECT_EQ(upb_MiniTableField_Number(f), 18u);
  EXPECT_FALSE(
      upb_Message_NextSerializableField(UPB_UPCAST(msg_sub), mt, &f, &iter));
}
