diff options
-rw-r--r-- | tests/lib.rs | 16 | ||||
-rw-r--r-- | tests/rule.rs | 119 |
2 files changed, 133 insertions, 2 deletions
diff --git a/tests/lib.rs b/tests/lib.rs index b929966..a5a3b45 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use libc::{nlmsghdr, AF_UNIX, NFNETLINK_V0, NFNL_SUBSYS_NFTABLES}; use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Table}; use std::ffi::{c_void, CStr}; @@ -15,6 +16,10 @@ pub fn get_operation_from_nlmsghdr_type(x: u16) -> u8 { pub const TABLE_NAME: &[u8; 10] = b"mocktable\0"; pub const CHAIN_NAME: &[u8; 10] = b"mockchain\0"; +pub const TABLE_USERDATA: &[u8; 14] = b"mocktabledata\0"; +pub const CHAIN_USERDATA: &[u8; 14] = b"mockchaindata\0"; +pub const RULE_USERDATA: &[u8; 13] = b"mockruledata\0"; + type NetLinkType = u16; #[derive(Debug, thiserror::Error)] @@ -100,10 +105,13 @@ pub fn get_test_rule() -> Rule { rule } -pub fn get_test_nlmsg(rule: &mut dyn NlMsg) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { +pub fn get_test_nlmsg_with_msg_type( + obj: &mut dyn NlMsg, + msg_type: MsgType, +) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { let mut buf = vec![0u8; nft_nlmsg_maxsize() as usize]; unsafe { - rule.write(buf.as_mut_ptr() as *mut c_void, 0, MsgType::Add); + obj.write(buf.as_mut_ptr() as *mut c_void, 0, msg_type); // right now the message is composed of the following parts: // - nlmsghdr (contains the message size and type) @@ -136,3 +144,7 @@ pub fn get_test_nlmsg(rule: &mut dyn NlMsg) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { (nlmsghdr, nfgenmsg, raw_value) } } + +pub fn get_test_nlmsg(obj: &mut dyn NlMsg) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { + get_test_nlmsg_with_msg_type(obj, MsgType::Add) +} diff --git a/tests/rule.rs b/tests/rule.rs new file mode 100644 index 0000000..b601a61 --- /dev/null +++ b/tests/rule.rs @@ -0,0 +1,119 @@ +use std::ffi::CStr; + +mod sys; +use rustables::MsgType; +use sys::*; + +mod lib; +use lib::*; + +#[test] +fn new_empty_rule() { + let mut rule = get_test_rule(); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut rule); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_NEWRULE as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 52); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), + ]) + .to_raw() + ); +} + +#[test] +fn new_empty_rule_with_userdata() { + let mut rule = get_test_rule(); + rule.set_userdata(CStr::from_bytes_with_nul(RULE_USERDATA).unwrap()); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut rule); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_NEWRULE as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 72); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_USERDATA, RULE_USERDATA.to_vec()) + ]) + .to_raw() + ); +} + +#[test] +fn new_empty_rule_with_position_and_handle() { + let handle = 1337; + let position = 42; + let mut rule = get_test_rule(); + rule.set_handle(handle); + rule.set_position(position); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut rule); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_NEWRULE as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 76); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_HANDLE, handle.to_be_bytes().to_vec()), + NetlinkExpr::Final(NFTA_RULE_POSITION, position.to_be_bytes().to_vec()), + ]) + .to_raw() + ); +} + +#[test] +fn delete_empty_rule() { + let mut rule = get_test_rule(); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut rule, MsgType::Del); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_DELRULE as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 52); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), + ]) + .to_raw() + ); +} + +#[test] +fn delete_empty_rule_with_handle() { + let handle = 42; + let mut rule = get_test_rule(); + rule.set_handle(handle); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut rule, MsgType::Del); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_DELRULE as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 64); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), + NetlinkExpr::Final(NFTA_RULE_HANDLE, handle.to_be_bytes().to_vec()), + ]) + .to_raw() + ); +} |