blob: 675e0781935344d70be2dffda54700d9794e262a [file] [log] [blame]
// Copyright 2020 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("SingleHandle") {
handle_defs = {
#0 = event(),
},
value = SingleHandle{
h: #0,
},
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
}
encode_failure("AbsentNonOptionalHandle") {
value = SingleHandle{
h: null,
},
err = NON_NULLABLE_TYPE_WITH_NULL_VALUE,
}
decode_failure("AbsentNonOptionalHandle") {
bytes = {
v2 = [
repeat(0x00):4, padding:4,
],
},
type = SingleHandle,
err = NON_NULLABLE_TYPE_WITH_NULL_VALUE,
}
success("SingleOptionalHandlePresent") {
handle_defs = {
#0 = event(),
},
value = SingleOptionalHandle{
h: #0,
},
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
}
success("SingleOptionalHandleAbsent") {
value = SingleOptionalHandle{},
bytes = {
v2 = [
repeat(0x00):4, padding:4,
],
},
}
decode_failure("SingleHandleMissingAndInvalidPresenceIndicator") {
bindings_denylist = [dart],
bytes = {
v2 = [
repeat(0xab):4, padding:4,
],
},
type = SingleOptionalHandle,
err = INVALID_HANDLE_PRESENCE_INDICATOR,
}
decode_failure("SingleHandleInvalidPresenceIndicator") {
bindings_denylist = [dart],
handle_defs = {
#0 = event(),
},
bytes = {
v2 = [
repeat(0xab):4, padding:4,
],
},
handles = {v2 = [#0]},
type = SingleOptionalHandle,
err = INVALID_HANDLE_PRESENCE_INDICATOR,
}
success("ArrayOfHandles") {
handle_defs = {
#0 = event(),
#1 = event(),
#2 = event(),
},
value = ArrayOfHandles{
a: [#2, #0, #1],
},
bytes = {
v2 = [
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#2, #0, #1,
],
},
}
success("ArrayOfOptionalHandles") {
handle_defs = {
#0 = event(),
},
value = ArrayOfOptionalHandles{
a: [null, #0, null],
},
bytes = {
v2 = [
repeat(0x00):4, repeat(0xff):4, repeat(0x00):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
}
success("VectorOfHandles") {
handle_defs = {
#0 = event(),
#1 = event(),
#2 = event(),
},
value = VectorOfHandles{
v: [#2, #0, #1],
},
bytes = {
v2 = [
num(3):8, repeat(0xff):8,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#2, #0, #1,
],
},
}
success("BoxOfSingleHandlePresentBox") {
handle_defs = {
#0 = event(),
},
value = BoxOfSingleHandle{
b: SingleHandle{
h: #0,
},
},
bytes = {
v2 = [
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
}
success("BoxOfSingleHandleAbsentBox") {
value = BoxOfSingleHandle{},
bytes = {
v2 = [
repeat(0x00):8,
],
},
}
success("BoxOfSingleOptionalHandlePresentBoxPresentHandle") {
handle_defs = {
#0 = event(),
},
value = BoxOfSingleOptionalHandle{
b: SingleOptionalHandle{
h: #0,
},
},
bytes = {
v2 = [
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
}
success("BoxOfSingleOptionalHandlePresentBoxAbsentHandle") {
value = BoxOfSingleOptionalHandle{
b: SingleOptionalHandle{},
},
bytes = {
v2 = [
repeat(0xff):8,
repeat(0x00):4, padding:4,
],
},
}
success("BoxOfSingleOptionalHandleAbsentBox") {
value = BoxOfSingleOptionalHandle{},
bytes = {
v2 = [
repeat(0x00):8,
],
},
}
success("StructOfOptionalUnionOfHandlePresent") {
handle_defs = {
#0 = event(),
},
value = StructOfOptionalUnionOfHandle{
u: UnionOfHandle{
h: #0,
},
},
bytes = {
v2 = [
num(1):8,
repeat(0xff):4, num(1):2, num(1):2, // inlined envelope
],
},
handles = {
v2 = [
#0,
],
},
}
success("StructOfOptionalUnionOfHandleAbsent") {
value = StructOfOptionalUnionOfHandle{},
bytes = {
v2 = [
num(0):8, // zero ordinal
num(0):4, num(0):2, num(0):2, // empty envelope
],
},
}
// When a failure is encountered, bindings must ensure that handles located
// both before and after the failure are closed. A third handle is included
// in the test to ensure that there are no double-closes in encoders that
// do not exit early upon failure.
encode_failure("HandlesBeforeAndAfterFailureAreClosed") {
// TODO(96626): Should close handles in some constraint violation cases.
bindings_denylist = [hlcpp, go, dart],
handle_defs = {
#0 = event(),
#1 = event(),
#2 = event(),
},
value = AlternatingHandlesAndFailures{
h1: #0,
failure_trigger1: "abc",
h2: #1,
failure_trigger2: "abc",
h3: #2,
},
err = STRING_TOO_LONG,
}
// When a failure is encountered, bindings must ensure that handles located
// both before and after the failure are closed. A third handle is included
// in the test to ensure that there are no double-closes in encoders that
// do not exit early upon failure.
decode_failure("HandlesBeforeAndAfterFailureAreClosed") {
// TODO(https://fxbug.dev/42051700) In rust, this is failing for an unknown reason.
// TODO(https://fxbug.dev/42051715) In dart, this is failing for an unknown reason.
bindings_denylist = [rust, dart],
handle_defs = {
#0 = event(),
#1 = event(),
#2 = event(),
},
type = AlternatingHandlesAndFailures,
bytes = {
v2 = [
repeat(0xff):4, padding:4, // h1
num(3):8, // failure_trigger1
repeat(0xff):8,
repeat(0xff):4, padding:4, // h2
num(3):8, // failure_trigger2
repeat(0xff):8,
repeat(0xff):4, padding:4, // h3
0x61, 0x62, 0x63, padding:5,
0x61, 0x62, 0x63, padding:5,
],
},
handles = {
v2 = [
#0, #1, #2,
],
},
err = STRING_TOO_LONG,
}
// Handles inside the vector should be closed even if the vector itself
// has a constraint error.
encode_failure("TooManyHandlesInVector") {
// TODO(96626): Should close handles in some constraint violation cases.
bindings_denylist = [llcpp, hlcpp, go, dart],
handle_defs = {
#0 = event(),
#1 = event(),
#2 = event(),
},
value = VectorOfUpTo2Handles{
v: [#2, #0, #1],
},
err = COUNT_EXCEEDS_LIMIT,
}
// Handle members coming after the string should be closed even if the string
// has a constraint error.
encode_failure("UnrelatedConstraintErrorBeforeHandle") {
// TODO(96626): Should close handles in some constraint violation cases.
bindings_denylist = [hlcpp, go, dart],
handle_defs = {
#0 = event(),
},
value = ShortStringThenHandle{
s: "long",
h: #0,
},
err = STRING_TOO_LONG,
}
success("VectorOfOptionalHandles") {
handle_defs = {
#0 = event(),
},
value = VectorOfOptionalHandles{
v: [null, #0, null],
},
bytes = {
v2 = [
num(3):8, repeat(0xff):8,
repeat(0x00):4, repeat(0xff):4, repeat(0x00):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
}
success("MultipleHandleSubtypes") {
handle_defs = {
#0 = channel(),
#1 = event(),
#2 = channel(),
},
value = MultipleHandleSubtypes{
untyped: #0,
event: #1,
channel: #2,
},
bytes = {
v2 = [
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0, #1, #2,
],
},
}
decode_failure("TooManyHandles") {
bindings_denylist = [rust],
handle_defs = {
#0 = event(),
#1 = event(),
},
type = SingleHandle,
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0, #1,
],
},
err = TOO_MANY_HANDLES_IN_MESSAGE,
}
decode_failure("TooFewHandles") {
type = SingleHandle,
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
err = TOO_FEW_HANDLES,
}
// Currently channels max out at 64-handles.
success("ChannelMaxHandles") {
handle_defs = {
#0 = event(), #1 = event(), #2 = event(), #3 = event(),
#4 = event(), #5 = event(), #6 = event(), #7 = event(),
#8 = event(), #9 = event(), #10 = event(), #11 = event(),
#12 = event(), #13 = event(), #14 = event(), #15 = event(),
#16 = event(), #17 = event(), #18 = event(), #19 = event(),
#20 = event(), #21 = event(), #22 = event(), #23 = event(),
#24 = event(), #25 = event(), #26 = event(), #27 = event(),
#28 = event(), #29 = event(), #30 = event(), #31 = event(),
#32 = event(), #33 = event(), #34 = event(), #35 = event(),
#36 = event(), #37 = event(), #38 = event(), #39 = event(),
#40 = event(), #41 = event(), #42 = event(), #43 = event(),
#44 = event(), #45 = event(), #46 = event(), #47 = event(),
#48 = event(), #49 = event(), #50 = event(), #51 = event(),
#52 = event(), #53 = event(), #54 = event(), #55 = event(),
#56 = event(), #57 = event(), #58 = event(), #59 = event(),
#60 = event(), #61 = event(), #62 = event(), #63 = event(),
},
value = VectorOfHandles{
v: [
#0, #1, #2, #3, #4, #5, #6, #7,
#8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23,
#24, #25, #26, #27, #28, #29, #30, #31,
#32, #33, #34, #35, #36, #37, #38, #39,
#40, #41, #42, #43, #44, #45, #46, #47,
#48, #49, #50, #51, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
],
},
bytes = {
v2 = [
num(64):8, repeat(0xff):8,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
repeat(0xff):4, repeat(0xff):4, repeat(0xff):4, repeat(0xff):4,
],
},
handles = {
v2 = [
#0, #1, #2, #3, #4, #5, #6, #7,
#8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23,
#24, #25, #26, #27, #28, #29, #30, #31,
#32, #33, #34, #35, #36, #37, #38, #39,
#40, #41, #42, #43, #44, #45, #46, #47,
#48, #49, #50, #51, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
],
},
}
// There should be support for at least 64 handles in unknown fields.
decode_success("ChannelMaxUnknownHandlesDropped") {
// TODO(https://fxbug.dev/42166276): Drop unknown data in all bindings.
bindings_denylist = [dart, go],
handle_defs = {
#0 = event(), #1 = event(), #2 = event(), #3 = event(),
#4 = event(), #5 = event(), #6 = event(), #7 = event(),
#8 = event(), #9 = event(), #10 = event(), #11 = event(),
#12 = event(), #13 = event(), #14 = event(), #15 = event(),
#16 = event(), #17 = event(), #18 = event(), #19 = event(),
#20 = event(), #21 = event(), #22 = event(), #23 = event(),
#24 = event(), #25 = event(), #26 = event(), #27 = event(),
#28 = event(), #29 = event(), #30 = event(), #31 = event(),
#32 = event(), #33 = event(), #34 = event(), #35 = event(),
#36 = event(), #37 = event(), #38 = event(), #39 = event(),
#40 = event(), #41 = event(), #42 = event(), #43 = event(),
#44 = event(), #45 = event(), #46 = event(), #47 = event(),
#48 = event(), #49 = event(), #50 = event(), #51 = event(),
#52 = event(), #53 = event(), #54 = event(), #55 = event(),
#56 = event(), #57 = event(), #58 = event(), #59 = event(),
#60 = event(), #61 = event(), #62 = event(), #63 = event(),
},
value = EmptyResourceTableStruct{
table: EmptyResourceTable{},
},
bytes = {
v2 = [
num(1):8, repeat(0xff):8, // Table header
num(256):4, num(64):2, num(0):2, // Reserved envelope
repeat(0xff):256, // Handle values.
],
},
handles = {
v2 = [
#0, #1, #2, #3, #4, #5, #6, #7,
#8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23,
#24, #25, #26, #27, #28, #29, #30, #31,
#32, #33, #34, #35, #36, #37, #38, #39,
#40, #41, #42, #43, #44, #45, #46, #47,
#48, #49, #50, #51, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
],
},
}
encode_success("ChannelMaxUnknownHandlesDropped") {
// TODO(https://fxbug.dev/42166276): Drop unknown data in all bindings.
// TODO(https://fxbug.dev/42067496): Implement the decode function in all backends.
bindings_allowlist = [rust],
handle_defs = {
#0 = event(), #1 = event(), #2 = event(), #3 = event(),
#4 = event(), #5 = event(), #6 = event(), #7 = event(),
#8 = event(), #9 = event(), #10 = event(), #11 = event(),
#12 = event(), #13 = event(), #14 = event(), #15 = event(),
#16 = event(), #17 = event(), #18 = event(), #19 = event(),
#20 = event(), #21 = event(), #22 = event(), #23 = event(),
#24 = event(), #25 = event(), #26 = event(), #27 = event(),
#28 = event(), #29 = event(), #30 = event(), #31 = event(),
#32 = event(), #33 = event(), #34 = event(), #35 = event(),
#36 = event(), #37 = event(), #38 = event(), #39 = event(),
#40 = event(), #41 = event(), #42 = event(), #43 = event(),
#44 = event(), #45 = event(), #46 = event(), #47 = event(),
#48 = event(), #49 = event(), #50 = event(), #51 = event(),
#52 = event(), #53 = event(), #54 = event(), #55 = event(),
#56 = event(), #57 = event(), #58 = event(), #59 = event(),
#60 = event(), #61 = event(), #62 = event(), #63 = event(),
},
value = EmptyResourceTableStruct{
table: decode({
type = EmptyResourceTable,
bytes = {
v2 = [
num(1):8, repeat(0xff):8, // Table header
num(256):4, num(64):2, num(0):2, // Reserved envelope
repeat(0xff):256, // Handle values.
],
},
handles = {
v2 = [
#0, #1, #2, #3, #4, #5, #6, #7,
#8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23,
#24, #25, #26, #27, #28, #29, #30, #31,
#32, #33, #34, #35, #36, #37, #38, #39,
#40, #41, #42, #43, #44, #45, #46, #47,
#48, #49, #50, #51, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
],
},
}),
},
bytes = {
v2 = [
num(0):8, repeat(0xff):8, // Table header
],
},
}
// this test is the same as ChannelMaxUnknownHandlesDropped, but expects
// that the unknown data is stored in the value instead of discarded
success("ChannelMaxUnknownHandlesStored") {
// TODO(https://fxbug.dev/42166276): Remove in favor of ChannelMaxUnknownHandlesDropped.
bindings_allowlist = [dart, go],
handle_defs = {
#0 = event(), #1 = event(), #2 = event(), #3 = event(),
#4 = event(), #5 = event(), #6 = event(), #7 = event(),
#8 = event(), #9 = event(), #10 = event(), #11 = event(),
#12 = event(), #13 = event(), #14 = event(), #15 = event(),
#16 = event(), #17 = event(), #18 = event(), #19 = event(),
#20 = event(), #21 = event(), #22 = event(), #23 = event(),
#24 = event(), #25 = event(), #26 = event(), #27 = event(),
#28 = event(), #29 = event(), #30 = event(), #31 = event(),
#32 = event(), #33 = event(), #34 = event(), #35 = event(),
#36 = event(), #37 = event(), #38 = event(), #39 = event(),
#40 = event(), #41 = event(), #42 = event(), #43 = event(),
#44 = event(), #45 = event(), #46 = event(), #47 = event(),
#48 = event(), #49 = event(), #50 = event(), #51 = event(),
#52 = event(), #53 = event(), #54 = event(), #55 = event(),
#56 = event(), #57 = event(), #58 = event(), #59 = event(),
#60 = event(), #61 = event(), #62 = event(), #63 = event(),
},
value = EmptyResourceTableStruct{
table: EmptyResourceTable{
1: {
// 256 bytes for 64 handles' 4-byte presence markers.
bytes = [
repeat(0xff):256,
],
handles = [
#0, #1, #2, #3, #4, #5, #6, #7,
#8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23,
#24, #25, #26, #27, #28, #29, #30, #31,
#32, #33, #34, #35, #36, #37, #38, #39,
#40, #41, #42, #43, #44, #45, #46, #47,
#48, #49, #50, #51, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
],
},
},
},
bytes = {
v2 = [
num(1):8, repeat(0xff):8, // Table header
num(256):4, num(64):2, num(0):2, // Reserved envelope
repeat(0xff):256, // Handle values.
],
},
handles = {
v2 = [
#0, #1, #2, #3, #4, #5, #6, #7,
#8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23,
#24, #25, #26, #27, #28, #29, #30, #31,
#32, #33, #34, #35, #36, #37, #38, #39,
#40, #41, #42, #43, #44, #45, #46, #47,
#48, #49, #50, #51, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
],
},
}
encode_success("EncodeHandleTypeAndRightsComeFromFIDL") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = EventWithDefaultRights{
h: #0,
},
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: event_default},
],
},
}
decode_success("DecodeHandleHasExactTypeAndRights") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = event(rights: event_default),
},
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
value = EventWithDefaultRights{
h: restrict(#0, type: event, rights: event_default),
},
}
decode_failure("DecodeHandleHasWrongType") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(),
},
type = EventWithDefaultRights,
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = INCORRECT_HANDLE_TYPE,
}
decode_success("DecodeHandleHasExtraRights") {
// Rust does not support GIDL tests involving reducing rights.
bindings_allowlist = [llcpp, hlcpp, cpp, go],
handle_defs = {
#0 = event(rights: event_default),
},
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
value = EventWithReducedRights{
h: restrict(#0, type: event, rights: basic),
},
}
decode_failure("DecodeHandleHasTooFewRights") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = event(rights: basic),
},
type = EventWithDefaultRights,
bytes = {
v2 = [
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = MISSING_REQUIRED_HANDLE_RIGHTS,
}
// Vector and arrays can't hold handle type information in some bindings.
// Test this with structs, which may have different behavior than other types.
encode_success("EncodeArrayOfVectorOfEventInStruct") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = ArrayOfVectorOfEventInStructWithReducedRights{h: [[#0]]},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: basic},
],
},
}
// Vector and arrays can't hold handle type information in some bindings.
// Test this with structs, which may have different behavior than other types.
encode_success("EncodeVectorOfArrayOfEventInStruct") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = VectorOfArrayOfEventInStructWithReducedRights{h: [[#0]]},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: basic},
],
},
}
// Vector and arrays can't hold handle type information in some bindings.
// Test this with tables, which may have different behavior than other types.
encode_success("EncodeArrayOfVectorOfEventInTable") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = ArrayOfVectorOfEventInTableWithReducedRightsStruct{
t: ArrayOfVectorOfEventInTableWithReducedRights{
h: [[#0]],
},
},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: basic},
],
},
}
// Vector and arrays can't hold handle type information in some bindings.
// Test this with tables, which may have different behavior than other types.
encode_success("EncodeVectorOfArrayOfEventInTable") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = VectorOfArrayOfEventInTableWithReducedRightsStruct{
t: VectorOfArrayOfEventInTableWithReducedRights{
h: [[#0]],
},
},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: basic},
],
},
}
// Vector and arrays can't hold handle type information in some bindings.
// Test this with unions, which may have different behavior than other types.
encode_success("EncodeArrayOfVectorOfEventInUnion") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = ArrayOfVectorOfEventInUnionWithReducedRightsStruct{
u: ArrayOfVectorOfEventInUnionWithReducedRights{
h: [[#0]],
},
},
bytes = {
v2 = [
num(1):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: basic},
],
},
}
// Vector and arrays can't hold handle type information in some bindings.
// Test this with unions, which may have different behavior than other types.
encode_success("EncodeVectorOfArrayOfEventInUnion") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: channel_default),
},
value = VectorOfArrayOfEventInUnionWithReducedRightsStruct{
u: VectorOfArrayOfEventInUnionWithReducedRights{
h: [[#0]],
},
},
bytes = {
v2 = [
num(1):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handle_dispositions = {
v2 = [
{#0, type: event, rights: basic},
],
},
}
// Vector and arrays can't hold handle rights information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in an array of a vector in a struct use the correct
// rights by reducing the rights.
decode_success("DecodeArrayOfVectorOfEventInStructExtraRights") {
// Rust does not support GIDL tests involving reducing rights.
bindings_allowlist = [llcpp, hlcpp, cpp, go],
handle_defs = {
#0 = event(rights: event_default),
},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handles = {
v2 = [
#0,
],
},
value = ArrayOfVectorOfEventInStructWithReducedRights{
h: [[restrict(#0, type: event, rights: basic)]],
},
}
decode_failure("DecodeArrayOfVectorOfEventInStructHasTooFewRights") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = event(rights: basic),
},
type = ArrayOfVectorOfEventInStructWithDefaultRights,
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = MISSING_REQUIRED_HANDLE_RIGHTS,
}
// Vector and arrays can't hold handle type information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in an array of a vector in a struct have the type
// checked by failing when there is a type mismatch.
decode_failure("DecodeArrayOfVectorOfEventInStructType") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: transfer),
},
type = ArrayOfVectorOfEventInStructWithReducedRights,
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = INCORRECT_HANDLE_TYPE,
}
// Vector and arrays can't hold handle rights information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in a vector of an array in a struct use the correct
// rights by reducing the rights.
decode_success("DecodeVectorOfArrayOfEventInStructExtraRights") {
// Rust does not support GIDL tests involving reducing rights.
bindings_allowlist = [llcpp, hlcpp, cpp, go],
handle_defs = {
#0 = event(rights: event_default),
},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handles = {
v2 = [
#0,
],
},
value = VectorOfArrayOfEventInStructWithReducedRights{
h: [[restrict(#0, type: event, rights: basic)]],
},
}
decode_failure("DecodeVectorOfArrayOfEventInStructHasTooFewRights") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = event(rights: basic),
},
type = VectorOfArrayOfEventInStructWithDefaultRights,
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = MISSING_REQUIRED_HANDLE_RIGHTS,
}
// Vector and arrays can't hold handle type information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in a vector of an array in a struct have the type
// checked by failing when there is a type mismatch.
decode_failure("DecodeVectorOfArrayOfEventInStructType") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: transfer),
},
type = VectorOfArrayOfEventInStructWithReducedRights,
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
repeat(0xff):4,
padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = INCORRECT_HANDLE_TYPE,
}
// Vector and arrays can't hold handle rights information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in an array of a vector in a table use the correct
// rights by reducing the rights.
decode_success("DecodeArrayOfVectorOfEventInTableExtraRights") {
// Rust does not support GIDL tests involving reducing rights.
bindings_allowlist = [llcpp, hlcpp, cpp, go],
handle_defs = {
#0 = event(rights: event_default),
},
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
value = ArrayOfVectorOfEventInTableWithReducedRightsStruct{
t: ArrayOfVectorOfEventInTableWithReducedRights{
h: [[restrict(#0, type: event, rights: basic)]],
},
},
}
decode_failure("DecodeArrayOfVectorOfEventInTableHasTooFewRights") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = event(rights: basic),
},
type = ArrayOfVectorOfEventInTableWithDefaultRightsStruct,
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = MISSING_REQUIRED_HANDLE_RIGHTS,
}
// Vector and arrays can't hold handle type information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in an array of a vector in a table have the type
// checked by failing when there is a type mismatch.
decode_failure("DecodeArrayOfVectorOfEventInTableType") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: transfer),
},
type = ArrayOfVectorOfEventInTableWithReducedRightsStruct,
bytes = {
v2 = [
num(1):8,
repeat(0xff):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = INCORRECT_HANDLE_TYPE,
}
// Vector and arrays can't hold handle rights information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in an array of a vector in a union use the correct
// rights by reducing the rights.
decode_success("DecodeArrayOfVectorOfEventInUnionExtraRights") {
// Rust does not support GIDL tests involving reducing rights.
bindings_allowlist = [llcpp, hlcpp, cpp, go],
handle_defs = {
#0 = event(rights: event_default),
},
bytes = {
v2 = [
num(1):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
value = ArrayOfVectorOfEventInUnionWithReducedRightsStruct{
u: ArrayOfVectorOfEventInUnionWithReducedRights{
h: [[restrict(#0, type: event, rights: basic)]],
},
},
}
decode_failure("DecodeArrayOfVectorOfEventInUnionHasTooFewRights") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = event(rights: basic),
},
type = ArrayOfVectorOfEventInUnionWithDefaultRightsStruct,
bytes = {
v2 = [
num(1):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = MISSING_REQUIRED_HANDLE_RIGHTS,
}
// Vector and arrays can't hold handle type information in some bindings
// This behavior can also differ based on the type of the parent object holding
// the vector and arrays.
// Test whether handles in an array of a vector in a union have the type
// checked by failing when there is a type mismatch.
decode_failure("DecodeArrayOfVectorOfEventInUnionType") {
bindings_allowlist = [llcpp, hlcpp, cpp, go, rust, dart],
handle_defs = {
#0 = channel(rights: transfer),
},
type = ArrayOfVectorOfEventInUnionWithReducedRightsStruct,
bytes = {
v2 = [
num(1):8,
num(24):4, num(1):2, num(0):2,
num(1):8,
repeat(0xff):8,
repeat(0xff):4, padding:4,
],
},
handles = {
v2 = [
#0,
],
},
err = INCORRECT_HANDLE_TYPE,
}