Skip to content

Commit feb9649

Browse files
committed
tests: Add more scalar type tests, normal uuid and string type tests
This commit adds additional test to test various simple types such as int and float, as well as one more uuid test and some simple string type tests
1 parent b63d1c7 commit feb9649

File tree

1 file changed

+235
-0
lines changed

1 file changed

+235
-0
lines changed

scylla/tests/integration/serialization.rs

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,60 @@ fn handle_incorrect_dates<T>(error: &DeserializationError) -> Option<T> {
9797
}
9898
}
9999

100+
// Native type test, which expects value to have the display trait and be trivially copyable
101+
async fn run_native_serialize_test<T>(table_name: &str, type_name: &str, values: &[Option<T>])
102+
where
103+
T: SerializeValue
104+
+ DeserializeOwnedValue
105+
+ FromStr
106+
+ Debug
107+
+ Clone
108+
+ PartialEq
109+
+ Default
110+
+ Display
111+
+ Copy,
112+
{
113+
let session = init_test(table_name, type_name).await;
114+
tracing::debug!("Active keyspace: {}", session.get_keyspace().unwrap());
115+
116+
for original_value in values {
117+
session
118+
.query_unpaged(
119+
format!("INSERT INTO {} (id, val) VALUES (1, ?)", table_name),
120+
(&original_value,),
121+
)
122+
.await
123+
.unwrap();
124+
125+
let selected_value: Vec<T> = session
126+
.query_unpaged(format!("SELECT val FROM {}", table_name), &[])
127+
.await
128+
.unwrap()
129+
.into_rows_result()
130+
.unwrap()
131+
.rows::<(T,)>()
132+
.unwrap()
133+
.map(|row| match row {
134+
Ok((val,)) => val,
135+
Err(e) => handle_deserialize_error(&e, || T::default()),
136+
})
137+
.collect::<Vec<_>>();
138+
139+
for value in selected_value {
140+
tracing::debug!(
141+
"Received: {} | Expected: {}",
142+
value,
143+
if original_value.is_none() {
144+
T::default()
145+
} else {
146+
original_value.unwrap()
147+
}
148+
);
149+
assert_eq!(value, original_value.unwrap_or(T::default()));
150+
}
151+
}
152+
}
153+
100154
// Test for types that either don't have the Display trait or foreign types from other libraries
101155
async fn run_foreign_serialize_test<T>(table_name: &str, type_name: &str, values: &[Option<T>])
102156
where
@@ -273,6 +327,146 @@ async fn run_literal_input_maybe_empty_output_test<X>(
273327
}
274328
}
275329

330+
// Scalar types
331+
332+
#[tokio::test]
333+
async fn test_serialize_deserialize_bigint() {
334+
setup_tracing();
335+
const TABLE_NAME: &str = "bigint_serialization_test";
336+
337+
let test_cases = [
338+
Some(i64::MIN),
339+
Some(i64::MAX),
340+
Some(1),
341+
Some(-1),
342+
Some(0),
343+
None,
344+
];
345+
346+
run_native_serialize_test(TABLE_NAME, "bigint", &test_cases).await;
347+
}
348+
349+
#[tokio::test]
350+
async fn test_serialize_deserialize_int() {
351+
setup_tracing();
352+
const TABLE_NAME: &str = "int_serialization_test";
353+
354+
let test_cases = [
355+
Some(i32::MIN),
356+
Some(i32::MAX),
357+
Some(1),
358+
Some(-1),
359+
Some(0),
360+
None,
361+
];
362+
363+
run_native_serialize_test(TABLE_NAME, "int", &test_cases).await;
364+
}
365+
366+
#[tokio::test]
367+
async fn test_serialize_deserialize_smallint() {
368+
setup_tracing();
369+
const TABLE_NAME: &str = "smallint_serialization_test";
370+
371+
let test_cases = [
372+
Some(i16::MIN),
373+
Some(i16::MAX),
374+
Some(1),
375+
Some(-1),
376+
Some(0),
377+
None,
378+
];
379+
380+
run_native_serialize_test(TABLE_NAME, "smallint", &test_cases).await;
381+
}
382+
383+
#[tokio::test]
384+
async fn test_serialize_deserialize_tinyint() {
385+
setup_tracing();
386+
const TABLE_NAME: &str = "tinyint_serialization_test";
387+
388+
let test_cases = [
389+
Some(i8::MIN),
390+
Some(i8::MAX),
391+
Some(1),
392+
Some(-1),
393+
Some(0),
394+
None,
395+
];
396+
397+
run_native_serialize_test(TABLE_NAME, "tinyint", &test_cases).await;
398+
}
399+
400+
#[tokio::test]
401+
async fn test_serialize_deserialize_float() {
402+
setup_tracing();
403+
const TABLE_NAME: &str = "float_serialization_test";
404+
405+
let test_cases = [
406+
Some(f32::MIN),
407+
Some(f32::MAX),
408+
Some(1.0),
409+
Some(-1.0),
410+
Some(0.0),
411+
None,
412+
];
413+
414+
run_native_serialize_test(TABLE_NAME, "float", &test_cases).await;
415+
}
416+
417+
#[tokio::test]
418+
async fn test_serialize_deserialize_bool() {
419+
setup_tracing();
420+
const TABLE_NAME: &str = "bool_serialization_test";
421+
422+
let test_cases = [Some(true), Some(false), None];
423+
424+
run_native_serialize_test(TABLE_NAME, "boolean", &test_cases).await;
425+
}
426+
427+
#[tokio::test]
428+
async fn test_serialize_deserialize_double() {
429+
setup_tracing();
430+
const TABLE_NAME: &str = "double_serialization_test";
431+
432+
let test_cases = [
433+
Some(f64::MIN),
434+
Some(f64::MAX),
435+
Some(1.0),
436+
Some(-1.0),
437+
Some(0.0),
438+
None,
439+
];
440+
441+
run_native_serialize_test(TABLE_NAME, "double", &test_cases).await;
442+
}
443+
444+
#[tokio::test]
445+
async fn test_serialize_deserialize_double_literal() {
446+
setup_tracing();
447+
const TABLE_NAME: &str = "double_serialization_test";
448+
449+
let test_cases: Vec<(String, f64)> = [f64::MIN, f64::MAX, 1.0, -1.0, 0.0, 0.1]
450+
.iter()
451+
.map(|val| (val.to_string(), *val))
452+
.collect();
453+
454+
run_literal_and_bound_value_test(TABLE_NAME, "double", &test_cases.as_slice(), false).await;
455+
}
456+
457+
#[tokio::test]
458+
async fn test_serialize_deserialize_float_literal() {
459+
setup_tracing();
460+
const TABLE_NAME: &str = "float_serialization_test";
461+
462+
let test_cases: Vec<(String, f32)> = [f32::MIN, f32::MAX, 1.0, -1.0, 0.0, 0.1]
463+
.iter()
464+
.map(|val| (val.to_string(), *val))
465+
.collect();
466+
467+
run_literal_and_bound_value_test(TABLE_NAME, "float", &test_cases.as_slice(), false).await;
468+
}
469+
276470
// Arbitrary precision types
277471

278472
#[tokio::test]
@@ -1223,6 +1417,19 @@ async fn test_serialize_deserialize_offset_date_time_03_high_precision_rounding_
12231417

12241418
//UUID Types
12251419

1420+
#[tokio::test]
1421+
async fn test_serialize_deserialize_uuid() {
1422+
setup_tracing();
1423+
const TABLE_NAME: &str = "uuid_serialization_test";
1424+
1425+
let tests: Vec<(String, uuid::Uuid)> = (0..100)
1426+
.map(|_| uuid::Uuid::new_v4())
1427+
.map(|new_uuid| (new_uuid.to_string(), new_uuid))
1428+
.collect();
1429+
1430+
run_literal_and_bound_value_test(TABLE_NAME, "uuid", &tests.as_slice(), false).await;
1431+
}
1432+
12261433
#[tokio::test]
12271434
async fn test_serialize_deserialize_timeuuid() {
12281435
setup_tracing();
@@ -1331,6 +1538,34 @@ async fn test_serialize_deserialize_timeuuid_ordering() {
13311538
}
13321539
}
13331540

1541+
#[tokio::test]
1542+
async fn test_serialize_deserialize_strings_varchar() {
1543+
let table_name = "varchar_serialization_test";
1544+
1545+
let test_cases: Vec<(&str, String)> = vec![
1546+
("Hello, World!", String::from("Hello, World!")),
1547+
("Hello, Мир", String::from("Hello, Мир")), // multi-byte string
1548+
("🦀A🦀B🦀C", String::from("🦀A🦀B🦀C")),
1549+
("おはようございます", String::from("おはようございます")),
1550+
];
1551+
1552+
run_literal_and_bound_value_test(table_name, "varchar", &test_cases.as_slice(), true).await;
1553+
}
1554+
1555+
#[tokio::test]
1556+
async fn test_serialize_deserialize_strings_ascii() {
1557+
let table_name = "ascii_serialization_test";
1558+
1559+
let test_cases: Vec<(&str, String)> = vec![
1560+
("Hello, World!", String::from("Hello, World!")),
1561+
(
1562+
str::from_utf8(&[0x0, 0x7f]).unwrap(),
1563+
String::from_utf8(vec![0x0, 0x7f]).unwrap(),
1564+
), // min/max ASCII values
1565+
];
1566+
1567+
run_literal_and_bound_value_test(table_name, "varchar", &test_cases.as_slice(), true).await;
1568+
}
13341569

13351570
// UDT Types
13361571

0 commit comments

Comments
 (0)