diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/batch.rs | 82 | ||||
-rw-r--r-- | tests/chain.rs | 140 | ||||
-rw-r--r-- | tests/expr.rs | 1138 | ||||
-rw-r--r-- | tests/lib.rs | 74 | ||||
-rw-r--r-- | tests/rule.rs | 238 | ||||
-rw-r--r-- | tests/set.rs | 132 | ||||
-rw-r--r-- | tests/table.rs | 61 |
7 files changed, 994 insertions, 871 deletions
diff --git a/tests/batch.rs b/tests/batch.rs new file mode 100644 index 0000000..dbf444f --- /dev/null +++ b/tests/batch.rs @@ -0,0 +1,82 @@ +mod sys; +use libc::NFNL_MSG_BATCH_BEGIN; +use nix::libc::NFNL_MSG_BATCH_END; +use rustables::nlmsg::NfNetlinkObject; +use rustables::parser::{get_operation_from_nlmsghdr_type, parse_nlmsg, parse_object}; +use rustables::{Batch, MsgType, Table}; + +mod lib; +use lib::*; + +#[test] +fn batch_empty() { + let batch = Batch::new(); + let buf = batch.finalize(); + + let (hdr, msg) = parse_nlmsg(&buf).expect("Invalid nlmsg message"); + let op = get_operation_from_nlmsghdr_type(hdr.nlmsg_type) as i32; + assert_eq!(op, NFNL_MSG_BATCH_BEGIN); + 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"); + let op = get_operation_from_nlmsghdr_type(hdr.nlmsg_type) as i32; + assert_eq!(op, NFNL_MSG_BATCH_END); + 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, []) +} + +#[test] +fn batch_with_objects() { + let mut original_tables = vec![]; + for i in 0..10 { + let mut table = get_test_table(); + table.set_userdata(vec![i as u8]); + original_tables.push(table); + } + + let mut batch = Batch::new(); + for i in 0..10 { + batch.add( + &original_tables[i], + if i % 2 == 0 { + MsgType::Add + } else { + MsgType::Del + }, + ); + } + let buf = batch.finalize(); + + let (hdr, msg) = parse_nlmsg(&buf).expect("Invalid nlmsg message"); + let op = get_operation_from_nlmsghdr_type(hdr.nlmsg_type) as i32; + assert_eq!(op, NFNL_MSG_BATCH_BEGIN); + let (_nfgenmsg, attrs, mut remaining_data) = + parse_object(hdr, msg, &buf).expect("Could not parse the batch message"); + + assert_eq!(attrs.get_raw_data(), []); + + for i in 0..10 { + let (deserialized_table, rest) = + 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"); + let op = get_operation_from_nlmsghdr_type(hdr.nlmsg_type) as i32; + assert_eq!(op, NFNL_MSG_BATCH_END); + 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, []) +} diff --git a/tests/chain.rs b/tests/chain.rs index 809936a..f77fd0e 100644 --- a/tests/chain.rs +++ b/tests/chain.rs @@ -1,70 +1,70 @@ -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() - ); -} +//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() +// ); +//} diff --git a/tests/expr.rs b/tests/expr.rs index cfc9c7d..28bf9da 100644 --- a/tests/expr.rs +++ b/tests/expr.rs @@ -1,569 +1,569 @@ -use rustables::expr::{ - Bitwise, Cmp, CmpOp, Conntrack, Counter, Expression, HeaderField, IcmpCode, Immediate, Log, - LogGroup, LogPrefix, Lookup, Meta, Nat, NatType, Payload, Register, Reject, TcpHeaderField, - TransportHeaderField, Verdict, -}; -use rustables::query::{get_operation_from_nlmsghdr_type, Nfgenmsg}; -use rustables::set::Set; -use rustables::sys::libc::{nlmsghdr, NF_DROP}; -use rustables::{ProtoFamily, Rule}; -use std::ffi::CStr; -use std::net::Ipv4Addr; - -mod sys; -use sys::*; - -mod lib; -use lib::*; - -fn get_test_nlmsg_from_expr( - rule: &mut Rule, - expr: &impl Expression, -) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { - rule.add_expr(expr); - - let (nlmsghdr, nfgenmsg, raw_expr) = get_test_nlmsg(rule); - assert_eq!( - get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), - NFT_MSG_NEWRULE as u8 - ); - (nlmsghdr, nfgenmsg, raw_expr) -} - -#[test] -fn bitwise_expr_is_valid() { - let netmask = Ipv4Addr::new(255, 255, 255, 0); - let bitwise = Bitwise::new(netmask, 0); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &bitwise); - assert_eq!(nlmsghdr.nlmsg_len, 124); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"bitwise\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_BITWISE_SREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_BITWISE_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final(NFTA_BITWISE_LEN, 4u32.to_be_bytes().to_vec()), - NetlinkExpr::Nested( - NFTA_BITWISE_MASK, - vec![NetlinkExpr::Final( - NFTA_DATA_VALUE, - vec![255, 255, 255, 0] - )] - ), - NetlinkExpr::Nested( - NFTA_BITWISE_XOR, - vec![NetlinkExpr::Final( - NFTA_DATA_VALUE, - 0u32.to_be_bytes().to_vec() - )] - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn cmp_expr_is_valid() { - let cmp = Cmp::new(CmpOp::Eq, 0); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &cmp); - assert_eq!(nlmsghdr.nlmsg_len, 100); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"cmp\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final(NFTA_CMP_SREG, NFT_REG_1.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_CMP_OP, NFT_CMP_EQ.to_be_bytes().to_vec()), - NetlinkExpr::Nested( - NFTA_CMP_DATA, - vec![NetlinkExpr::Final(1u16, 0u32.to_be_bytes().to_vec())] - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn counter_expr_is_valid() { - let nb_bytes = 123456u64; - let nb_packets = 987u64; - let mut counter = Counter::new(); - counter.nb_bytes = nb_bytes; - counter.nb_packets = nb_packets; - - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &counter); - assert_eq!(nlmsghdr.nlmsg_len, 100); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"counter\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_COUNTER_BYTES, - nb_bytes.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_COUNTER_PACKETS, - nb_packets.to_be_bytes().to_vec() - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn ct_expr_is_valid() { - let ct = Conntrack::State; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &ct); - assert_eq!(nlmsghdr.nlmsg_len, 88); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"ct\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_CT_KEY, - NFT_CT_STATE.to_be_bytes().to_vec() - ), - NetlinkExpr::Final(NFTA_CT_DREG, NFT_REG_1.to_be_bytes().to_vec()) - ] - ) - ] - )] - ) - ]) - .to_raw() - ) -} - -#[test] -fn immediate_expr_is_valid() { - let immediate = Immediate::new(42u8, Register::Reg1); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &immediate); - assert_eq!(nlmsghdr.nlmsg_len, 100); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"immediate\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_IMMEDIATE_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Nested( - NFTA_IMMEDIATE_DATA, - vec![NetlinkExpr::Final(1u16, 42u8.to_be_bytes().to_vec())] - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn log_expr_is_valid() { - let log = Log { - group: Some(LogGroup(1)), - prefix: Some(LogPrefix::new("mockprefix").unwrap()), - }; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &log); - assert_eq!(nlmsghdr.nlmsg_len, 96); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"log\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final(NFTA_LOG_PREFIX, b"mockprefix\0".to_vec()), - NetlinkExpr::Final(NFTA_LOG_GROUP, 1u16.to_be_bytes().to_vec()) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn lookup_expr_is_valid() { - let set_name = &CStr::from_bytes_with_nul(b"mockset\0").unwrap(); - let mut rule = get_test_rule(); - let table = rule.get_chain().get_table(); - let mut set = Set::new(set_name, 0, table); - let address: Ipv4Addr = [8, 8, 8, 8].into(); - set.add(&address); - let lookup = Lookup::new(&set).unwrap(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &lookup); - assert_eq!(nlmsghdr.nlmsg_len, 104); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"lookup\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_LOOKUP_SREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final(NFTA_LOOKUP_SET, b"mockset\0".to_vec()), - NetlinkExpr::Final(NFTA_LOOKUP_SET_ID, 0u32.to_be_bytes().to_vec()), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -use rustables::expr::Masquerade; -#[test] -fn masquerade_expr_is_valid() { - let masquerade = Masquerade; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &masquerade); - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"masq\0".to_vec()), - NetlinkExpr::Nested(NFTA_EXPR_DATA, vec![]), - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn meta_expr_is_valid() { - let meta = Meta::Protocol; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &meta); - assert_eq!(nlmsghdr.nlmsg_len, 92); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"meta\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_META_KEY, - NFT_META_PROTOCOL.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_META_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn nat_expr_is_valid() { - let nat = Nat { - nat_type: NatType::SNat, - family: ProtoFamily::Ipv4, - ip_register: Register::Reg1, - port_register: None, - }; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &nat); - assert_eq!(nlmsghdr.nlmsg_len, 96); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"nat\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_NAT_TYPE, - NFT_NAT_SNAT.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_NAT_FAMILY, - (ProtoFamily::Ipv4 as u32).to_be_bytes().to_vec(), - ), - NetlinkExpr::Final( - NFTA_NAT_REG_ADDR_MIN, - NFT_REG_1.to_be_bytes().to_vec() - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn payload_expr_is_valid() { - let tcp_header_field = TcpHeaderField::Sport; - let transport_header_field = TransportHeaderField::Tcp(tcp_header_field); - let payload = Payload::Transport(transport_header_field); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &payload); - assert_eq!(nlmsghdr.nlmsg_len, 108); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"payload\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_PAYLOAD_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_PAYLOAD_BASE, - NFT_PAYLOAD_TRANSPORT_HEADER.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_PAYLOAD_OFFSET, - tcp_header_field.offset().to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_PAYLOAD_LEN, - tcp_header_field.len().to_be_bytes().to_vec() - ), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn reject_expr_is_valid() { - let code = IcmpCode::NoRoute; - let reject = Reject::Icmp(code); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &reject); - assert_eq!(nlmsghdr.nlmsg_len, 92); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"reject\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_REJECT_TYPE, - NFT_REJECT_ICMPX_UNREACH.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_REJECT_ICMP_CODE, - (code as u8).to_be_bytes().to_vec() - ), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn verdict_expr_is_valid() { - let verdict = Verdict::Drop; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &verdict); - assert_eq!(nlmsghdr.nlmsg_len, 104); - - 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::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"immediate\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_IMMEDIATE_DREG, - NFT_REG_VERDICT.to_be_bytes().to_vec() - ), - NetlinkExpr::Nested( - NFTA_IMMEDIATE_DATA, - vec![NetlinkExpr::Nested( - NFTA_DATA_VERDICT, - vec![NetlinkExpr::Final( - NFTA_VERDICT_CODE, - NF_DROP.to_be_bytes().to_vec() - ),] - )], - ), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} +//use rustables::expr::{ +// Bitwise, Cmp, CmpOp, Conntrack, Counter, Expression, HeaderField, IcmpCode, Immediate, Log, +// LogGroup, LogPrefix, Lookup, Meta, Nat, NatType, Payload, Register, Reject, TcpHeaderField, +// TransportHeaderField, Verdict, +//}; +//use rustables::query::{get_operation_from_nlmsghdr_type, Nfgenmsg}; +//use rustables::set::Set; +//use rustables::sys::libc::{nlmsghdr, NF_DROP}; +//use rustables::{ProtoFamily, Rule}; +//use std::ffi::CStr; +//use std::net::Ipv4Addr; +// +//mod sys; +//use sys::*; +// +//mod lib; +//use lib::*; +// +//fn get_test_nlmsg_from_expr( +// rule: &mut Rule, +// expr: &impl Expression, +//) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { +// rule.add_expr(expr); +// +// let (nlmsghdr, nfgenmsg, raw_expr) = get_test_nlmsg(rule); +// assert_eq!( +// get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), +// NFT_MSG_NEWRULE as u8 +// ); +// (nlmsghdr, nfgenmsg, raw_expr) +//} +// +//#[test] +//fn bitwise_expr_is_valid() { +// let netmask = Ipv4Addr::new(255, 255, 255, 0); +// let bitwise = Bitwise::new(netmask, 0); +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &bitwise); +// assert_eq!(nlmsghdr.nlmsg_len, 124); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"bitwise\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_BITWISE_SREG, +// NFT_REG_1.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_BITWISE_DREG, +// NFT_REG_1.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final(NFTA_BITWISE_LEN, 4u32.to_be_bytes().to_vec()), +// NetlinkExpr::Nested( +// NFTA_BITWISE_MASK, +// vec![NetlinkExpr::Final( +// NFTA_DATA_VALUE, +// vec![255, 255, 255, 0] +// )] +// ), +// NetlinkExpr::Nested( +// NFTA_BITWISE_XOR, +// vec![NetlinkExpr::Final( +// NFTA_DATA_VALUE, +// 0u32.to_be_bytes().to_vec() +// )] +// ) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn cmp_expr_is_valid() { +// let cmp = Cmp::new(CmpOp::Eq, 0); +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &cmp); +// assert_eq!(nlmsghdr.nlmsg_len, 100); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"cmp\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final(NFTA_CMP_SREG, NFT_REG_1.to_be_bytes().to_vec()), +// NetlinkExpr::Final(NFTA_CMP_OP, NFT_CMP_EQ.to_be_bytes().to_vec()), +// NetlinkExpr::Nested( +// NFTA_CMP_DATA, +// vec![NetlinkExpr::Final(1u16, 0u32.to_be_bytes().to_vec())] +// ) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn counter_expr_is_valid() { +// let nb_bytes = 123456u64; +// let nb_packets = 987u64; +// let mut counter = Counter::new(); +// counter.nb_bytes = nb_bytes; +// counter.nb_packets = nb_packets; +// +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &counter); +// assert_eq!(nlmsghdr.nlmsg_len, 100); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"counter\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_COUNTER_BYTES, +// nb_bytes.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_COUNTER_PACKETS, +// nb_packets.to_be_bytes().to_vec() +// ) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn ct_expr_is_valid() { +// let ct = Conntrack::State; +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &ct); +// assert_eq!(nlmsghdr.nlmsg_len, 88); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"ct\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_CT_KEY, +// NFT_CT_STATE.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final(NFTA_CT_DREG, NFT_REG_1.to_be_bytes().to_vec()) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ) +//} +// +//#[test] +//fn immediate_expr_is_valid() { +// let immediate = Immediate::new(42u8, Register::Reg1); +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &immediate); +// assert_eq!(nlmsghdr.nlmsg_len, 100); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"immediate\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_IMMEDIATE_DREG, +// NFT_REG_1.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Nested( +// NFTA_IMMEDIATE_DATA, +// vec![NetlinkExpr::Final(1u16, 42u8.to_be_bytes().to_vec())] +// ) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn log_expr_is_valid() { +// let log = Log { +// group: Some(LogGroup(1)), +// prefix: Some(LogPrefix::new("mockprefix").unwrap()), +// }; +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &log); +// assert_eq!(nlmsghdr.nlmsg_len, 96); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"log\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final(NFTA_LOG_PREFIX, b"mockprefix\0".to_vec()), +// NetlinkExpr::Final(NFTA_LOG_GROUP, 1u16.to_be_bytes().to_vec()) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn lookup_expr_is_valid() { +// let set_name = &CStr::from_bytes_with_nul(b"mockset\0").unwrap(); +// let mut rule = get_test_rule(); +// let table = rule.get_chain().get_table(); +// let mut set = Set::new(set_name, 0, table); +// let address: Ipv4Addr = [8, 8, 8, 8].into(); +// set.add(&address); +// let lookup = Lookup::new(&set).unwrap(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &lookup); +// assert_eq!(nlmsghdr.nlmsg_len, 104); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"lookup\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_LOOKUP_SREG, +// NFT_REG_1.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final(NFTA_LOOKUP_SET, b"mockset\0".to_vec()), +// NetlinkExpr::Final(NFTA_LOOKUP_SET_ID, 0u32.to_be_bytes().to_vec()), +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//use rustables::expr::Masquerade; +//#[test] +//fn masquerade_expr_is_valid() { +// let masquerade = Masquerade; +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &masquerade); +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"masq\0".to_vec()), +// NetlinkExpr::Nested(NFTA_EXPR_DATA, vec![]), +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn meta_expr_is_valid() { +// let meta = Meta::Protocol; +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &meta); +// assert_eq!(nlmsghdr.nlmsg_len, 92); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"meta\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_META_KEY, +// NFT_META_PROTOCOL.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_META_DREG, +// NFT_REG_1.to_be_bytes().to_vec() +// ) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn nat_expr_is_valid() { +// let nat = Nat { +// nat_type: NatType::SNat, +// family: ProtoFamily::Ipv4, +// ip_register: Register::Reg1, +// port_register: None, +// }; +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &nat); +// assert_eq!(nlmsghdr.nlmsg_len, 96); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"nat\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_NAT_TYPE, +// NFT_NAT_SNAT.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_NAT_FAMILY, +// (ProtoFamily::Ipv4 as u32).to_be_bytes().to_vec(), +// ), +// NetlinkExpr::Final( +// NFTA_NAT_REG_ADDR_MIN, +// NFT_REG_1.to_be_bytes().to_vec() +// ) +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn payload_expr_is_valid() { +// let tcp_header_field = TcpHeaderField::Sport; +// let transport_header_field = TransportHeaderField::Tcp(tcp_header_field); +// let payload = Payload::Transport(transport_header_field); +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &payload); +// assert_eq!(nlmsghdr.nlmsg_len, 108); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"payload\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_PAYLOAD_DREG, +// NFT_REG_1.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_PAYLOAD_BASE, +// NFT_PAYLOAD_TRANSPORT_HEADER.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_PAYLOAD_OFFSET, +// tcp_header_field.offset().to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_PAYLOAD_LEN, +// tcp_header_field.len().to_be_bytes().to_vec() +// ), +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn reject_expr_is_valid() { +// let code = IcmpCode::NoRoute; +// let reject = Reject::Icmp(code); +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &reject); +// assert_eq!(nlmsghdr.nlmsg_len, 92); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"reject\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_REJECT_TYPE, +// NFT_REJECT_ICMPX_UNREACH.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Final( +// NFTA_REJECT_ICMP_CODE, +// (code as u8).to_be_bytes().to_vec() +// ), +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn verdict_expr_is_valid() { +// let verdict = Verdict::Drop; +// let mut rule = get_test_rule(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &verdict); +// assert_eq!(nlmsghdr.nlmsg_len, 104); +// +// 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::Nested( +// NFTA_RULE_EXPRESSIONS, +// vec![NetlinkExpr::Nested( +// NFTA_LIST_ELEM, +// vec![ +// NetlinkExpr::Final(NFTA_EXPR_NAME, b"immediate\0".to_vec()), +// NetlinkExpr::Nested( +// NFTA_EXPR_DATA, +// vec![ +// NetlinkExpr::Final( +// NFTA_IMMEDIATE_DREG, +// NFT_REG_VERDICT.to_be_bytes().to_vec() +// ), +// NetlinkExpr::Nested( +// NFTA_IMMEDIATE_DATA, +// vec![NetlinkExpr::Nested( +// NFTA_DATA_VERDICT, +// vec![NetlinkExpr::Final( +// NFTA_VERDICT_CODE, +// NF_DROP.to_be_bytes().to_vec() +// ),] +// )], +// ), +// ] +// ) +// ] +// )] +// ) +// ]) +// .to_raw() +// ); +//} diff --git a/tests/lib.rs b/tests/lib.rs index 887b383..34fe16c 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -1,12 +1,14 @@ #![allow(dead_code)] +use std::ffi::CString; + use libc::{nlmsghdr, AF_UNIX}; -use rustables::nlmsg::{NfNetlinkObject, NfNetlinkWriter, Nfgenmsg}; -use rustables::parser::nft_nlmsg_maxsize; -use rustables::query::parse_nlmsg; +use rustables::nlmsg::{NfNetlinkObject, NfNetlinkWriter}; +use rustables::parser::Nfgenmsg; //use rustables::set::SetKey; +use rustables::sys::*; use rustables::{MsgType, ProtoFamily, Table}; + //use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Set, Table}; -use std::ffi::c_void; pub const TABLE_NAME: &'static str = "mocktable"; pub const CHAIN_NAME: &'static str = "mockchain"; @@ -25,7 +27,7 @@ type NetLinkType = u16; #[error("empty data")] pub struct EmptyDataError; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum NetlinkExpr { Nested(NetLinkType, Vec<NetlinkExpr>), Final(NetLinkType, Vec<u8>), @@ -81,12 +83,52 @@ impl NetlinkExpr { } } } + + pub fn sort(self) -> Self { + match self { + NetlinkExpr::Final(_, _) => self, + NetlinkExpr::Nested(ty, mut exprs) => { + exprs.sort(); + NetlinkExpr::Nested(ty, exprs) + } + NetlinkExpr::List(mut exprs) => { + exprs.sort(); + NetlinkExpr::List(exprs) + } + } + } } pub fn get_test_table() -> Table { Table::new(TABLE_NAME, ProtoFamily::Inet) } +pub fn get_test_table_raw_expr() -> NetlinkExpr { + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_TABLE_FLAGS, 0u32.to_be_bytes().to_vec()), + NetlinkExpr::Final( + NFTA_TABLE_NAME, + CString::new(TABLE_NAME).unwrap().to_bytes().to_vec(), + ), + ]) + .sort() +} + +pub fn get_test_table_with_userdata_raw_expr() -> NetlinkExpr { + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_TABLE_FLAGS, 0u32.to_be_bytes().to_vec()), + NetlinkExpr::Final( + NFTA_TABLE_NAME, + CString::new(TABLE_NAME).unwrap().to_bytes().to_vec(), + ), + NetlinkExpr::Final( + NFTA_TABLE_USERDATA, + CString::new(TABLE_USERDATA).unwrap().to_bytes().to_vec(), + ), + ]) + .sort() +} + /* pub fn get_test_chain() -> Chain { Chain::new(CHAIN_NAME, Rc::new(get_test_table())) @@ -101,17 +143,16 @@ pub fn get_test_set<T: SetKey>() -> Set<T> { } */ -pub fn get_test_nlmsg_with_msg_type( +pub fn get_test_nlmsg_with_msg_type<'a>( + buf: &'a mut Vec<u8>, obj: &mut impl NfNetlinkObject, msg_type: MsgType, -) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { - let mut buf = Vec::with_capacity(nft_nlmsg_maxsize() as usize); - let mut writer = NfNetlinkWriter::new(&mut buf); +) -> (nlmsghdr, Nfgenmsg, &'a [u8]) { + let mut writer = NfNetlinkWriter::new(buf); obj.add_or_remove(&mut writer, msg_type, 0); - println!("{:?}", &buf); - - let (hdr, msg) = rustables::parser::parse_nlmsg(&buf).expect("Couldn't parse the message"); + let (hdr, msg) = + rustables::parser::parse_nlmsg(buf.as_slice()).expect("Couldn't parse the message"); let (nfgenmsg, raw_value) = match msg { rustables::parser::NlMsg::NfGenMsg(nfgenmsg, raw_value) => (nfgenmsg, raw_value), @@ -124,9 +165,12 @@ pub fn get_test_nlmsg_with_msg_type( assert_eq!(nfgenmsg.family, AF_UNIX as u8); assert_eq!(nfgenmsg.res_id.to_be(), 0); - (hdr, *nfgenmsg, raw_value.to_owned()) + (hdr, nfgenmsg, raw_value) } -pub fn get_test_nlmsg(obj: &mut impl NfNetlinkObject) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { - get_test_nlmsg_with_msg_type(obj, MsgType::Add) +pub fn get_test_nlmsg<'a>( + buf: &'a mut Vec<u8>, + obj: &mut impl NfNetlinkObject, +) -> (nlmsghdr, Nfgenmsg, &'a [u8]) { + get_test_nlmsg_with_msg_type(buf, obj, MsgType::Add) } diff --git a/tests/rule.rs b/tests/rule.rs index 517db47..376d4d7 100644 --- a/tests/rule.rs +++ b/tests/rule.rs @@ -1,119 +1,119 @@ -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_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() - ); -} +//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_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() +// ); +//} diff --git a/tests/set.rs b/tests/set.rs index 4b79988..0e5d002 100644 --- a/tests/set.rs +++ b/tests/set.rs @@ -1,66 +1,66 @@ -mod sys; -use std::net::{Ipv4Addr, Ipv6Addr}; - -use rustables::{query::get_operation_from_nlmsghdr_type, set::SetKey, MsgType}; -use sys::*; - -mod lib; -use lib::*; - -#[test] -fn new_empty_set() { - let mut set = get_test_set::<Ipv4Addr>(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut set); - assert_eq!( - get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), - NFT_MSG_NEWSET as u8 - ); - assert_eq!(nlmsghdr.nlmsg_len, 80); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_SET_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_SET_NAME, SET_NAME.to_vec()), - NetlinkExpr::Final( - NFTA_SET_FLAGS, - ((libc::NFT_SET_ANONYMOUS | libc::NFT_SET_CONSTANT) as u32) - .to_be_bytes() - .to_vec() - ), - NetlinkExpr::Final(NFTA_SET_KEY_TYPE, Ipv4Addr::TYPE.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_SET_KEY_LEN, Ipv4Addr::LEN.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_SET_ID, SET_ID.to_be_bytes().to_vec()), - ]) - .to_raw() - ); -} - -#[test] -fn delete_empty_set() { - let mut set = get_test_set::<Ipv6Addr>(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut set, MsgType::Del); - assert_eq!( - get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), - NFT_MSG_DELSET as u8 - ); - assert_eq!(nlmsghdr.nlmsg_len, 80); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_SET_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_SET_NAME, SET_NAME.to_vec()), - NetlinkExpr::Final( - NFTA_SET_FLAGS, - ((libc::NFT_SET_ANONYMOUS | libc::NFT_SET_CONSTANT) as u32) - .to_be_bytes() - .to_vec() - ), - NetlinkExpr::Final(NFTA_SET_KEY_TYPE, Ipv6Addr::TYPE.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_SET_KEY_LEN, Ipv6Addr::LEN.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_SET_ID, SET_ID.to_be_bytes().to_vec()), - ]) - .to_raw() - ); -} +//mod sys; +//use std::net::{Ipv4Addr, Ipv6Addr}; +// +//use rustables::{query::get_operation_from_nlmsghdr_type, set::SetKey, MsgType}; +//use sys::*; +// +//mod lib; +//use lib::*; +// +//#[test] +//fn new_empty_set() { +// let mut set = get_test_set::<Ipv4Addr>(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut set); +// assert_eq!( +// get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), +// NFT_MSG_NEWSET as u8 +// ); +// assert_eq!(nlmsghdr.nlmsg_len, 80); +// +// assert_eq!( +// raw_expr, +// NetlinkExpr::List(vec![ +// NetlinkExpr::Final(NFTA_SET_TABLE, TABLE_NAME.to_vec()), +// NetlinkExpr::Final(NFTA_SET_NAME, SET_NAME.to_vec()), +// NetlinkExpr::Final( +// NFTA_SET_FLAGS, +// ((libc::NFT_SET_ANONYMOUS | libc::NFT_SET_CONSTANT) as u32) +// .to_be_bytes() +// .to_vec() +// ), +// NetlinkExpr::Final(NFTA_SET_KEY_TYPE, Ipv4Addr::TYPE.to_be_bytes().to_vec()), +// NetlinkExpr::Final(NFTA_SET_KEY_LEN, Ipv4Addr::LEN.to_be_bytes().to_vec()), +// NetlinkExpr::Final(NFTA_SET_ID, SET_ID.to_be_bytes().to_vec()), +// ]) +// .to_raw() +// ); +//} +// +//#[test] +//fn delete_empty_set() { +// let mut set = get_test_set::<Ipv6Addr>(); +// let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut set, MsgType::Del); +// assert_eq!( +// get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), +// NFT_MSG_DELSET as u8 +// ); +// assert_eq!(nlmsghdr.nlmsg_len, 80); +// +// assert_eq!( +// raw_expr, +// NetlinkExpr::List(vec![ +// NetlinkExpr::Final(NFTA_SET_TABLE, TABLE_NAME.to_vec()), +// NetlinkExpr::Final(NFTA_SET_NAME, SET_NAME.to_vec()), +// NetlinkExpr::Final( +// NFTA_SET_FLAGS, +// ((libc::NFT_SET_ANONYMOUS | libc::NFT_SET_CONSTANT) as u32) +// .to_be_bytes() +// .to_vec() +// ), +// NetlinkExpr::Final(NFTA_SET_KEY_TYPE, Ipv6Addr::TYPE.to_be_bytes().to_vec()), +// NetlinkExpr::Final(NFTA_SET_KEY_LEN, Ipv6Addr::LEN.to_be_bytes().to_vec()), +// NetlinkExpr::Final(NFTA_SET_ID, SET_ID.to_be_bytes().to_vec()), +// ]) +// .to_raw() +// ); +//} diff --git a/tests/table.rs b/tests/table.rs index 971d58b..d8a5f1e 100644 --- a/tests/table.rs +++ b/tests/table.rs @@ -1,7 +1,9 @@ -use std::ffi::CStr; - mod sys; -use rustables::{query::get_operation_from_nlmsghdr_type, MsgType}; +use rustables::{ + nlmsg::NfNetlinkObject, + parser::{get_operation_from_nlmsghdr_type, nft_nlmsg_maxsize}, + MsgType, Table, +}; use sys::*; mod lib; @@ -10,61 +12,56 @@ use lib::*; #[test] fn new_empty_table() { let mut table = get_test_table(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut table); + let mut buf = Vec::with_capacity(nft_nlmsg_maxsize() as usize); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut buf, &mut table); assert_eq!( get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), NFT_MSG_NEWTABLE as u8 ); assert_eq!(nlmsghdr.nlmsg_len, 44); - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_TABLE_NAME, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_TABLE_FLAGS, 0u32.to_be_bytes().to_vec()), - ]) - .to_raw() - ); + assert_eq!(raw_expr, get_test_table_raw_expr().to_raw()); } #[test] fn new_empty_table_with_userdata() { let mut table = get_test_table(); - table.set_userdata(CStr::from_bytes_with_nul(TABLE_USERDATA).unwrap()); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut table); + table.set_userdata(TABLE_USERDATA.as_bytes().to_vec()); + let mut buf = Vec::with_capacity(nft_nlmsg_maxsize() as usize); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut buf, &mut table); assert_eq!( get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), NFT_MSG_NEWTABLE as u8 ); assert_eq!(nlmsghdr.nlmsg_len, 64); - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_TABLE_NAME, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_TABLE_FLAGS, 0u32.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_TABLE_USERDATA, TABLE_USERDATA.to_vec()) - ]) - .to_raw() - ); + assert_eq!(raw_expr, get_test_table_with_userdata_raw_expr().to_raw()); } #[test] fn delete_empty_table() { let mut table = get_test_table(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut table, MsgType::Del); + let mut buf = Vec::with_capacity(nft_nlmsg_maxsize() as usize); + let (nlmsghdr, _nfgenmsg, raw_expr) = + get_test_nlmsg_with_msg_type(&mut buf, &mut table, MsgType::Del); assert_eq!( get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), NFT_MSG_DELTABLE as u8 ); assert_eq!(nlmsghdr.nlmsg_len, 44); - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_TABLE_NAME, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_TABLE_FLAGS, 0u32.to_be_bytes().to_vec()), - ]) - .to_raw() - ); + assert_eq!(raw_expr, get_test_table_raw_expr().to_raw()); +} + +#[test] +fn parse_table() { + let mut table = get_test_table(); + table.set_userdata(TABLE_USERDATA.as_bytes().to_vec()); + let mut buf = Vec::with_capacity(nft_nlmsg_maxsize() as usize); + let (_nlmsghdr, _nfgenmsg, _raw_expr) = get_test_nlmsg(&mut buf, &mut table); + + let (deserialized_table, remaining) = + Table::deserialize(&buf).expect("Couldn't deserialize the object"); + assert_eq!(table, deserialized_table); + assert_eq!(remaining.len(), 0); } |