| 384 | } |
| 385 | |
| 386 | TEST(StringViewArray, Validate) { |
| 387 | // Since this is a test of validation, we need to be able to construct invalid arrays. |
| 388 | auto buffer_s = Buffer::FromString("supercalifragilistic(sp?)"); |
| 389 | auto buffer_y = Buffer::FromString("yyyyyyyyyyyyyyyyyyyyyyyyy"); |
| 390 | |
| 391 | // empty array is valid |
| 392 | EXPECT_THAT(MakeBinaryViewArray({}, {}), Ok()); |
| 393 | |
| 394 | // empty array with some data buffers is valid |
| 395 | EXPECT_THAT(MakeBinaryViewArray({buffer_s, buffer_y}, {}), Ok()); |
| 396 | |
| 397 | // inline views need not have a corresponding buffer |
| 398 | EXPECT_THAT(MakeBinaryViewArray({}, |
| 399 | { |
| 400 | util::ToInlineBinaryView("hello"), |
| 401 | util::ToInlineBinaryView("world"), |
| 402 | util::ToInlineBinaryView("inline me"), |
| 403 | }), |
| 404 | Ok()); |
| 405 | |
| 406 | // non-inline views are expected to reference only buffers managed by the array |
| 407 | EXPECT_THAT( |
| 408 | MakeBinaryViewArray( |
| 409 | {buffer_s, buffer_y}, |
| 410 | {util::ToBinaryView("supe", static_cast<int32_t>(buffer_s->size()), 0, 0), |
| 411 | util::ToBinaryView("yyyy", static_cast<int32_t>(buffer_y->size()), 1, 0)}), |
| 412 | Ok()); |
| 413 | |
| 414 | // views may not reference data buffers not present in the array |
| 415 | EXPECT_THAT( |
| 416 | MakeBinaryViewArray( |
| 417 | {}, {util::ToBinaryView("supe", static_cast<int32_t>(buffer_s->size()), 0, 0)}), |
| 418 | Raises(StatusCode::IndexError)); |
| 419 | // ... or ranges which overflow the referenced data buffer |
| 420 | EXPECT_THAT( |
| 421 | MakeBinaryViewArray( |
| 422 | {buffer_s}, {util::ToBinaryView( |
| 423 | "supe", static_cast<int32_t>(buffer_s->size() + 50), 0, 0)}), |
| 424 | Raises(StatusCode::IndexError)); |
| 425 | |
| 426 | // Additionally, the prefixes of non-inline views must match the data buffer |
| 427 | EXPECT_THAT( |
| 428 | MakeBinaryViewArray( |
| 429 | {buffer_s, buffer_y}, |
| 430 | {util::ToBinaryView("SUPE", static_cast<int32_t>(buffer_s->size()), 0, 0), |
| 431 | util::ToBinaryView("yyyy", static_cast<int32_t>(buffer_y->size()), 1, 0)}), |
| 432 | Raises(StatusCode::Invalid)); |
| 433 | |
| 434 | // Invalid string views which are masked by a null bit do not cause validation to fail |
| 435 | auto invalid_but_masked = |
| 436 | MakeBinaryViewArray( |
| 437 | {buffer_s}, |
| 438 | {util::ToBinaryView("SUPE", static_cast<int32_t>(buffer_s->size()), 0, 0), |
| 439 | util::ToBinaryView("yyyy", 50, 40, 30)}, |
| 440 | /*validate=*/false) |
| 441 | .ValueOrDie() |
| 442 | ->data(); |
| 443 | invalid_but_masked->null_count = 2; |
nothing calls this directly
no test coverage detected