Skip to content

Commit 58f523f

Browse files
committed
deser/row: errors tests
1 parent dd5e71e commit 58f523f

File tree

1 file changed

+169
-1
lines changed
  • scylla-cql/src/types/deserialize

1 file changed

+169
-1
lines changed

scylla-cql/src/types/deserialize/row.rs

Lines changed: 169 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,13 +413,17 @@ impl Display for BuiltinDeserializationErrorKind {
413413

414414
#[cfg(test)]
415415
mod tests {
416+
use assert_matches::assert_matches;
416417
use bytes::Bytes;
417418

419+
use crate::frame::frame_errors::ParseError;
418420
use crate::frame::response::result::{ColumnSpec, ColumnType};
421+
use crate::types::deserialize::row::BuiltinDeserializationErrorKind;
419422
use crate::types::deserialize::{DeserializationError, FrameSlice};
420423

421424
use super::super::tests::{serialize_cells, spec};
422-
use super::{ColumnIterator, DeserializeRow};
425+
use super::{BuiltinDeserializationError, ColumnIterator, CqlValue, DeserializeRow, Row};
426+
use super::{BuiltinTypeCheckError, BuiltinTypeCheckErrorKind};
423427

424428
#[test]
425429
fn test_tuple_deserialization() {
@@ -513,4 +517,168 @@ mod tests {
513517
let iter = ColumnIterator::new(specs, slice);
514518
<R as DeserializeRow<'frame>>::deserialize(iter)
515519
}
520+
521+
#[track_caller]
522+
fn get_typck_err(err: &DeserializationError) -> &BuiltinTypeCheckError {
523+
match err.0.downcast_ref() {
524+
Some(err) => err,
525+
None => panic!("not a BuiltinTypeCheckError: {:?}", err),
526+
}
527+
}
528+
529+
#[track_caller]
530+
fn get_deser_err(err: &DeserializationError) -> &BuiltinDeserializationError {
531+
match err.0.downcast_ref() {
532+
Some(err) => err,
533+
None => panic!("not a BuiltinDeserializationError: {:?}", err),
534+
}
535+
}
536+
537+
#[test]
538+
fn test_tuple_errors() {
539+
// Column type check failure
540+
{
541+
let col_name: &str = "i";
542+
let specs = &[spec(col_name, ColumnType::Int)];
543+
let err = deserialize::<(i64,)>(specs, &serialize_cells([val_int(123)])).unwrap_err();
544+
let err = get_typck_err(&err);
545+
assert_eq!(err.rust_name, std::any::type_name::<(i64,)>());
546+
assert_eq!(
547+
err.cql_types,
548+
specs
549+
.iter()
550+
.map(|spec| spec.typ.clone())
551+
.collect::<Vec<_>>()
552+
);
553+
let BuiltinTypeCheckErrorKind::ColumnTypeCheckFailed {
554+
column_index,
555+
column_name,
556+
err,
557+
} = &err.kind
558+
else {
559+
panic!("unexpected error kind: {}", err.kind)
560+
};
561+
assert_eq!(*column_index, 0);
562+
assert_eq!(column_name, col_name);
563+
let err = super::super::value::tests::get_typeck_err_inner(err.0.as_ref());
564+
assert_eq!(err.rust_name, std::any::type_name::<i64>());
565+
assert_eq!(err.cql_type, ColumnType::Int);
566+
assert_matches!(
567+
&err.kind,
568+
super::super::value::BuiltinTypeCheckErrorKind::MismatchedType {
569+
expected: &[ColumnType::BigInt, ColumnType::Counter]
570+
}
571+
);
572+
}
573+
574+
// Column deserialization failure
575+
{
576+
let col_name: &str = "i";
577+
let err = deserialize::<(i64,)>(
578+
&[spec(col_name, ColumnType::BigInt)],
579+
&serialize_cells([val_int(123)]),
580+
)
581+
.unwrap_err();
582+
let err = get_deser_err(&err);
583+
assert_eq!(err.rust_name, std::any::type_name::<(i64,)>());
584+
let BuiltinDeserializationErrorKind::ColumnDeserializationFailed {
585+
column_name,
586+
err,
587+
..
588+
} = &err.kind
589+
else {
590+
panic!("unexpected error kind: {}", err.kind)
591+
};
592+
assert_eq!(column_name, col_name);
593+
let err = super::super::value::tests::get_deser_err(err);
594+
assert_eq!(err.rust_name, std::any::type_name::<i64>());
595+
assert_eq!(err.cql_type, ColumnType::BigInt);
596+
assert_matches!(
597+
err.kind,
598+
super::super::value::BuiltinDeserializationErrorKind::ByteLengthMismatch {
599+
expected: 8,
600+
got: 4
601+
}
602+
);
603+
}
604+
605+
// Raw column deserialization failure
606+
{
607+
let col_name: &str = "i";
608+
let err = deserialize::<(i64,)>(
609+
&[spec(col_name, ColumnType::BigInt)],
610+
&Bytes::from_static(b"alamakota"),
611+
)
612+
.unwrap_err();
613+
let err = get_deser_err(&err);
614+
assert_eq!(err.rust_name, std::any::type_name::<(i64,)>());
615+
let BuiltinDeserializationErrorKind::RawColumnDeserializationFailed {
616+
column_index: _column_index,
617+
column_name,
618+
err: _err,
619+
} = &err.kind
620+
else {
621+
panic!("unexpected error kind: {}", err.kind)
622+
};
623+
assert_eq!(column_name, col_name);
624+
}
625+
}
626+
627+
#[test]
628+
fn test_row_errors() {
629+
// Column type check failure - happens never, because Row consists of CqlValues,
630+
// which accept all CQL types.
631+
632+
// Column deserialization failure
633+
{
634+
let col_name: &str = "i";
635+
let err = deserialize::<Row>(
636+
&[spec(col_name, ColumnType::BigInt)],
637+
&serialize_cells([val_int(123)]),
638+
)
639+
.unwrap_err();
640+
let err = get_deser_err(&err);
641+
assert_eq!(err.rust_name, std::any::type_name::<Row>());
642+
let BuiltinDeserializationErrorKind::ColumnDeserializationFailed {
643+
column_index: _column_index,
644+
column_name,
645+
err,
646+
} = &err.kind
647+
else {
648+
panic!("unexpected error kind: {}", err.kind)
649+
};
650+
assert_eq!(column_name, col_name);
651+
let err = super::super::value::tests::get_deser_err(err);
652+
assert_eq!(err.rust_name, std::any::type_name::<CqlValue>());
653+
assert_eq!(err.cql_type, ColumnType::BigInt);
654+
let super::super::value::BuiltinDeserializationErrorKind::GenericParseError(
655+
ParseError::BadIncomingData(info),
656+
) = &err.kind
657+
else {
658+
panic!("unexpected error kind: {}", err.kind)
659+
};
660+
assert_eq!(info, "Buffer length should be 8 not 4");
661+
}
662+
663+
// Raw column deserialization failure
664+
{
665+
let col_name: &str = "i";
666+
let err = deserialize::<Row>(
667+
&[spec(col_name, ColumnType::BigInt)],
668+
&Bytes::from_static(b"alamakota"),
669+
)
670+
.unwrap_err();
671+
let err = get_deser_err(&err);
672+
assert_eq!(err.rust_name, std::any::type_name::<Row>());
673+
let BuiltinDeserializationErrorKind::RawColumnDeserializationFailed {
674+
column_index: _column_index,
675+
column_name,
676+
err: _err,
677+
} = &err.kind
678+
else {
679+
panic!("unexpected error kind: {}", err.kind)
680+
};
681+
assert_eq!(column_name, col_name);
682+
}
683+
}
516684
}

0 commit comments

Comments
 (0)