| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <lib/fidl/internal.h> |
| |
| #include <fidl/test/example/codingtables/llcpp/fidl.h> |
| #include <zxtest/zxtest.h> |
| |
| TEST(SomeStruct, CodingTable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingSomeStructRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& some_struct_table = type.coded_struct(); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingSomeStructRequest", some_struct_table.name); |
| // Every field (including primitives without padding) has a coding table generated for it. |
| ASSERT_EQ(2, some_struct_table.element_count); |
| ASSERT_EQ(kFidlStructElementType_Field, some_struct_table.elements[0].header.element_type); |
| EXPECT_EQ(&fidl_internal_kBoolTable, some_struct_table.elements[0].field.field_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, some_struct_table.elements[0].header.is_resource); |
| EXPECT_EQ(16, some_struct_table.elements[0].field.offset); |
| ASSERT_EQ(kFidlStructElementType_Padding32, some_struct_table.elements[1].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, some_struct_table.elements[1].header.is_resource); |
| EXPECT_EQ(16, some_struct_table.elements[1].padding.offset); |
| EXPECT_EQ(0xffffff00, some_struct_table.elements[1].padding.mask_32); |
| } |
| |
| TEST(StructWithSomeFieldsRemoved, CodingTable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingStructWithSomeFieldsRemovedFromCodingTablesRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& coded_struct = type.coded_struct(); |
| ASSERT_STR_EQ( |
| "fidl.test.example.codingtables/CodingStructWithSomeFieldsRemovedFromCodingTablesRequest", |
| coded_struct.name); |
| |
| ASSERT_EQ(6, coded_struct.element_count); |
| |
| ASSERT_EQ(kFidlStructElementType_Padding64, coded_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_struct.elements[0].header.is_resource); |
| EXPECT_EQ(16, coded_struct.elements[0].padding.offset); |
| EXPECT_EQ(0xffffffffffffff00ull, coded_struct.elements[0].padding.mask_64); |
| |
| ASSERT_EQ(kFidlStructElementType_Padding64, coded_struct.elements[1].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_struct.elements[1].header.is_resource); |
| EXPECT_EQ(32, coded_struct.elements[1].padding.offset); |
| EXPECT_EQ(0xffffffffff000000ull, coded_struct.elements[1].padding.mask_64); |
| |
| ASSERT_EQ(kFidlStructElementType_Padding16, coded_struct.elements[2].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_struct.elements[2].header.is_resource); |
| EXPECT_EQ(48, coded_struct.elements[2].padding.offset); |
| EXPECT_EQ(0xff00, coded_struct.elements[2].padding.mask_16); |
| |
| ASSERT_EQ(kFidlStructElementType_Field, coded_struct.elements[3].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_struct.elements[3].header.is_resource); |
| EXPECT_EQ(&fidl_internal_kBoolTable, |
| coded_struct.elements[3].field.field_type->coded_array().element); |
| EXPECT_EQ(54, coded_struct.elements[3].field.offset); |
| |
| ASSERT_EQ(kFidlStructElementType_Padding16, coded_struct.elements[4].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_struct.elements[4].header.is_resource); |
| EXPECT_EQ(54, coded_struct.elements[4].padding.offset); |
| EXPECT_EQ(0xff00, coded_struct.elements[4].padding.mask_16); |
| } |
| |
| TEST(MyXUnion, CodingTableWhenNullable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingMyXUnionRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(1, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingMyXUnionRequest", request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& my_xunion_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, my_xunion_field.offset); |
| |
| const fidl_type& my_xunion_type = *my_xunion_field.field_type; |
| ASSERT_EQ(kFidlTypeXUnion, my_xunion_type.type_tag()); |
| const FidlCodedXUnion& my_xunion_table = my_xunion_type.coded_xunion(); |
| |
| // Please keep these assertions in the same order as FidlCodedXUnion's member variables. |
| |
| ASSERT_EQ(2, my_xunion_table.field_count); |
| |
| ASSERT_EQ(&fidl_internal_kBoolTable, my_xunion_table.fields[0].type); |
| ASSERT_EQ(&fidl_internal_kInt32Table, my_xunion_table.fields[1].type); |
| |
| ASSERT_EQ(kFidlNullability_Nullable, my_xunion_table.nullable); |
| |
| ASSERT_STR_EQ("fidl.test.example.codingtables/MyXUnion", my_xunion_table.name); |
| |
| ASSERT_EQ(kFidlStrictness_Flexible, my_xunion_type.coded_xunion().strictness); |
| ASSERT_EQ(kFidlIsResource_NotResource, my_xunion_type.coded_xunion().is_resource); |
| } |
| |
| TEST(MyStrictXUnion, CodingTableWhenNullable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingMyStrictXUnionRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(1, request_struct.element_count); |
| |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingMyStrictXUnionRequest", request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& my_strict_xunion_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, my_strict_xunion_field.offset); |
| |
| const fidl_type& my_strict_xunion_type = *my_strict_xunion_field.field_type; |
| ASSERT_EQ(kFidlTypeXUnion, my_strict_xunion_type.type_tag()); |
| const FidlCodedXUnion& my_strict_xunion_table = my_strict_xunion_type.coded_xunion(); |
| |
| // Please keep these assertions in the same order as FidlCodedXUnion's member variables. |
| |
| ASSERT_EQ(2, my_strict_xunion_table.field_count); |
| |
| ASSERT_EQ(&fidl_internal_kBoolTable, my_strict_xunion_table.fields[0].type); |
| ASSERT_EQ(&fidl_internal_kInt32Table, my_strict_xunion_table.fields[1].type); |
| |
| ASSERT_EQ(kFidlNullability_Nullable, my_strict_xunion_table.nullable); |
| |
| ASSERT_STR_EQ("fidl.test.example.codingtables/MyStrictXUnion", my_strict_xunion_table.name); |
| |
| ASSERT_EQ(kFidlStrictness_Strict, my_strict_xunion_type.coded_xunion().strictness); |
| ASSERT_EQ(kFidlIsResource_NotResource, my_strict_xunion_type.coded_xunion().is_resource); |
| } |
| |
| TEST(MyTable, CodingTable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingVectorOfMyTableRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(1, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingVectorOfMyTableRequest", request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& vector_of_my_table_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, vector_of_my_table_field.offset); |
| const fidl_type& vector_of_my_table_type = *vector_of_my_table_field.field_type; |
| ASSERT_EQ(kFidlTypeVector, vector_of_my_table_type.type_tag()); |
| const FidlCodedVector& table_vector = vector_of_my_table_type.coded_vector(); |
| |
| const fidl_type& table_type = *table_vector.element; |
| ASSERT_EQ(kFidlTypeTable, table_type.type_tag()); |
| const FidlCodedTable& coded_table = table_type.coded_table(); |
| ASSERT_EQ(4, coded_table.field_count); |
| |
| // The ordering in the coding table is |foo|, |bar|, |baz|, and finally |
| // |qux|, i.e. following ordinal order. |
| const FidlTableField& field_0 = coded_table.fields[0]; |
| ASSERT_EQ(1, field_0.ordinal); |
| ASSERT_EQ(&fidl_internal_kBoolTable, field_0.type); |
| |
| const FidlTableField& field_1 = coded_table.fields[1]; |
| ASSERT_EQ(2, field_1.ordinal); |
| ASSERT_EQ(&fidl_internal_kInt32Table, field_1.type); |
| |
| const FidlTableField& field_2 = coded_table.fields[2]; |
| ASSERT_EQ(4, field_2.ordinal); |
| ASSERT_EQ(kFidlTypeArray, field_2.type->type_tag()); |
| |
| const FidlTableField& field_3 = coded_table.fields[3]; |
| ASSERT_EQ(5, field_3.ordinal); |
| ASSERT_EQ(kFidlTypeVector, field_3.type->type_tag()); |
| } |
| |
| TEST(MyXUnion, CodingTableWhenNonnullable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingVectorOfMyXUnionRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(1, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingVectorOfMyXUnionRequest", |
| request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& vector_of_my_xunion_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, vector_of_my_xunion_field.offset); |
| const fidl_type& vector_of_my_xunion_type = *vector_of_my_xunion_field.field_type; |
| ASSERT_EQ(kFidlTypeVector, vector_of_my_xunion_type.type_tag()); |
| const FidlCodedVector& xunion_vector = vector_of_my_xunion_type.coded_vector(); |
| |
| const fidl_type& xunion_type = *xunion_vector.element; |
| ASSERT_EQ(kFidlTypeXUnion, xunion_type.type_tag()); |
| const FidlCodedXUnion& coded_xunion = xunion_type.coded_xunion(); |
| |
| ASSERT_EQ(kFidlNullability_Nonnullable, coded_xunion.nullable); |
| |
| ASSERT_EQ(kFidlStrictness_Flexible, coded_xunion.strictness); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_xunion.is_resource); |
| } |
| |
| TEST(MyStrictXUnion, CodingTableWhenNonnullable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingVectorOfMyStrictXUnionRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(1, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingVectorOfMyStrictXUnionRequest", |
| request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& vector_of_my_xunion_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, vector_of_my_xunion_field.offset); |
| const fidl_type& vector_of_my_xunion_type = *vector_of_my_xunion_field.field_type; |
| ASSERT_EQ(kFidlTypeVector, vector_of_my_xunion_type.type_tag()); |
| const FidlCodedVector& xunion_vector = vector_of_my_xunion_type.coded_vector(); |
| |
| const fidl_type& xunion_type = *xunion_vector.element; |
| ASSERT_EQ(kFidlTypeXUnion, xunion_type.type_tag()); |
| const FidlCodedXUnion& coded_xunion = xunion_type.coded_xunion(); |
| |
| ASSERT_EQ(kFidlNullability_Nonnullable, coded_xunion.nullable); |
| |
| ASSERT_EQ(kFidlStrictness_Strict, coded_xunion.strictness); |
| ASSERT_EQ(kFidlIsResource_NotResource, coded_xunion.is_resource); |
| } |
| |
| TEST(MyBits, CodingTable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingMyBitsRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(2, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingMyBitsRequest", request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& my_bits_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, my_bits_field.offset); |
| const fidl_type& my_bits_type = *my_bits_field.field_type; |
| ASSERT_EQ(kFidlTypeBits, my_bits_type.type_tag()); |
| const FidlCodedBits& my_bits_table = my_bits_type.coded_bits(); |
| ASSERT_EQ(kFidlCodedPrimitiveSubtype_Uint8, my_bits_table.underlying_type); |
| ASSERT_EQ(0x1u | 0x10u, my_bits_table.mask); |
| |
| ASSERT_EQ(kFidlStructElementType_Padding64, request_struct.elements[1].header.element_type); |
| ASSERT_EQ(16, request_struct.elements[1].padding.offset); |
| ASSERT_EQ(0xffffffffffffff00, request_struct.elements[1].padding.mask_64); |
| } |
| |
| TEST(MyEnum, CodingTable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingMyEnumRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& request_struct = type.coded_struct(); |
| ASSERT_EQ(2, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingMyEnumRequest", request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& my_enum_field = request_struct.elements[0].field; |
| ASSERT_EQ(16, my_enum_field.offset); |
| const fidl_type& my_enum_type = *my_enum_field.field_type; |
| ASSERT_EQ(kFidlTypeEnum, my_enum_type.type_tag()); |
| const FidlCodedEnum& my_enum_table = my_enum_type.coded_enum(); |
| ASSERT_EQ(kFidlCodedPrimitiveSubtype_Uint32, my_enum_table.underlying_type); |
| |
| ASSERT_EQ(kFidlStructElementType_Padding32, request_struct.elements[1].header.element_type); |
| ASSERT_EQ(20, request_struct.elements[1].padding.offset); |
| ASSERT_EQ(0xffffffff, request_struct.elements[1].padding.mask_32); |
| } |
| |
| // This ensures that the number collision tests compile. (See fxbug.dev/7772). |
| // These tests ensure that the name mangling rules used in the generator avoid certain types |
| // of collisions that appeared in earlier versions (e.g. number of elements would merge with |
| // other content). |
| TEST(NumberCollision, CodingTable) { |
| const fidl_type& type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingNumberCollisionRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, type.type_tag()); |
| const FidlCodedStruct& number_collision_table = type.coded_struct(); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingNumberCollisionRequest", |
| number_collision_table.name); |
| ASSERT_EQ(5, number_collision_table.element_count); |
| } |
| |
| TEST(ForeignXUnions, CodingTable) { |
| const fidl_type& req_type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingForeignXUnionsRequestTable; |
| ASSERT_EQ(kFidlTypeStruct, req_type.type_tag()); |
| const FidlCodedStruct& request_struct = req_type.coded_struct(); |
| ASSERT_EQ(1, request_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingForeignXUnionsRequest", request_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, request_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& tx_field = request_struct.elements[0].field; |
| const fidl_type& tx_type = *tx_field.field_type; |
| ASSERT_EQ(kFidlTypeXUnion, tx_type.type_tag()); |
| const FidlCodedXUnion& tx_table = tx_type.coded_xunion(); |
| ASSERT_STR_EQ("fidl.test.example.codingtablesdeps/MyXUnionA", tx_table.name); |
| ASSERT_EQ(kFidlNullability_Nonnullable, tx_table.nullable); |
| ASSERT_EQ(kFidlIsResource_NotResource, tx_table.is_resource); |
| ASSERT_EQ(2, tx_table.field_count); |
| |
| const fidl_type& resp_type = llcpp::fidl::test::example::codingtables:: |
| fidl_test_example_codingtables_CodingForeignXUnionsResponseTable; |
| ASSERT_EQ(kFidlTypeStruct, resp_type.type_tag()); |
| const FidlCodedStruct& response_struct = resp_type.coded_struct(); |
| ASSERT_EQ(1, response_struct.element_count); |
| ASSERT_STR_EQ("fidl.test.example.codingtables/CodingForeignXUnionsResponse", |
| response_struct.name); |
| ASSERT_EQ(kFidlStructElementType_Field, response_struct.elements[0].header.element_type); |
| ASSERT_EQ(kFidlIsResource_NotResource, request_struct.elements[0].header.is_resource); |
| const FidlStructField& rx_field = response_struct.elements[0].field; |
| const fidl_type& rx_type = *rx_field.field_type; |
| ASSERT_EQ(kFidlTypeXUnion, rx_type.type_tag()); |
| const FidlCodedXUnion& rx_table = rx_type.coded_xunion(); |
| ASSERT_STR_EQ("fidl.test.example.codingtablesdeps/MyXUnionA", rx_table.name); |
| ASSERT_EQ(kFidlNullability_Nullable, rx_table.nullable); |
| ASSERT_EQ(kFidlIsResource_NotResource, rx_table.is_resource); |
| ASSERT_EQ(2, rx_table.field_count); |
| } |