Skip to content

Commit d81ecec

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 269fe0b commit d81ecec

File tree

3 files changed

+185
-3
lines changed

3 files changed

+185
-3
lines changed

scylla-rust-wrapper/src/cass_types.rs

Lines changed: 2 additions & 2 deletions
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)]
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>)>,
@@ -90,7 +90,7 @@ impl Default for UDTDataType {
9090
}
9191
}
9292

93-
#[derive(Clone, Debug)]
93+
#[derive(Clone, Debug, PartialEq, Eq)]
9494
pub enum CassDataType {
9595
Value(CassValueType),
9696
UDT(UDTDataType),

scylla-rust-wrapper/src/query_result.rs

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,188 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
12981298
CassError::CASS_OK
12991299
}
13001300

1301+
#[cfg(test)]
1302+
mod tests {
1303+
use std::{ffi::c_char, ptr::addr_of_mut, sync::Arc};
1304+
1305+
use scylla::frame::response::result::{ColumnSpec, ColumnType, CqlValue, Row, TableSpec};
1306+
1307+
use crate::{
1308+
cass_error::CassError,
1309+
cass_types::{CassDataType, CassValueType},
1310+
query_result::{
1311+
cass_result_column_data_type, cass_result_column_name, cass_result_first_row,
1312+
ptr_to_cstr_n, ptr_to_ref, size_t,
1313+
},
1314+
session::create_cass_rows_from_rows,
1315+
};
1316+
1317+
use super::{cass_result_column_count, cass_result_column_type, CassResult, CassResultData};
1318+
1319+
fn col_spec(name: &str, typ: ColumnType) -> ColumnSpec {
1320+
ColumnSpec {
1321+
table_spec: TableSpec {
1322+
ks_name: "ks".to_string(),
1323+
table_name: "tbl".to_string(),
1324+
},
1325+
name: name.to_string(),
1326+
typ,
1327+
}
1328+
}
1329+
1330+
const FIRST_COLUMN_NAME: &str = "bigint_col";
1331+
const SECOND_COLUMN_NAME: &str = "varint_col";
1332+
const THIRD_COLUMN_NAME: &str = "list_double_col";
1333+
fn create_cass_rows_result() -> CassResult {
1334+
let metadata = Arc::new(CassResultData::from_result_payload(
1335+
None,
1336+
vec![
1337+
col_spec(FIRST_COLUMN_NAME, ColumnType::BigInt),
1338+
col_spec(SECOND_COLUMN_NAME, ColumnType::Varint),
1339+
col_spec(
1340+
THIRD_COLUMN_NAME,
1341+
ColumnType::List(Box::new(ColumnType::Double)),
1342+
),
1343+
],
1344+
None,
1345+
));
1346+
1347+
let rows = create_cass_rows_from_rows(
1348+
Some(vec![Row {
1349+
columns: vec![
1350+
Some(CqlValue::BigInt(42)),
1351+
None,
1352+
Some(CqlValue::List(vec![
1353+
CqlValue::Float(0.5),
1354+
CqlValue::Float(42.42),
1355+
CqlValue::Float(9999.9999),
1356+
])),
1357+
],
1358+
}]),
1359+
&metadata,
1360+
);
1361+
1362+
CassResult { rows, metadata }
1363+
}
1364+
1365+
unsafe fn cass_result_column_name_rust_str(
1366+
result_ptr: *const CassResult,
1367+
column_index: u64,
1368+
) -> Option<&'static str> {
1369+
let mut name_ptr: *const c_char = std::ptr::null();
1370+
let mut name_length: size_t = 0;
1371+
let cass_err = cass_result_column_name(
1372+
result_ptr,
1373+
column_index,
1374+
addr_of_mut!(name_ptr),
1375+
addr_of_mut!(name_length),
1376+
);
1377+
assert_eq!(CassError::CASS_OK, cass_err);
1378+
ptr_to_cstr_n(name_ptr, name_length)
1379+
}
1380+
1381+
#[test]
1382+
fn rows_cass_result_api_test() {
1383+
let result = create_cass_rows_result();
1384+
1385+
unsafe {
1386+
let result_ptr = std::ptr::addr_of!(result);
1387+
1388+
// cass_result_column_count test
1389+
{
1390+
let column_count = cass_result_column_count(result_ptr);
1391+
assert_eq!(3, column_count);
1392+
}
1393+
1394+
// cass_result_column_name test
1395+
{
1396+
let first_column_name = cass_result_column_name_rust_str(result_ptr, 0).unwrap();
1397+
assert_eq!(FIRST_COLUMN_NAME, first_column_name);
1398+
let second_column_name = cass_result_column_name_rust_str(result_ptr, 1).unwrap();
1399+
assert_eq!(SECOND_COLUMN_NAME, second_column_name);
1400+
let third_column_name = cass_result_column_name_rust_str(result_ptr, 2).unwrap();
1401+
assert_eq!(THIRD_COLUMN_NAME, third_column_name);
1402+
}
1403+
1404+
// cass_result_column_type test
1405+
{
1406+
let first_col_type = cass_result_column_type(result_ptr, 0);
1407+
assert_eq!(CassValueType::CASS_VALUE_TYPE_BIGINT, first_col_type);
1408+
let second_col_type = cass_result_column_type(result_ptr, 1);
1409+
assert_eq!(CassValueType::CASS_VALUE_TYPE_VARINT, second_col_type);
1410+
let third_col_type = cass_result_column_type(result_ptr, 2);
1411+
assert_eq!(CassValueType::CASS_VALUE_TYPE_LIST, third_col_type);
1412+
let out_of_bound_col_type = cass_result_column_type(result_ptr, 555);
1413+
assert_eq!(
1414+
CassValueType::CASS_VALUE_TYPE_UNKNOWN,
1415+
out_of_bound_col_type
1416+
);
1417+
}
1418+
1419+
// cass_result_column_data_type test
1420+
{
1421+
let first_col_data_type = ptr_to_ref(cass_result_column_data_type(result_ptr, 0));
1422+
assert_eq!(
1423+
&CassDataType::Value(CassValueType::CASS_VALUE_TYPE_BIGINT),
1424+
first_col_data_type
1425+
);
1426+
let second_col_data_type = ptr_to_ref(cass_result_column_data_type(result_ptr, 1));
1427+
assert_eq!(
1428+
&CassDataType::Value(CassValueType::CASS_VALUE_TYPE_VARINT),
1429+
second_col_data_type
1430+
);
1431+
let third_col_data_type = ptr_to_ref(cass_result_column_data_type(result_ptr, 2));
1432+
assert_eq!(
1433+
&CassDataType::List(Some(Arc::new(CassDataType::Value(
1434+
CassValueType::CASS_VALUE_TYPE_DOUBLE
1435+
)))),
1436+
third_col_data_type
1437+
);
1438+
let out_of_bound_col_data_type = cass_result_column_data_type(result_ptr, 555);
1439+
assert!(out_of_bound_col_data_type.is_null());
1440+
}
1441+
}
1442+
}
1443+
1444+
fn create_non_rows_cass_result() -> CassResult {
1445+
let metadata = Arc::new(CassResultData::from_result_payload(None, vec![], None));
1446+
CassResult {
1447+
rows: None,
1448+
metadata,
1449+
}
1450+
}
1451+
1452+
#[test]
1453+
fn non_rows_cass_result_api_test() {
1454+
let result = create_non_rows_cass_result();
1455+
1456+
// Check that API functions do not panic when rows are empty - e.g. for INSERT queries.
1457+
unsafe {
1458+
let result_ptr = std::ptr::addr_of!(result);
1459+
1460+
assert_eq!(0, cass_result_column_count(result_ptr));
1461+
assert_eq!(
1462+
CassValueType::CASS_VALUE_TYPE_UNKNOWN,
1463+
cass_result_column_type(result_ptr, 0)
1464+
);
1465+
assert!(cass_result_column_data_type(result_ptr, 0).is_null());
1466+
assert!(cass_result_first_row(result_ptr).is_null());
1467+
1468+
{
1469+
let mut name_ptr: *const c_char = std::ptr::null();
1470+
let mut name_length: size_t = 0;
1471+
let cass_err = cass_result_column_name(
1472+
result_ptr,
1473+
0,
1474+
addr_of_mut!(name_ptr),
1475+
addr_of_mut!(name_length),
1476+
);
1477+
assert_eq!(CassError::CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS, cass_err);
1478+
}
1479+
}
1480+
}
1481+
}
1482+
13011483
// CassResult functions:
13021484
/*
13031485
extern "C" {

scylla-rust-wrapper/src/session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ pub unsafe extern "C" fn cass_session_execute(
310310
}
311311
}
312312

313-
fn create_cass_rows_from_rows(
313+
pub(crate) fn create_cass_rows_from_rows(
314314
rows: Option<Vec<Row>>,
315315
metadata: &Arc<CassResultData>,
316316
) -> Option<Vec<CassRow>> {

0 commit comments

Comments
 (0)