Skip to content

Commit e99166e

Browse files
committed
result: implement tests for cass_result basic api.
Implemented tests for two cases: - Rows result - i.e. result of SELECT query. - non-Rows result - e.g. result of INSERT query
1 parent cb07ad4 commit e99166e

File tree

3 files changed

+193
-4
lines changed

3 files changed

+193
-4
lines changed

scylla-rust-wrapper/src/cass_types.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ include!(concat!(env!("OUT_DIR"), "/cppdriver_data_types.rs"));
1515
include!(concat!(env!("OUT_DIR"), "/cppdriver_data_query_error.rs"));
1616
include!(concat!(env!("OUT_DIR"), "/cppdriver_batch_types.rs"));
1717

18-
#[derive(Clone, Debug, PartialEq)]
18+
#[derive(Clone, Debug, PartialEq, Eq)]
1919
pub struct UDTDataType {
2020
// Vec to preserve the order of types
2121
pub field_types: Vec<(String, Arc<CassDataType>)>,
@@ -131,14 +131,14 @@ impl Default for UDTDataType {
131131
}
132132
}
133133

134-
#[derive(Clone, Debug, PartialEq)]
134+
#[derive(Clone, Debug, PartialEq, Eq)]
135135
pub enum MapDataType {
136136
Untyped,
137137
Key(Arc<CassDataType>),
138138
KeyAndValue(Arc<CassDataType>, Arc<CassDataType>),
139139
}
140140

141-
#[derive(Clone, Debug, PartialEq)]
141+
#[derive(Clone, Debug, PartialEq, Eq)]
142142
pub enum CassDataType {
143143
Value(CassValueType),
144144
UDT(UDTDataType),

scylla-rust-wrapper/src/query_result.rs

+189
Original file line numberDiff line numberDiff line change
@@ -1374,6 +1374,195 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
13741374
CassError::CASS_OK
13751375
}
13761376

1377+
#[cfg(test)]
1378+
mod tests {
1379+
use std::{ffi::c_char, ptr::addr_of_mut, sync::Arc};
1380+
1381+
use scylla::{
1382+
frame::response::result::{ColumnSpec, ColumnType, CqlValue, Row, TableSpec},
1383+
transport::PagingStateResponse,
1384+
};
1385+
1386+
use crate::{
1387+
cass_error::CassError,
1388+
cass_types::{CassDataType, CassValueType},
1389+
query_result::{
1390+
cass_result_column_data_type, cass_result_column_name, cass_result_first_row,
1391+
ptr_to_cstr_n, ptr_to_ref, size_t,
1392+
},
1393+
session::create_cass_rows_from_rows,
1394+
};
1395+
1396+
use super::{cass_result_column_count, cass_result_column_type, CassResult, CassResultData};
1397+
1398+
fn col_spec(name: &str, typ: ColumnType) -> ColumnSpec {
1399+
ColumnSpec {
1400+
table_spec: TableSpec::borrowed("ks", "tbl"),
1401+
name: name.to_string(),
1402+
typ,
1403+
}
1404+
}
1405+
1406+
const FIRST_COLUMN_NAME: &str = "bigint_col";
1407+
const SECOND_COLUMN_NAME: &str = "varint_col";
1408+
const THIRD_COLUMN_NAME: &str = "list_double_col";
1409+
fn create_cass_rows_result() -> CassResult {
1410+
let metadata = Arc::new(CassResultData::from_result_payload(
1411+
PagingStateResponse::NoMorePages,
1412+
vec![
1413+
col_spec(FIRST_COLUMN_NAME, ColumnType::BigInt),
1414+
col_spec(SECOND_COLUMN_NAME, ColumnType::Varint),
1415+
col_spec(
1416+
THIRD_COLUMN_NAME,
1417+
ColumnType::List(Box::new(ColumnType::Double)),
1418+
),
1419+
],
1420+
None,
1421+
));
1422+
1423+
let rows = create_cass_rows_from_rows(
1424+
Some(vec![Row {
1425+
columns: vec![
1426+
Some(CqlValue::BigInt(42)),
1427+
None,
1428+
Some(CqlValue::List(vec![
1429+
CqlValue::Float(0.5),
1430+
CqlValue::Float(42.42),
1431+
CqlValue::Float(9999.9999),
1432+
])),
1433+
],
1434+
}]),
1435+
&metadata,
1436+
);
1437+
1438+
CassResult { rows, metadata }
1439+
}
1440+
1441+
unsafe fn cass_result_column_name_rust_str(
1442+
result_ptr: *const CassResult,
1443+
column_index: u64,
1444+
) -> Option<&'static str> {
1445+
let mut name_ptr: *const c_char = std::ptr::null();
1446+
let mut name_length: size_t = 0;
1447+
let cass_err = cass_result_column_name(
1448+
result_ptr,
1449+
column_index,
1450+
addr_of_mut!(name_ptr),
1451+
addr_of_mut!(name_length),
1452+
);
1453+
assert_eq!(CassError::CASS_OK, cass_err);
1454+
ptr_to_cstr_n(name_ptr, name_length)
1455+
}
1456+
1457+
#[test]
1458+
fn rows_cass_result_api_test() {
1459+
let result = create_cass_rows_result();
1460+
1461+
unsafe {
1462+
let result_ptr = std::ptr::addr_of!(result);
1463+
1464+
// cass_result_column_count test
1465+
{
1466+
let column_count = cass_result_column_count(result_ptr);
1467+
assert_eq!(3, column_count);
1468+
}
1469+
1470+
// cass_result_column_name test
1471+
{
1472+
let first_column_name = cass_result_column_name_rust_str(result_ptr, 0).unwrap();
1473+
assert_eq!(FIRST_COLUMN_NAME, first_column_name);
1474+
let second_column_name = cass_result_column_name_rust_str(result_ptr, 1).unwrap();
1475+
assert_eq!(SECOND_COLUMN_NAME, second_column_name);
1476+
let third_column_name = cass_result_column_name_rust_str(result_ptr, 2).unwrap();
1477+
assert_eq!(THIRD_COLUMN_NAME, third_column_name);
1478+
}
1479+
1480+
// cass_result_column_type test
1481+
{
1482+
let first_col_type = cass_result_column_type(result_ptr, 0);
1483+
assert_eq!(CassValueType::CASS_VALUE_TYPE_BIGINT, first_col_type);
1484+
let second_col_type = cass_result_column_type(result_ptr, 1);
1485+
assert_eq!(CassValueType::CASS_VALUE_TYPE_VARINT, second_col_type);
1486+
let third_col_type = cass_result_column_type(result_ptr, 2);
1487+
assert_eq!(CassValueType::CASS_VALUE_TYPE_LIST, third_col_type);
1488+
let out_of_bound_col_type = cass_result_column_type(result_ptr, 555);
1489+
assert_eq!(
1490+
CassValueType::CASS_VALUE_TYPE_UNKNOWN,
1491+
out_of_bound_col_type
1492+
);
1493+
}
1494+
1495+
// cass_result_column_data_type test
1496+
{
1497+
let first_col_data_type = ptr_to_ref(cass_result_column_data_type(result_ptr, 0));
1498+
assert_eq!(
1499+
&CassDataType::Value(CassValueType::CASS_VALUE_TYPE_BIGINT),
1500+
first_col_data_type
1501+
);
1502+
let second_col_data_type = ptr_to_ref(cass_result_column_data_type(result_ptr, 1));
1503+
assert_eq!(
1504+
&CassDataType::Value(CassValueType::CASS_VALUE_TYPE_VARINT),
1505+
second_col_data_type
1506+
);
1507+
let third_col_data_type = ptr_to_ref(cass_result_column_data_type(result_ptr, 2));
1508+
assert_eq!(
1509+
&CassDataType::List {
1510+
typ: Some(Arc::new(CassDataType::Value(
1511+
CassValueType::CASS_VALUE_TYPE_DOUBLE
1512+
))),
1513+
frozen: false
1514+
},
1515+
third_col_data_type
1516+
);
1517+
let out_of_bound_col_data_type = cass_result_column_data_type(result_ptr, 555);
1518+
assert!(out_of_bound_col_data_type.is_null());
1519+
}
1520+
}
1521+
}
1522+
1523+
fn create_non_rows_cass_result() -> CassResult {
1524+
let metadata = Arc::new(CassResultData::from_result_payload(
1525+
PagingStateResponse::NoMorePages,
1526+
vec![],
1527+
None,
1528+
));
1529+
CassResult {
1530+
rows: None,
1531+
metadata,
1532+
}
1533+
}
1534+
1535+
#[test]
1536+
fn non_rows_cass_result_api_test() {
1537+
let result = create_non_rows_cass_result();
1538+
1539+
// Check that API functions do not panic when rows are empty - e.g. for INSERT queries.
1540+
unsafe {
1541+
let result_ptr = std::ptr::addr_of!(result);
1542+
1543+
assert_eq!(0, cass_result_column_count(result_ptr));
1544+
assert_eq!(
1545+
CassValueType::CASS_VALUE_TYPE_UNKNOWN,
1546+
cass_result_column_type(result_ptr, 0)
1547+
);
1548+
assert!(cass_result_column_data_type(result_ptr, 0).is_null());
1549+
assert!(cass_result_first_row(result_ptr).is_null());
1550+
1551+
{
1552+
let mut name_ptr: *const c_char = std::ptr::null();
1553+
let mut name_length: size_t = 0;
1554+
let cass_err = cass_result_column_name(
1555+
result_ptr,
1556+
0,
1557+
addr_of_mut!(name_ptr),
1558+
addr_of_mut!(name_length),
1559+
);
1560+
assert_eq!(CassError::CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS, cass_err);
1561+
}
1562+
}
1563+
}
1564+
}
1565+
13771566
// CassResult functions:
13781567
/*
13791568
extern "C" {

scylla-rust-wrapper/src/session.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ pub unsafe extern "C" fn cass_session_execute(
339339
}
340340
}
341341

342-
fn create_cass_rows_from_rows(
342+
pub(crate) fn create_cass_rows_from_rows(
343343
rows: Option<Vec<Row>>,
344344
metadata: &Arc<CassResultData>,
345345
) -> Option<Vec<CassRow>> {

0 commit comments

Comments
 (0)