| // 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. |
| |
| success("UnionWithBoundString") { |
| value = UnionWithBoundStringStruct { |
| v: UnionWithBoundString { |
| boundFiveStr: "abcd", |
| }, |
| }, |
| bytes = { |
| v1 = [ |
| // primary object |
| num(1):8, // ordinal |
| num(24):4, num(0):4, repeat(0xff):8, // envelope |
| |
| // secondary object 1: union |
| num(4):8, repeat(0xff):8, // boundFiveStr size, present |
| |
| // secondary object 2: boundFiveStr |
| 'a', 'b', 'c', 'd', padding:4, |
| ], |
| }, |
| } |
| |
| encode_failure("UnionWithBoundString_ExceedsBounds") { |
| // TODO(fxbug.dev/37304) Enforce size bounds in rust |
| bindings_denylist = [rust, dart], |
| value = UnionWithBoundStringStruct { |
| v: UnionWithBoundString { |
| boundFiveStr: "abcdef", |
| }, |
| }, |
| err = STRING_TOO_LONG, |
| } |
| |
| success("UnionMigration_SingleVariant") { |
| value = SingleVariantUnionStruct { |
| u: SingleVariantUnion { |
| x: 42, |
| }, |
| }, |
| bytes = { |
| v1 = [ |
| // primary object |
| num(1):8, // ordinal |
| num(8):4, num(0):4, repeat(0xff):8, // envelope |
| |
| // secondary object 1: x |
| num(42):4, padding:4, |
| ], |
| }, |
| } |
| |
| success("ReverseOrdinalUnion") { |
| value = ReverseOrdinalUnionStruct { |
| u: ReverseOrdinalUnion { |
| x: 42, |
| }, |
| }, |
| bytes = { |
| v1 = [ |
| // primary object |
| num(4):8, // ordinal |
| num(8):4, num(0):4, repeat(0xff):8, // envelope |
| |
| // secondary object 1: x |
| num(42):8, |
| ], |
| }, |
| } |
| |
| // Regression test for fxbug.dev/72895. |
| decode_failure("UnionWithInvalidPresenceIndicator") { |
| // TODO(fxbug.dev/72895): Fix in C/C++ bindings. |
| bindings_denylist = [c, hlcpp, llcpp], |
| type = XUnionWithStructStruct, |
| bytes = { |
| v1 = [ |
| 0xd2, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ordinal |
| 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 bytes, 0 handles |
| 0xd8, 0x09, 0x00, 0x0d, 0xc4, 0x00, 0x00, 0x00, // invalid pointer |
| 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, |
| 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, |
| 0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, |
| ], |
| }, |
| err = INVALID_PRESENCE_INDICATOR, |
| } |
| |
| // ======================== UNKNOWN VARIANT TESTS ========================== |
| |
| success("FlexibleUnionUnknownValue") { |
| // llcpp is tested by hand since it cannot construct unknown unions (and |
| // they do not store bytes & handles), see fxr/423117 |
| bindings_denylist = [llcpp], |
| value = TestFlexibleXUnionInStruct { |
| xu: SampleXUnion{ |
| 1234: { |
| // padding must be included in the raw bytes |
| bytes = [repeat(0xab):20, padding:4], |
| }, |
| }, |
| }, |
| bytes = { |
| v1 = [ |
| num(1234):8, // unknown ordinal |
| num(24):4, num(0):4, repeat(0xff):8, // envelope |
| repeat(0xab):20, padding:4, // unknown bytes |
| ], |
| }, |
| } |
| |
| success("FlexibleResourceUnionUnknownValue") { |
| // llcpp is tested by hand since it cannot construct unknown unions (and |
| // they do not store bytes & handles), see fxr/423117 |
| bindings_denylist = [llcpp], |
| value = TestFlexibleResourceXUnionInStruct { |
| xu: SampleResourceXUnion{ |
| 1234: { |
| // padding must be included in the raw bytes |
| bytes = [repeat(0xab):20, padding:4], |
| }, |
| }, |
| }, |
| bytes = { |
| v1 = [ |
| num(1234):8, // unknown ordinal |
| num(24):4, num(0):4, repeat(0xff):8, // envelope |
| repeat(0xab):20, padding:4, // unknown bytes |
| ], |
| }, |
| } |
| |
| success("FlexibleResourceUnionUnknownValueWithHandles") { |
| // llcpp is tested by hand since it cannot construct unknown unions (and |
| // they do not store bytes & handles), see fxr/423117 |
| bindings_denylist = [llcpp], |
| handle_defs = { |
| #0 = event(), |
| #1 = event(), |
| #2 = channel(), |
| #3 = channel(), |
| }, |
| value = TestFlexibleResourceXUnionInStruct { |
| xu: SampleResourceXUnion { |
| 1234: { |
| // padding must be included in the raw bytes |
| bytes = [repeat(0xab):20, padding:4], |
| handles = [#0, #1, #2, #3], |
| }, |
| }, |
| }, |
| bytes = { |
| v1 = [ |
| num(1234):8, // unknown ordinal |
| num(24):4, num(4):4, repeat(0xff):8, // envelope |
| repeat(0xab):20, padding:4, // unknown bytes |
| ], |
| }, |
| handles = { |
| v1 = [ |
| #0, #1, #2, #3, |
| ] |
| } |
| } |
| |
| decode_failure("StrictUnionUnknownValue") { |
| type = TestStrictXUnionInStruct, |
| bytes = { |
| v1 = [ |
| num(1234):8, // unknown ordinal |
| num(24):4, num(0):4, repeat(0xff):8, // envelope |
| repeat(0xab):20, padding:4, // unknown bytes |
| ], |
| }, |
| err = STRICT_UNION_UNKNOWN_FIELD, |
| } |
| |
| decode_failure("StrictUnionUnknownValueWithHandles") { |
| handle_defs = { |
| #0 = event(), |
| #1 = event(), |
| #2 = channel(), |
| #3 = channel(), |
| }, |
| type = TestStrictXUnionInStruct, |
| bytes = { |
| v1 = [ |
| num(1234):8, // unknown ordinal |
| num(24):4, num(4):4, repeat(0xff):8, // envelope |
| repeat(0xab):20, padding:4, // unknown bytes |
| ], |
| }, |
| handles = { |
| v1 = [ |
| #0, #1, #2, #3, |
| ] |
| }, |
| err = STRICT_UNION_UNKNOWN_FIELD, |
| } |
| |
| decode_failure("FlexibleUnionUnknownValueWithHandles") { |
| // C & LLCPP does not store handles, so does not fail when decoding unknown |
| // handles for a value type. |
| bindings_denylist = [c, llcpp], |
| handle_defs = { |
| #0 = event(), |
| #1 = event(), |
| #2 = channel(), |
| #3 = channel(), |
| }, |
| type = TestFlexibleXUnionInStruct, |
| bytes = { |
| v1 = [ |
| num(1234):8, // unknown ordinal |
| num(24):4, num(4):4, repeat(0xff):8, // envelope |
| repeat(0xab):20, padding:4, // unknown bytes |
| ], |
| }, |
| handles = { |
| v1 = [ |
| #0, #1, #2, #3, |
| ] |
| }, |
| err = NON_RESOURCE_UNKNOWN_HANDLES, |
| } |
| |
| encode_failure("StrictUnionUnknownValue") { |
| // Currently no bindings allow constructing a strict union with an unknown variant |
| bindings_allowlist = [], |
| value = TestStrictXUnionInStruct { |
| xu: SampleStrictXUnion{ |
| 1234: { |
| // padding must be included in the raw bytes |
| bytes = [repeat(0xab):20, padding:4], |
| } |
| } |
| }, |
| err = STRICT_UNION_UNKNOWN_FIELD, |
| } |