Skip to content

Commit 2f3d7ef

Browse files
committed
wrap new facilities in ipc feature
1 parent d01cd32 commit 2f3d7ef

File tree

3 files changed

+57
-30
lines changed

3 files changed

+57
-30
lines changed

Cargo.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ description = "Network simulator."
1010
license = "MIT"
1111
repository = "https://github.com/ipfs-rust/netsim-embed"
1212

13+
[features]
14+
ipc = ["dep:libtest-mimic", "dep:anyhow", "dep:ipc-channel"]
15+
1316
[dependencies]
17+
anyhow = { version = "1.0.40", optional = true }
1418
async-global-executor = "2.0.2"
1519
async-process = "1.0.2"
1620
dlopen = "0.1.8"
1721
futures = "0.3.13"
18-
ipc-channel = "0.16.0"
22+
ipc-channel = { version = "0.16.0", optional = true }
1923
libpacket = "0.1.0"
24+
libtest-mimic = { version = "0.6.0", optional = true }
2025
log = "0.4.14"
2126
netsim-embed-core = { version = "0.4.2", path = "core" }
2227
netsim-embed-machine = { version = "0.6.1", path = "machine" }
@@ -32,11 +37,11 @@ async-trait = "0.1.50"
3237
env_logger = "0.8.3"
3338
if-watch = "0.2.2"
3439
ipnet = "2.3.0"
35-
libtest-mimic = "0.6.0"
3640
netsim-embed-cli = { path = "cli" }
3741
udp-socket = "0.1.1"
3842

3943
[[test]]
4044
name = "smoke_test"
4145
path = "tests/smoke_test.rs"
4246
harness = false
47+
required-features = ["ipc"]

src/lib.rs

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use async_process::Command;
22
use dlopen::raw::AddressInfoObtainer;
33
use futures::prelude::*;
4-
use ipc_channel::ipc::{IpcOneShotServer, IpcReceiver, IpcSender};
54
pub use libpacket::*;
65
use netsim_embed_core::*;
76
pub use netsim_embed_core::{DelayBuffer, Ipv4Range, Protocol};
@@ -73,12 +72,13 @@ where
7372
&mut self.machines
7473
}
7574

75+
#[cfg(feature = "ipc")]
7676
pub async fn spawn<T: 'static + Send>(
7777
&mut self,
78-
function: fn(IpcReceiver<T>),
79-
) -> (MachineId, IpcSender<T>) {
78+
function: fn(ipc_channel::ipc::IpcReceiver<T>),
79+
) -> (MachineId, ipc_channel::ipc::IpcSender<T>) {
8080
let name = get_fn_name(function);
81-
let (server, server_name) = IpcOneShotServer::new().unwrap();
81+
let (server, server_name) = ipc_channel::ipc::IpcOneShotServer::new().unwrap();
8282
let mut command = Command::new(std::env::current_exe().unwrap());
8383
command.args(["--netsim-embed-internal-call", &name, &server_name]);
8484
let machine = self.spawn_machine(command, None).await;
@@ -205,7 +205,8 @@ where
205205
}
206206
}
207207

208-
pub fn get_fn_name<T>(function: fn(IpcReceiver<T>)) -> String {
208+
#[cfg(feature = "ipc")]
209+
pub fn get_fn_name<T>(function: fn(ipc_channel::ipc::IpcReceiver<T>)) -> String {
209210
let info = AddressInfoObtainer::new()
210211
.obtain(function as *const ())
211212
.expect("look up existing function pointer");
@@ -269,8 +270,9 @@ pub struct NatConfig {
269270
/// println!("cargo:rustc-link-arg-tests=-rdynamic");
270271
/// }
271272
/// ```
273+
#[cfg(feature = "ipc")]
272274
#[macro_export]
273-
macro_rules! dispatch_args {
275+
macro_rules! declare_machines {
274276
( $($fn:path),* ) => {{
275277
let mut args = std::env::args();
276278
args.next();
@@ -279,8 +281,8 @@ macro_rules! dispatch_args {
279281
let server_name = args.next().unwrap();
280282
$(
281283
if function == $crate::get_fn_name($fn) {
282-
let (sender, receiver) = ipc_channel::ipc::channel().unwrap();
283-
let server_sender = ipc_channel::ipc::IpcSender::connect(server_name).unwrap();
284+
let (sender, receiver) = $crate::test_util::ipc::channel().unwrap();
285+
let server_sender = $crate::test_util::ipc::IpcSender::connect(server_name).unwrap();
284286
server_sender.send(sender).unwrap();
285287
$fn(receiver);
286288
std::process::exit(0);
@@ -290,3 +292,41 @@ macro_rules! dispatch_args {
290292
}
291293
}}
292294
}
295+
296+
#[cfg(feature = "ipc")]
297+
pub mod test_util {
298+
pub struct TestResult(anyhow::Result<()>);
299+
impl TestResult {
300+
pub fn into_inner(self) -> anyhow::Result<()> {
301+
self.0
302+
}
303+
}
304+
impl From<()> for TestResult {
305+
fn from(_: ()) -> Self {
306+
Self(Ok(()))
307+
}
308+
}
309+
impl<E: std::error::Error + Send + Sync + 'static> From<Result<(), E>> for TestResult {
310+
fn from(res: Result<(), E>) -> Self {
311+
Self(res.map_err(Into::into))
312+
}
313+
}
314+
pub use ipc_channel::ipc;
315+
pub use libtest_mimic::{run, Arguments, Trial};
316+
}
317+
318+
#[cfg(feature = "ipc")]
319+
#[macro_export]
320+
macro_rules! run_tests {
321+
( $($fn:path),* ) => {{
322+
$crate::unshare_user().unwrap();
323+
let args = $crate::test_util::Arguments::from_args();
324+
let tests = vec![
325+
$($crate::test_util::Trial::test(stringify!($fn), || {
326+
$crate::test_util::TestResult::from($fn()).into_inner()?;
327+
Ok(())
328+
})),*
329+
];
330+
$crate::test_util::run(&args, tests).exit();
331+
}};
332+
}

tests/smoke_test.rs

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,6 @@ fn one_plus_one_makes_two() {
4343
}
4444

4545
fn main() {
46-
netsim_embed::dispatch_args!(send_one, add);
47-
netsim_embed::unshare_user().unwrap();
48-
let args = libtest_mimic::Arguments::from_args();
49-
let mktest = |f: fn()| {
50-
move || {
51-
f();
52-
Ok(())
53-
}
54-
};
55-
libtest_mimic::run(
56-
&args,
57-
vec![
58-
libtest_mimic::Trial::test("can_send_one", mktest(can_send_one)),
59-
libtest_mimic::Trial::test("one_plus_one_makes_two", || {
60-
one_plus_one_makes_two();
61-
Ok(())
62-
}),
63-
],
64-
)
65-
.exit();
46+
netsim_embed::declare_machines!(send_one, add);
47+
netsim_embed::run_tests!(can_send_one, one_plus_one_makes_two);
6648
}

0 commit comments

Comments
 (0)