diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/batch.rs | 81 | ||||
-rw-r--r-- | tests/chain.rs | 145 | ||||
-rw-r--r-- | tests/lib.rs | 12 |
3 files changed, 136 insertions, 102 deletions
diff --git a/tests/batch.rs b/tests/batch.rs index 740fc19..5b3380c 100644 --- a/tests/batch.rs +++ b/tests/batch.rs @@ -1,34 +1,70 @@ mod sys; +use std::mem::size_of; + +use libc::AF_NETLINK; +use libc::AF_UNIX; +use libc::AF_UNSPEC; use libc::NFNL_MSG_BATCH_BEGIN; +use libc::NLM_F_ACK; +use libc::NLM_F_REQUEST; use nix::libc::NFNL_MSG_BATCH_END; use rustables::nlmsg::NfNetlinkDeserializable; use rustables::nlmsg::NfNetlinkObject; +use rustables::parser::pad_netlink_object; +use rustables::parser::pad_netlink_object_with_variable_size; +use rustables::parser::NlMsg; use rustables::parser::{get_operation_from_nlmsghdr_type, parse_nlmsg, parse_object}; +use rustables::sys::nfgenmsg; +use rustables::sys::nlmsghdr; +use rustables::sys::NFNETLINK_V0; +use rustables::sys::NFNL_SUBSYS_NFTABLES; use rustables::{Batch, MsgType, Table}; mod lib; use lib::*; +const HEADER_SIZE: u32 = + pad_netlink_object_with_variable_size(size_of::<nlmsghdr>() + size_of::<nfgenmsg>()) as u32; + +const DEFAULT_BATCH_BEGIN_HDR: nlmsghdr = nlmsghdr { + nlmsg_len: HEADER_SIZE, + nlmsg_flags: NLM_F_REQUEST as u16, + nlmsg_type: NFNL_MSG_BATCH_BEGIN as u16, + nlmsg_seq: 0, + nlmsg_pid: 0, +}; +const DEFAULT_BATCH_MSG: NlMsg = NlMsg::NfGenMsg( + nfgenmsg { + nfgen_family: AF_UNSPEC as u8, + version: NFNETLINK_V0 as u8, + res_id: NFNL_SUBSYS_NFTABLES as u16, + }, + &[], +); + +const DEFAULT_BATCH_END_HDR: nlmsghdr = nlmsghdr { + nlmsg_len: HEADER_SIZE, + nlmsg_flags: NLM_F_REQUEST as u16, + nlmsg_type: NFNL_MSG_BATCH_END as u16, + nlmsg_seq: 1, + nlmsg_pid: 0, +}; + #[test] fn batch_empty() { let batch = Batch::new(); let buf = batch.finalize(); + println!("{:?}", buf); let (hdr, msg) = parse_nlmsg(&buf).expect("Invalid nlmsg message"); - assert_eq!(hdr.nlmsg_type, NFNL_MSG_BATCH_BEGIN as u16); - let (_nfgenmsg, attrs, remaining_data) = - parse_object(hdr, msg, &buf).expect("Could not parse the batch message"); - - assert_eq!(attrs.get_raw_data(), []); - - let (hdr, msg) = parse_nlmsg(&remaining_data).expect("Invalid nlmsg message"); - assert_eq!(hdr.nlmsg_type, NFNL_MSG_BATCH_END as u16); - let (_nfgenmsg, attrs, remaining_data) = - parse_object(hdr, msg, &remaining_data).expect("Could not parse the batch message"); + assert_eq!(hdr, DEFAULT_BATCH_BEGIN_HDR); + assert_eq!(msg, DEFAULT_BATCH_MSG); - assert_eq!(attrs.get_raw_data(), []); + let remaining_data_offset = pad_netlink_object_with_variable_size(hdr.nlmsg_len as usize); - assert_eq!(remaining_data, []) + let (hdr, msg) = parse_nlmsg(&buf[remaining_data_offset..]).expect("Invalid nlmsg message"); + assert_eq!(hdr, DEFAULT_BATCH_END_HDR); + assert_eq!(msg, DEFAULT_BATCH_MSG); } #[test] @@ -54,26 +90,21 @@ fn batch_with_objects() { let buf = batch.finalize(); let (hdr, msg) = parse_nlmsg(&buf).expect("Invalid nlmsg message"); - assert_eq!(hdr.nlmsg_type, NFNL_MSG_BATCH_BEGIN as u16); - let (_nfgenmsg, attrs, mut remaining_data) = - parse_object(hdr, msg, &buf).expect("Could not parse the batch message"); - - assert_eq!(attrs.get_raw_data(), []); + assert_eq!(hdr, DEFAULT_BATCH_BEGIN_HDR); + assert_eq!(msg, DEFAULT_BATCH_MSG); + let mut remaining_data = &buf[pad_netlink_object_with_variable_size(hdr.nlmsg_len as usize)..]; for i in 0..10 { let (deserialized_table, rest) = - Table::deserialize(remaining_data).expect("could not deserialize a table"); + Table::deserialize(&remaining_data).expect("could not deserialize a table"); remaining_data = rest; assert_eq!(deserialized_table, original_tables[i]); } let (hdr, msg) = parse_nlmsg(&remaining_data).expect("Invalid nlmsg message"); - assert_eq!(hdr.nlmsg_type, NFNL_MSG_BATCH_END as u16); - let (_nfgenmsg, attrs, remaining_data) = - parse_object(hdr, msg, &remaining_data).expect("Could not parse the batch message"); - - assert_eq!(attrs.get_raw_data(), []); - - assert_eq!(remaining_data, []) + let mut end_hdr = DEFAULT_BATCH_END_HDR; + end_hdr.nlmsg_seq = 11; + assert_eq!(hdr, end_hdr); + assert_eq!(msg, DEFAULT_BATCH_MSG); } diff --git a/tests/chain.rs b/tests/chain.rs index f77fd0e..c32959c 100644 --- a/tests/chain.rs +++ b/tests/chain.rs @@ -1,70 +1,75 @@ -//use std::ffi::CStr; -// -//mod sys; -//use rustables::{query::get_operation_from_nlmsghdr_type, MsgType}; -//use sys::*; -// -//mod lib; -//use lib::*; -// -//#[test] -//fn new_empty_chain() { -// let mut chain = get_test_chain(); -// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut chain); -// assert_eq!( -// get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), -// NFT_MSG_NEWCHAIN as u8 -// ); -// assert_eq!(nlmsghdr.nlmsg_len, 52); -// -// assert_eq!( -// raw_expr, -// NetlinkExpr::List(vec![ -// NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.to_vec()), -// NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.to_vec()), -// ]) -// .to_raw() -// ); -//} -// -//#[test] -//fn new_empty_chain_with_userdata() { -// let mut chain = get_test_chain(); -// chain.set_userdata(CStr::from_bytes_with_nul(CHAIN_USERDATA).unwrap()); -// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut chain); -// assert_eq!( -// get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), -// NFT_MSG_NEWCHAIN as u8 -// ); -// assert_eq!(nlmsghdr.nlmsg_len, 72); -// -// assert_eq!( -// raw_expr, -// NetlinkExpr::List(vec![ -// NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.to_vec()), -// NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.to_vec()), -// NetlinkExpr::Final(NFTA_CHAIN_USERDATA, CHAIN_USERDATA.to_vec()) -// ]) -// .to_raw() -// ); -//} -// -//#[test] -//fn delete_empty_chain() { -// let mut chain = get_test_chain(); -// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut chain, MsgType::Del); -// assert_eq!( -// get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), -// NFT_MSG_DELCHAIN as u8 -// ); -// assert_eq!(nlmsghdr.nlmsg_len, 52); -// -// assert_eq!( -// raw_expr, -// NetlinkExpr::List(vec![ -// NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.to_vec()), -// NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.to_vec()), -// ]) -// .to_raw() -// ); -//} +mod sys; +use rustables::{parser::get_operation_from_nlmsghdr_type, MsgType}; +use sys::*; + +mod lib; +use lib::*; + +#[test] +fn new_empty_chain() { + let mut chain = get_test_chain(); + + let mut buf = Vec::new(); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut buf, &mut chain); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_NEWCHAIN as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 52); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.as_bytes().to_vec()), + NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.as_bytes().to_vec()), + ]) + .to_raw() + ); +} + +#[test] +fn new_empty_chain_with_userdata() { + let mut chain = get_test_chain(); + chain.set_userdata(CHAIN_USERDATA); + + let mut buf = Vec::new(); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut buf, &mut chain); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_NEWCHAIN as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 72); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.as_bytes().to_vec()), + NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.as_bytes().to_vec()), + NetlinkExpr::Final(NFTA_CHAIN_USERDATA, CHAIN_USERDATA.as_bytes().to_vec()) + ]) + .to_raw() + ); +} + +#[test] +fn delete_empty_chain() { + let mut chain = get_test_chain(); + + let mut buf = Vec::new(); + let (nlmsghdr, _nfgenmsg, raw_expr) = + get_test_nlmsg_with_msg_type(&mut buf, &mut chain, MsgType::Del); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_DELCHAIN as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 52); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.as_bytes().to_vec()), + NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.as_bytes().to_vec()), + ]) + .to_raw() + ); +} diff --git a/tests/lib.rs b/tests/lib.rs index 66c9ec9..cf5ddb4 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -3,9 +3,8 @@ use std::ffi::CString; use libc::AF_UNIX; use rustables::nlmsg::{NfNetlinkObject, NfNetlinkWriter}; -use rustables::parser::Nfgenmsg; //use rustables::set::SetKey; -use rustables::sys::*; +use rustables::{sys::*, Chain}; use rustables::{MsgType, ProtoFamily, Table}; //use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Set, Table}; @@ -131,11 +130,11 @@ pub fn get_test_table_with_userdata_raw_expr() -> NetlinkExpr { .sort() } -/* pub fn get_test_chain() -> Chain { - Chain::new(CHAIN_NAME, Rc::new(get_test_table())) + Chain::new(&get_test_table()).with_name(CHAIN_NAME) } +/* pub fn get_test_rule() -> Rule { Rule::new(Rc::new(get_test_chain())) } @@ -149,7 +148,7 @@ pub fn get_test_nlmsg_with_msg_type<'a>( buf: &'a mut Vec<u8>, obj: &mut impl NfNetlinkObject, msg_type: MsgType, -) -> (nlmsghdr, Nfgenmsg, &'a [u8]) { +) -> (nlmsghdr, nfgenmsg, &'a [u8]) { let mut writer = NfNetlinkWriter::new(buf); obj.add_or_remove(&mut writer, msg_type, 0); @@ -164,7 +163,6 @@ pub fn get_test_nlmsg_with_msg_type<'a>( // sanity checks on the global message (this should be very similar/factorisable for the // most part in other tests) // TODO: check the messages flags - assert_eq!(nfgenmsg.family, AF_UNIX as u8); assert_eq!(nfgenmsg.res_id.to_be(), 0); (hdr, nfgenmsg, raw_value) @@ -173,6 +171,6 @@ pub fn get_test_nlmsg_with_msg_type<'a>( pub fn get_test_nlmsg<'a>( buf: &'a mut Vec<u8>, obj: &mut impl NfNetlinkObject, -) -> (nlmsghdr, Nfgenmsg, &'a [u8]) { +) -> (nlmsghdr, nfgenmsg, &'a [u8]) { get_test_nlmsg_with_msg_type(buf, obj, MsgType::Add) } |