aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/lib.rs16
-rw-r--r--tests/rule.rs119
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()
+ );
+}