| // Protocol Buffers - Google's data interchange format |
| // Copyright 2025 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 "upb/wire/decode_fast/select.h" |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <cstdio> |
| #include <cstring> |
| |
| #include <gtest/gtest.h> |
| #include "absl/base/macros.h" |
| #include "upb/mem/arena.hpp" |
| #include "upb/mini_table/internal/message.h" |
| #include "upb/wire/decode_fast/combinations.h" |
| #include "upb/wire/test_util/field_types.h" |
| #include "upb/wire/test_util/make_mini_table.h" |
| |
| // Must be last. |
| #include "upb/port/def.inc" |
| |
| namespace upb { |
| namespace test { |
| namespace { |
| |
| TEST(SelectTest, FunctionIndicesMatch) { |
| // Verify that UPB_DECODEFAST_FUNCTION_IDX() and UPB_DECODEFAST_FUNCTIONS() |
| // use the same ordering and the indexes correctly match. |
| #define IDX(type, card, size) \ |
| UPB_DECODEFAST_FUNCTION_IDX(kUpb_DecodeFast_##type, kUpb_DecodeFast_##card, \ |
| kUpb_DecodeFast_##size), |
| static const uint32_t numbers[] = {UPB_DECODEFAST_FUNCTIONS(IDX)}; |
| for (size_t i = 0; i < ABSL_ARRAYSIZE(numbers); i++) { |
| EXPECT_EQ(numbers[i], i) << upb_DecodeFast_GetFunctionName(i) << " vs " |
| << upb_DecodeFast_GetFunctionName(numbers[i]); |
| } |
| #undef IDX |
| } |
| |
| TEST(SelectTest, UnknownSlotsAssignedForNonExtendable) { |
| upb::Arena mt_arena; |
| auto [mt, field] = MiniTable::MakeSingleFieldTable<field_types::Int32>( |
| 1, kUpb_DecodeFast_Scalar, mt_arena.ptr()); |
| |
| upb_DecodeFast_TableEntry table[32]; |
| int size = upb_DecodeFast_BuildTable(mt, table); |
| |
| // Field 1 maps to slot 1: (1 << 3) | 0 (varint wire type) = 8. |
| // Bits 3-7 are 00001, so slot 1. |
| // Table size will be 2 (power of 2 >= max+1). |
| EXPECT_EQ(size, 2); |
| EXPECT_NE(table[1].function_idx, UINT32_MAX); |
| EXPECT_NE(table[1].function_idx, kUpb_DecodeFast_Unknown); |
| EXPECT_EQ(table[0].function_idx, kUpb_DecodeFast_Unknown); |
| |
| // The all_fields_assigned bit should be set in ext since the message |
| // is non-extendable and all fields were placed in the fasttable. |
| EXPECT_NE(mt->UPB_PRIVATE(ext) & kUpb_ExtMode_AllFastFieldsAssigned, 0); |
| } |
| |
| } // namespace |
| } // namespace test |
| } // namespace upb |