| // 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, |
| } |