Skip to content

Commit e488fe7

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 62011b2 commit e488fe7

File tree

3 files changed

+195
-4
lines changed

3 files changed

+195
-4
lines changed

scylla-rust-wrapper/src/cass_types.rs

Lines changed: 3 additions & 3 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, 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

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,197 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
13771377
CassError::CASS_OK
13781378
}
13791379

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

scylla-rust-wrapper/src/session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ pub unsafe extern "C" fn cass_session_execute(
377377
}
378378
}
379379

380-
fn create_cass_rows_from_rows(
380+
pub(crate) fn create_cass_rows_from_rows(
381381
rows: Option<Vec<Row>>,
382382
metadata: &Arc<CassResultData>,
383383
) -> Option<Vec<CassRow>> {

0 commit comments

Comments
 (0)