| // Copyright 2021 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. |
| |
| encode_failure("VectorExceedsLimit") { |
| // TODO(fxbug.dev/37304) Enforce size bounds in rust |
| bindings_denylist = [rust], |
| value = VectorWithLimit{ |
| v: [1, 2, 3], // exceeds the string length |
| }, |
| err = COUNT_EXCEEDS_LIMIT, |
| } |
| |
| decode_failure("EmptyVectorWithNullPtrBody") { |
| // TODO(fxbug.dev/88792) Rust does not produce the correct error. |
| bindings_denylist = [rust], |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length of vector data |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // invalid null pointer to content |
| ], |
| }, |
| err = NON_NULLABLE_TYPE_WITH_NULL_VALUE, |
| } |
| |
| success("EmptyOptionalVectorWithNullPtrBody") { |
| value = OptionalVectorWrapper{ |
| v: null, |
| }, |
| bytes = { |
| v1, v2 = [ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length of vector data |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // invalid null pointer to content |
| ], |
| }, |
| } |
| |
| decode_failure("NonEmptyVectorWithNullPtrBody") { |
| // TODO(fxbug.dev/88793) Fix this on dart. |
| bindings_denylist = [dart], |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length of vector data |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // invalid null pointer to content |
| ], |
| }, |
| err = NON_EMPTY_VECTOR_WITH_NULL_BODY, |
| } |
| |
| decode_failure("NonEmptyOptionalVectorWithNullPtrBody") { |
| // TODO(fxbug.dev/88793) Fix this on dart. |
| bindings_denylist = [dart], |
| type = OptionalVectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length of vector data |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // invalid null pointer to content |
| ], |
| }, |
| err = NON_EMPTY_VECTOR_WITH_NULL_BODY, |
| } |
| |
| decode_failure("VectorWrongPointerValue") { |
| // TODO(fxbug.dev/88793) Fix this on dart. |
| bindings_denylist = [dart], |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length of vector data |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // invalid pointer to content |
| ], |
| }, |
| err = INVALID_PRESENCE_INDICATOR, |
| } |
| |
| decode_failure("OptionalVectorWrongPointerValue") { |
| // TODO(fxbug.dev/88793) Fix this on dart. |
| bindings_denylist = [dart], |
| type = OptionalVectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length of vector data |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // invalid pointer to content |
| ], |
| }, |
| err = INVALID_PRESENCE_INDICATOR, |
| } |
| |
| // Test vector with a 2^64-1 count, exceeding the 32-bit limit from RFC-0059. |
| decode_failure("VectorCountExceedsLimitByALot") { |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| num(0xffffffffffffffff):8, // length of vector data |
| repeat(0xff):8, // presence marker |
| ], |
| }, |
| err = COUNT_EXCEEDS_LIMIT, |
| } |
| |
| // Test vector with a 2^32 count, exceeding the 32-bit limit from RFC-0059. |
| decode_failure("VectorCountExceedsLimitByOne") { |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| num(0x100000000):8, // length of vector data |
| repeat(0xff):8, // presence marker |
| ], |
| }, |
| err = COUNT_EXCEEDS_LIMIT, |
| } |
| |
| // Test vector with count that exceeds the total message size. Bindings should |
| // explicitly check for this to avoid allocating huge vectors before failing. |
| decode_failure("VectorCountExceedsTotalMessageSize") { |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| num(25):8, // length of vector data (invalid, should be 8) |
| repeat(0xff):8, // presence marker |
| repeat(0xab):8, // vector data |
| ], |
| }, |
| err = TOO_FEW_BYTES, |
| } |
| |
| // Test vector with count that exceeds the remainder of the message size. |
| // Bindings should not explicitly check for this, but it should still fail. |
| decode_failure("VectorCountExceedsRemainingMessageSize") { |
| type = VectorWrapper, |
| bytes = { |
| v1, v2 = [ |
| num(9):8, // length of vector data (invalid, should be 8) |
| repeat(0xff):8, // presence marker |
| repeat(0xab):8, // vector data |
| ], |
| }, |
| err = TOO_FEW_BYTES, |
| } |
| |
| success("VectorOfStrings_AFewStrings") { |
| value = VectorOfStrings{ |
| v: [ |
| "hello, world!", |
| "this is fine", |
| "bbbbbbbb", |
| "aaa", |
| ], |
| }, |
| bytes = { |
| v1, v2 = [ |
| // vector primary object's length, presence indicator |
| num(4):8, repeat(0xff):8, |
| |
| // v[0] length, presence |
| num(13):8, repeat(0xff):8, |
| |
| // v[1] length, presence |
| num(12):8, repeat(0xff):8, |
| |
| // v[2] length, presence |
| num(8):8, repeat(0xff):8, |
| |
| // v[3] length, presence |
| num(3):8, repeat(0xff):8, |
| |
| // v[0] "hello, world!" |
| 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, |
| 0x6f, 0x72, 0x6c, 0x64, 0x21, padding:3, |
| |
| // v[1] "this is fine" |
| 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, |
| 0x66, 0x69, 0x6e, 0x65, padding:4, |
| |
| // v[2] "bbbbbbbb" |
| repeat(0x62):8, |
| |
| // v[3] "aaa" |
| 0x61, 0x61, 0x61, padding:5, |
| ], |
| }, |
| } |
| |
| success("LotsOfVectors_AFewVectors") { |
| value = LotsOfVectors{ |
| v1: [1, 2], |
| v2: [3, 3], |
| v3: [5, 6, 7, 8], |
| v4: ["hello, world!", "this is fine", "aaa"], |
| v5: [-1, -2], |
| v6: [-3, -4, -5], |
| v7: [-6, -7, -8, -9], |
| v8: [-10], |
| v9: [true, false, true], |
| }, |
| bytes = { |
| v1, v2 = [ |
| // vector lengths & presences |
| num(2):8, repeat(0xff):8, // v1 |
| num(2):8, repeat(0xff):8, // v2 |
| num(4):8, repeat(0xff):8, // v3 |
| num(3):8, repeat(0xff):8, // v4 |
| num(2):8, repeat(0xff):8, // v5 |
| num(3):8, repeat(0xff):8, // v6 |
| num(4):8, repeat(0xff):8, // v7 |
| num(1):8, repeat(0xff):8, // v8 |
| num(3):8, repeat(0xff):8, // v9 |
| |
| // v1 contents + padding |
| num(1):2, num(2):2, padding:4, |
| |
| // v2 contents |
| num(3):4, num(3):4, |
| |
| // v3 contents |
| num(5):8, num(6):8, num(7):8, num(8):8, |
| |
| // v4 lengths and presences |
| num(13):8, repeat(0xff):8, // v4[0] |
| num(12):8, repeat(0xff):8, // v4[1] |
| num(3):8, repeat(0xff):8, // v4[2] |
| |
| // v4[0] "hello, world!" |
| 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, |
| 0x6f, 0x72, 0x6c, 0x64, 0x21, padding:3, |
| |
| // v4[1] "this is fine" |
| 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, |
| 0x66, 0x69, 0x6e, 0x65, padding:4, |
| |
| // v4[2] "aaa" |
| 0x61, 0x61, 0x61, padding:5, |
| |
| // v5 contents |
| num(-1):1, num(-2):1, padding:6, |
| |
| // v6 contents |
| num(-3):2, num(-4):2, num(-5):2, padding:2, |
| |
| // v7 contents |
| num(-6):4, num(-7):4, num(-8):4, num(-9):4, |
| |
| // v8 contents |
| num(-10):8, |
| |
| // v9 contents |
| 0x01, 0x00, 0x01, padding:5, |
| ], |
| }, |
| } |