aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/batch.rs82
-rw-r--r--tests/chain.rs140
-rw-r--r--tests/expr.rs1138
-rw-r--r--tests/lib.rs74
-rw-r--r--tests/rule.rs238
-rw-r--r--tests/set.rs132
-rw-r--r--tests/table.rs61
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);
}