aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSimon THOBY <git@nightmared.fr>2022-11-11 23:50:29 +0100
committerSimon THOBY <git@nightmared.fr>2022-11-12 12:13:01 +0100
commit6cd97d19b54eeedffa18fddebb1b09045b0e79cf (patch)
tree5444a37a1b19618313ca515c6e46c880155f66d5 /tests
parent84fc84c32e62e3d2c5fe7ab6c35b5d05f890e8a6 (diff)
re-add support for querying chains
Diffstat (limited to 'tests')
-rw-r--r--tests/batch.rs81
-rw-r--r--tests/chain.rs145
-rw-r--r--tests/lib.rs12
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)
}