blob: b279b5e3c64cd4623ea104755b2d6187faa6146f [file] [log] [blame]
// 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.
library test.conformance;
using zx;
type TransactionHeader = struct {
tx_id uint32;
flags array<uint8, 3>;
magic_number uint8;
ordinal uint64;
};
type UnionSize8Align4 = strict union {
1: unused1 uint8;
2: unused2 uint8;
3: variant uint32;
};
type UnionSize12Align4 = strict union {
1: unused1 uint8;
2: unused2 uint8;
3: unused3 uint8;
4: variant array<uint8, 6>;
};
type StructSize16Align8 = struct {
f1 uint64;
f2 uint64;
};
type UnionSize24Align8 = strict union {
1: unused1 uint8;
2: unused2 uint8;
3: unused3 uint8;
4: variant StructSize16Align8;
};
type Sandwich1 = struct {
before uint32;
the_union UnionSize8Align4;
after uint32;
};
type Sandwich1Message = struct {
header TransactionHeader;
body Sandwich1;
};
type Sandwich1WithOptUnion = struct {
before uint32;
opt_union UnionSize8Align4:optional;
after uint32;
};
type Sandwich2 = struct {
before uint32;
the_union UnionSize12Align4;
after uint32;
};
type Sandwich3 = struct {
before uint32;
the_union UnionSize24Align8;
after uint32;
};
type UnionSize36Align4 = strict union {
1: unused1 uint8;
2: unused2 uint8;
3: unused3 uint8;
4: variant array<uint8, 32>;
};
type Sandwich4 = struct {
before uint32;
the_union UnionSize36Align4;
after uint32;
};
type Sandwich4Message = struct {
header TransactionHeader;
body Sandwich4;
};
type UnionOfUnion = strict union {
1: unused1 uint8;
2: size8align4 UnionSize8Align4; // used in Sandwich5Case1, Sandwich8Case1
3: size12align4 UnionSize12Align4;
4: unused2 uint8;
5: size24align8 UnionSize24Align8; // used in Sandwich5Case2
};
type Sandwich5 = struct {
before uint32;
union_of_union UnionOfUnion;
after uint32;
};
type Sandwich5Message = struct {
header TransactionHeader;
body Sandwich5;
};
type StructSize3Align1 = struct {
three_bytes array<uint8, 3>;
};
type StructSize3Align2 = struct {
f1 uint16;
f2 uint8;
};
type UnionWithVector = strict resource union {
1: unused uint8;
2: vector_of_uint8 vector<uint8>;
3: s string;
4: vector_s3_a1 vector<StructSize3Align1>;
5: vector_s3_a2 vector<StructSize3Align2>;
6: handles vector<zx.Handle>;
7: array_s3_a1 array<StructSize3Align1, 2>;
8: array_s3_a2 array<StructSize3Align2, 2>;
9: vector_union vector<UnionSize8Align4>;
};
type Sandwich6 = resource struct {
before uint32;
the_union UnionWithVector;
after uint32;
};
type Sandwich7 = struct {
before uint32;
opt_sandwich1 box<Sandwich1>;
after uint32;
};
type Sandwich7Message = struct {
header TransactionHeader;
body Sandwich7;
};
// Same as Sandwich5 except `before` is uint64 (so no padding before the union).
type Sandwich8 = struct {
before uint64;
union_of_union UnionOfUnion;
after uint32;
};
type Regression1 = struct {
f1 uint8;
f2 uint32;
f3 uint8;
f4 uint16;
f5 uint64;
f6 uint8;
};
type Regression2 = struct {
head Regression1;
f7 uint8;
};
type Regression3 = struct {
opt_value box<Regression2>;
};
type TableNoFields = table {};
type StructTableNoFields = struct {
t TableNoFields;
};
type TableStructWithReservedSandwich = table {
2: s1 StructSize3Align1;
3: s2 StructSize3Align1;
};
type TableStructWithReservedSandwichStruct = struct {
table TableStructWithReservedSandwich;
};
type TableStructWithUint32Sandwich = table {
1: i uint32;
2: s1 StructSize3Align1;
3: s2 StructSize3Align1;
4: i2 uint32;
};
type TableStructWithUint32SandwichStruct = struct {
table TableStructWithUint32Sandwich;
};
type TableUnionWithVectorReservedSandwich = resource table {
2: uv UnionWithVector;
};
type TableUnionWithVectorReservedSandwichStruct = resource struct {
table TableUnionWithVectorReservedSandwich;
};
type TableUnionWithVectorStructSandwich = resource table {
1: s1 StructSize3Align1;
2: uv UnionWithVector;
3: s2 StructSize3Align1;
};
type TableUnionWithVectorStructSandwichStruct = resource struct {
table TableUnionWithVectorStructSandwich;
};
type XUnionWithStruct = flexible union {
1: s StructSize3Align1;
};
type XUnionWithStructStruct = struct {
xu XUnionWithStruct;
};
type XUnionWithXUnion = flexible union {
1: xu XUnionWithStruct;
};
type XUnionWithXUnionStruct = struct {
xu XUnionWithXUnion;
};
type XUnionWithUnions = flexible union {
1: u1 UnionSize8Align4;
2: u2 UnionSize12Align4;
};
type Size5Alignment1 = struct {
data array<uint8, 5>;
};
type Size5Alignment4 = struct {
four uint32;
one uint8;
};
type Size5Alignment1Vector = struct {
v vector<Size5Alignment1>;
};
type Size5Alignment4Vector = struct {
v vector<Size5Alignment4>;
};
type Size5Alignment1Array = struct {
a array<Size5Alignment1, 3>;
};
type Size5Alignment4Array = struct {
a array<Size5Alignment4, 3>;
};
type StringUnion = strict union {
1: unused uint8;
2: s string;
3: u8 uint8;
};
type ArrayStruct = struct {
unions array<StringUnion, 3>;
optional_unions array<StringUnion:optional, 3>;
};
type TransformerEmptyStruct = struct {};
type EmptyStructUnion = strict union {
1: unused uint8; // force the union tag to be non-zero
2: es TransformerEmptyStruct;
};
type EmptyStructUnionStruct = struct {
u EmptyStructUnion;
};
type Size8Align8 = struct {
data uint64;
};
type NoCodingTablesStressor = struct {
f1 uint64;
f2 uint64;
u1 UnionSize36Align4;
f3 uint64;
f4 uint64;
u2 UnionSize36Align4;
f5 uint64;
f6 uint64;
u3 UnionSize36Align4;
f7 uint64;
p1 box<Size8Align8>;
f8 uint64;
p2 box<Size8Align8>;
f9 uint64;
};
type OutOfLineSandwich1 = struct {
before string;
v vector<Sandwich1>:1;
after string;
};
type OutOfLineSandwich1WithOptUnion = struct {
before string;
v vector<Sandwich1WithOptUnion>:1;
after string;
};
// Regression1, but has at least one non primitive field
type Regression4 = struct {
f1 uint8;
f2 uint32;
s1 StructSize3Align1;
f3 uint8;
f4 uint16;
f5 uint64;
f6 uint8;
};
type EnumUint32 = strict enum : uint32 {
MEMBER = 0x3231302F;
};
type EnumUint8 = strict enum : uint8 {
MEMBER = 0x08;
};
// Regression1, but with enums.
type Regression5 = struct {
f1 uint8;
f2 EnumUint32;
f3 EnumUint8;
f4 uint16;
f5 uint64;
f6 uint8;
};
type BitsUint32 = strict bits : uint32 {
MEMBER_LOW_1 = 0x00000001;
MEMBER_LOW_2 = 0x00000002;
MEMBER_HIG_1 = 0x10000000;
MEMBER_HIG_2 = 0x20000000;
};
type BitsUint8 = strict bits : uint8 {
MEMBER = 0x08;
};
// Regression1, but with bits.
type Regression6 = struct {
f1 uint8;
f2 BitsUint32;
f3 BitsUint8;
f4 uint16;
f5 uint64;
f6 uint8;
};
type UnionAtTheBottom = strict union {
1: unused1 uint8;
2: unused2 uint8;
3: tiny uint8;
};
type XUnionOfUnion = flexible union {
1: variant UnionAtTheBottom; // 0x5F67105B
};
type TableOfXUnionThenUnion = table {
2: member XUnionOfUnion;
};
type XUnionOfTableThenXUnionThenUnion = flexible union {
1: variant TableOfXUnionThenUnion; //0x5B15934E
};
type UnionOfXUnionThenTableThenXUnionThenUnion = strict union {
1: unused1 uint8; // avoid tag 0
3: variant XUnionOfTableThenXUnionThenUnion; // tag = 1
};
type TableOfUnionThenXUnionThenTableThenXUnionThenUnion = table {
3: member UnionOfXUnionThenTableThenXUnionThenUnion;
};
type Regression7TableUnionXUnion = struct {
value TableOfUnionThenXUnionThenTableThenXUnionThenUnion;
};
type Regression8OptUnionSize12Align4 = struct {
opt_union1 UnionSize12Align4:optional;
opt_union2 UnionSize12Align4:optional;
opt_union3 UnionSize12Align4:optional;
};
type Regression8VectorOfOptUnionSize12Align4 = struct {
value vector<UnionSize12Align4:optional>;
};
type TableWithUnionSize12Align4 = table {
1: before uint8;
3: member UnionSize12Align4;
5: after uint8;
};
type Regression8TableWithUnionSize12Align4 = struct {
value TableWithUnionSize12Align4;
};
type StringBoolUnion = strict union {
1: s string;
2: b bool;
};
type StringUnionStruct = struct {
u StringBoolUnion;
nullable_u StringBoolUnion:optional;
};
type StringUnionStructWrapper = struct {
sus StringUnionStruct;
};
type StringUnionStructWrapperResponse = struct {
header TransactionHeader;
body StringUnionStructWrapper;
};
type Regression9Value = struct {
u StringBoolUnion;
nullable_u StringBoolUnion:optional;
};
// Simulate an error result type.
type Regression9Result = strict union {
1: ok Regression9Value;
2: error uint32;
};
type Regression9Message = struct {
header TransactionHeader;
body Regression9Result;
};
// At first, only one member.
type Regression10TableV1 = table {
1: member1 uint64;
};
// Then, we add a second member in 5th position.
type Regression10TableV2 = table {
1: member1 uint64;
5: member2 uint64;
};
// Third, we add a third member in 6th position.
type Regression10TableV3 = table {
1: x int64;
5: y int64;
6: z int64;
};
type Regression10V1 = struct {
table Regression10TableV1;
};
type Regression10V2 = struct {
table Regression10TableV2;
};
type Regression10V3 = struct {
table Regression10TableV3;
};
type UnionWithRegression10Table = strict union {
1: unused uint8; // avoid tag 0
3: at_v2 Regression10TableV2; // but consider the evolution v1, v2, v3, ...
};
type Regression11 = struct {
table_of_table UnionWithRegression10Table;
};
type Sandwich4Align8 = struct {
sandwich4 Sandwich4;
alignment8_enforcement uint64;
};
type Sandwich4Align8WithPointer = struct {
sandwich4 Sandwich4;
alignment8_enforcement box<Size8Align8>;
};
// This is designed to test out-of-line handling.
type UnionWithVectorOfVectors = strict union {
1: v vector<vector<box<StructSize3Align1>>>;
};
type Sandwich9 = struct {
before uint16;
the_union UnionWithVectorOfVectors;
after uint16;
};
type TransformerSimpleTable = table {
1: value uint32;
};
type SimpleTableArrayStruct = struct {
the_array array<TransformerSimpleTable, 2>;
};
type StringUnionVector = struct {
the_vector vector<StringUnion:optional>:3;
};
type LaunchInfo = resource struct {
url string:200;
arguments vector<string>:optional;
out box<TransformerEmptyStruct>;
err box<TransformerEmptyStruct>;
directory_request zx.Handle:<CHANNEL, optional>;
flat_namespace box<TransformerEmptyStruct>;
additional_services box<TransformerEmptyStruct>;
};
type CreateComponentRequest = resource struct {
launch_info LaunchInfo;
controller server_end:<ComponentController, optional>;
};
closed protocol ComponentController {};
type CompatUnion = strict union {
1: s string;
2: b bool;
};
type CompatTableString = table {
1: s string;
};
type UnionOfTable = strict union {
// Test out-of-line sizing via a table contained inside a union.
1: t SimpleTable;
};
type StructOfUnionOfTable = struct {
u UnionOfTable;
};
type CompatXUnion = flexible union {
1: s string; // hashed ordinal 0x5af8efa8
2: b bool;
};
type CompatTableValue = table {
1: union_member CompatUnion;
2: array_member array<uint32, 3>;
3: table_member CompatTableString;
4: xunion_member CompatXUnion;
};
type CompatTable = struct {
value CompatTableValue;
empty string;
};
type MixedFieldsBody = struct {
before uint32;
first_union UnionSize8Align4;
middle_start uint16;
middle_end uint64;
second_union UnionSize8Align4;
after uint32;
};
type MixedFieldsMessage = struct {
header TransactionHeader;
body MixedFieldsBody;
};
type TableWithXUnion = table {
1: member CompatXUnion;
};
type StructOfTableWithXUnion = struct {
value TableWithXUnion;
};
type TableWithReservedFieldThenUnion = table {
2: uv UnionSize8Align4;
};
type TableWithReservedFieldThenUnionStruct = struct {
t TableWithReservedFieldThenUnion;
};