Skip to content

Commit b81fa26

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 cf6dfb4 commit b81fa26

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
@@ -1380,6 +1380,197 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
13801380
CassError::CASS_OK
13811381
}
13821382

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