diff options
-rw-r--r-- | src/lib.rs | 3 | ||||
-rw-r--r-- | tests/lib.rs | 19 | ||||
-rw-r--r-- | tests/set.rs | 68 |
3 files changed, 86 insertions, 4 deletions
@@ -77,8 +77,8 @@ use thiserror::Error; extern crate log; pub mod sys; -use sys::libc; use std::{convert::TryFrom, ffi::c_void, ops::Deref}; +use sys::libc; macro_rules! try_alloc { ($e:expr) => {{ @@ -123,6 +123,7 @@ mod rule_methods; pub use rule_methods::{iface_index, Protocol, RuleMethods, Error as MatchError}; pub mod set; +pub use set::Set; /// The type of the message as it's sent to netfilter. A message consists of an object, such as a /// [`Table`], [`Chain`] or [`Rule`] for example, and a [`MsgType`] to describe what to do with diff --git a/tests/lib.rs b/tests/lib.rs index af599a5..c30f881 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -1,6 +1,7 @@ #![allow(dead_code)] use libc::{nlmsghdr, AF_UNIX, NFNETLINK_V0, NFNL_SUBSYS_NFTABLES}; -use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Table}; +use rustables::set::SetKey; +use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Set, Table}; use std::ffi::{c_void, CStr}; use std::mem::size_of; use std::rc::Rc; @@ -15,10 +16,14 @@ pub fn get_operation_from_nlmsghdr_type(x: u16) -> u8 { pub const TABLE_NAME: &[u8; 10] = b"mocktable\0"; pub const CHAIN_NAME: &[u8; 10] = b"mockchain\0"; +pub const SET_NAME: &[u8; 8] = b"mockset\0"; pub const TABLE_USERDATA: &[u8; 14] = b"mocktabledata\0"; pub const CHAIN_USERDATA: &[u8; 14] = b"mockchaindata\0"; pub const RULE_USERDATA: &[u8; 13] = b"mockruledata\0"; +pub const SET_USERDATA: &[u8; 12] = b"mocksetdata\0"; + +pub const SET_ID: u32 = 123456; type NetLinkType = u16; @@ -107,8 +112,16 @@ pub fn get_test_chain() -> Chain { } pub fn get_test_rule() -> Rule { - let rule = Rule::new(Rc::new(get_test_chain())); - rule + Rule::new(Rc::new(get_test_chain())) +} + +pub fn get_test_set<'a, T: SetKey>(table: &'a Table) -> Set<'a, T> { + Set::new( + CStr::from_bytes_with_nul(SET_NAME).unwrap(), + SET_ID, + table, + ProtoFamily::Ipv4, + ) } pub fn get_test_nlmsg_with_msg_type( diff --git a/tests/set.rs b/tests/set.rs new file mode 100644 index 0000000..a357a13 --- /dev/null +++ b/tests/set.rs @@ -0,0 +1,68 @@ +mod sys; +use std::net::{Ipv4Addr, Ipv6Addr}; + +use rustables::{set::SetKey, MsgType}; +use sys::*; + +mod lib; +use lib::*; + +#[test] +fn new_empty_set() { + let table = get_test_table(); + let mut set = get_test_set::<Ipv4Addr>(&table); + 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 table = get_test_table(); + let mut set = get_test_set::<Ipv6Addr>(&table); + 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() + ); +} |