diff options
author | Simone Robutti <simone.robutti@protonmail.com> | 2020-01-04 17:29:29 +0100 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2020-01-04 17:29:29 +0100 |
commit | 90480ada7c9d2025962e030b2a28b3f785489c9e (patch) | |
tree | 0ff7df9a5a3f44fb3cadab440bf331623069bfe7 | |
parent | d69206d0b04618bde098a17b12dffb54ce749569 (diff) |
refactor(tests): remove code duplications (#55)
* moved keyboard_events_to_utils
* refactored ui keyboard events
* refactored raw mod
* format
* renamed sleep events function
* refactored OsInputOutput
* refactored opts
* refactored backend first test
* refactored backend ui tests
* refactored backend raw tests
* simplified terminal events read
* format
-rw-r--r-- | src/tests/cases/mod.rs | 1 | ||||
-rw-r--r-- | src/tests/cases/raw_mode.rs | 584 | ||||
-rw-r--r-- | src/tests/cases/test_utils.rs | 116 | ||||
-rw-r--r-- | src/tests/cases/ui.rs | 909 |
4 files changed, 316 insertions, 1294 deletions
diff --git a/src/tests/cases/mod.rs b/src/tests/cases/mod.rs index 87c141b..91dee6a 100644 --- a/src/tests/cases/mod.rs +++ b/src/tests/cases/mod.rs @@ -1,2 +1,3 @@ pub mod raw_mode; +pub mod test_utils; pub mod ui; diff --git a/src/tests/cases/raw_mode.rs b/src/tests/cases/raw_mode.rs index 93c2afa..b2d6d64 100644 --- a/src/tests/cases/raw_mode.rs +++ b/src/tests/cases/raw_mode.rs @@ -1,11 +1,7 @@ -use crate::tests::fakes::{ - create_fake_dns_client, create_fake_on_winch, get_interfaces, get_open_sockets, KeyboardEvents, - NetworkFrames, TestBackend, -}; +use crate::tests::fakes::{create_fake_dns_client, NetworkFrames}; use ::insta::assert_snapshot; use ::std::sync::{Arc, Mutex}; -use ::termion::event::{Event, Key}; use ::std::collections::HashMap; use ::std::net::IpAddr; @@ -16,9 +12,11 @@ use pnet::datalink::DataLinkReceiver; use pnet::packet::Packet; use pnet_base::MacAddr; -use ::std::io::Write; +use crate::tests::cases::test_utils::{ + opts_raw, os_input_output_dns, os_input_output_stdout, test_backend_factory, +}; -use crate::{start, Opt, OsInputOutput}; +use crate::{start, Opt}; fn build_tcp_packet( source_ip: &str, @@ -46,26 +44,8 @@ fn format_raw_output(output: Vec<u8>) -> String { format!("{}", replaced) } -struct LogWithMirror<T> { - pub write: Arc<Mutex<T>>, - pub mirror: Arc<Mutex<T>>, -} - -impl<T> LogWithMirror<T> { - pub fn new(log: T) -> Self { - let write = Arc::new(Mutex::new(log)); - let mirror = write.clone(); - LogWithMirror { write, mirror } - } -} - #[test] fn one_packet_of_traffic() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![Some(build_tcp_packet( "10.0.0.2", "1.1.1.1", @@ -73,46 +53,10 @@ fn one_packet_of_traffic() { 12345, b"I am a fake tcp packet", ))]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -121,11 +65,6 @@ fn one_packet_of_traffic() { #[test] fn bi_directional_traffic() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "10.0.0.2", @@ -142,46 +81,10 @@ fn bi_directional_traffic() { b"I am a fake tcp download packet", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -190,11 +93,6 @@ fn bi_directional_traffic() { #[test] fn multiple_packets_of_traffic_from_different_connections() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -211,46 +109,10 @@ fn multiple_packets_of_traffic_from_different_connections() { b"I come from 2.2.2.2", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - on_winch, - cleanup, - keyboard_events, - dns_client, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -259,11 +121,6 @@ fn multiple_packets_of_traffic_from_different_connections() { #[test] fn multiple_packets_of_traffic_from_single_connection() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -280,46 +137,10 @@ fn multiple_packets_of_traffic_from_single_connection() { b"I've come from 1.1.1.1 too!", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -328,11 +149,6 @@ fn multiple_packets_of_traffic_from_single_connection() { #[test] fn one_process_with_multiple_connections() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -349,46 +165,10 @@ fn one_process_with_multiple_connections() { b"Funny that, I'm from 3.3.3.3", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -397,11 +177,6 @@ fn one_process_with_multiple_connections() { #[test] fn multiple_processes_with_multiple_connections() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -432,46 +207,10 @@ fn multiple_processes_with_multiple_connections() { b"I'm partial to 4.4.4.4", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -480,11 +219,6 @@ fn multiple_processes_with_multiple_connections() { #[test] fn multiple_connections_from_remote_address() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -501,46 +235,11 @@ fn multiple_connections_from_remote_address() { b"Me too, but on a different port", )), ]) as Box<dyn DataLinkReceiver>]; + let (_, _, backend) = test_backend_factory(190, 50); - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 2, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -549,12 +248,6 @@ fn multiple_connections_from_remote_address() { #[test] fn sustained_traffic_from_one_process() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -572,46 +265,11 @@ fn sustained_traffic_from_one_process() { b"Same here, but one second later", )), ]) as Box<dyn DataLinkReceiver>]; + let (_, _, backend) = test_backend_factory(190, 50); - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 3, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -620,12 +278,6 @@ fn sustained_traffic_from_one_process() { #[test] fn sustained_traffic_from_multiple_processes() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "1.1.1.1", @@ -657,46 +309,11 @@ fn sustained_traffic_from_multiple_processes() { b"I come 3.3.3.3 one second later", )), ]) as Box<dyn DataLinkReceiver>]; + let (_, _, backend) = test_backend_factory(190, 50); - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_stdout(network_frames, 3, Some(stdout.clone())); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -705,12 +322,6 @@ fn sustained_traffic_from_multiple_processes() { #[test] fn sustained_traffic_from_multiple_processes_bi_directional() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "10.0.0.2", @@ -770,46 +381,11 @@ fn sustained_traffic_from_multiple_processes_bi_directional() { b"10.0.0.2 forever!", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); + let (_, _, backend) = test_backend_factory(190, 50); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); + let os_input = os_input_output_stdout(network_frames, 3, Some(stdout.clone())); - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -818,12 +394,6 @@ fn sustained_traffic_from_multiple_processes_bi_directional() { #[test] fn traffic_with_host_names() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "10.0.0.2", @@ -883,19 +453,7 @@ fn traffic_with_host_names() { b"10.0.0.2 forever!", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); + let (_, _, backend) = test_backend_factory(190, 50); let mut ips_to_hostnames = HashMap::new(); ips_to_hostnames.insert( IpAddr::V4("1.1.1.1".parse().unwrap()), @@ -910,32 +468,9 @@ fn traffic_with_host_names() { String::from("i-like-cheese.com"), ); let dns_client = create_fake_dns_client(ips_to_hostnames); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: true, - no_resolve: false, - }; + let os_input = os_input_output_dns(network_frames, 3, Some(stdout.clone()), dns_client); + let opts = opts_raw(); start(backend, os_input, opts); let stdout = Arc::try_unwrap(stdout).unwrap().into_inner().unwrap(); let formatted = format_raw_output(stdout); @@ -944,12 +479,6 @@ fn traffic_with_host_names() { #[test] fn no_resolve_mode() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - None, // sleep - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ Some(build_tcp_packet( "10.0.0.2", @@ -1009,19 +538,7 @@ fn no_resolve_mode() { b"10.0.0.2 forever!", )), ]) as Box<dyn DataLinkReceiver>]; - - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); + let (_, _, backend) = test_backend_factory(190, 50); let mut ips_to_hostnames = HashMap::new(); ips_to_hostnames.insert( IpAddr::V4("1.1.1.1".parse().unwrap()), @@ -1035,28 +552,9 @@ fn no_resolve_mode() { IpAddr::V4("10.0.0.2".parse().unwrap()), String::from("i-like-cheese.com"), ); - let dns_client = None; - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); - let stdout = Arc::new(Mutex::new(Vec::new())); - let write_to_stdout = Box::new({ - let stdout = stdout.clone(); - move |output: String| { - let mut stdout = stdout.lock().unwrap(); - writeln!(&mut stdout, "{}", output).unwrap(); - } - }); - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; + let stdout = Arc::new(Mutex::new(Vec::new())); + let os_input = os_input_output_dns(network_frames, 3, Some(stdout.clone()), None); let opts = Opt { interface: Some(String::from("interface_name")), raw: true, diff --git a/src/tests/cases/test_utils.rs b/src/tests/cases/test_utils.rs new file mode 100644 index 0000000..60b0686 --- /dev/null +++ b/src/tests/cases/test_utils.rs @@ -0,0 +1,116 @@ +use crate::tests::fakes::{ + create_fake_dns_client, create_fake_on_winch, get_interfaces, get_open_sockets, KeyboardEvents, + TerminalEvent, TestBackend, +}; +use std::iter; + +use crate::network::dns::Client; +use crate::{Opt, OsInputOutput}; +use ::termion::event::{Event, Key}; +use pnet::datalink::DataLinkReceiver; +use std::collections::HashMap; +use std::io::Write; +use std::sync::{Arc, Mutex}; + +pub fn sleep_and_quit_events(sleep_num: usize) -> Box<KeyboardEvents> { + let mut events: Vec<Option<Event>> = iter::repeat(None).take(sleep_num).collect(); + events.push(Some(Event::Key(Key::Ctrl('c')))); + Box::new(KeyboardEvents::new(events)) +} + +pub fn os_input_output( + network_frames: Vec<Box<dyn DataLinkReceiver>>, + sleep_num: usize, +) -> OsInputOutput { + os_input_output_factory( + network_frames, + sleep_num, + None, + create_fake_dns_client(HashMap::new()), + ) +} +pub fn os_input_output_stdout( + network_frames: Vec<Box<dyn DataLinkReceiver>>, + sleep_num: usize, + stdout: Option<Arc<Mutex<Vec<u8>>>>, +) -> OsInputOutput { + os_input_output_factory( + network_frames, + sleep_num, + stdout, + create_fake_dns_client(HashMap::new()), + ) +} + +pub fn os_input_output_dns( + network_frames: Vec<Box<dyn DataLinkReceiver>>, + sleep_num: usize, + stdout: Option<Arc<Mutex<Vec<u8>>>>, + dns_client: Option<Client>, +) -> OsInputOutput { + os_input_output_factory(network_frames, sleep_num, stdout, dns_client) +} + +fn os_input_output_factory( + network_frames: Vec<Box<dyn DataLinkReceiver>>, + sleep_num: usize, + stdout: Option<Arc<Mutex<Vec<u8>>>>, + dns_client: Option<Client>, +) -> OsInputOutput { + let on_winch = create_fake_on_winch(false); + let cleanup = Box::new(|| {}); + + let write_to_stdout: Box<dyn FnMut(String) + Send> = match stdout { + Some(stdout) => Box::new({ + move |output: String| { + let mut stdout = stdout.lock().unwrap(); + writeln!(&mut stdout, "{}", output).unwrap(); + } + }), + None => Box::new({ move |_output: String| {} }), + }; + + OsInputOutput { + network_interfaces: get_interfaces(), + network_frames, + get_open_sockets, + keyboard_events: sleep_and_quit_events(sleep_num), + dns_client, + on_winch, + cleanup, + write_to_stdout, + } +} + +pub fn opts_raw() -> Opt { + opts_factory(true) +} + +pub fn opts_ui() -> Opt { + opts_factory(false) +} + +fn opts_factory(raw: bool) -> Opt { + Opt { + interface: Some(String::from("interface_name")), + raw, + no_resolve: false, + } +} +type BackendWithStreams = ( + Arc<Mutex<Vec<TerminalEvent>>>, + Arc<Mutex<Vec<String>>>, + TestBackend, +); +pub fn test_backend_factory(w: u16, h: u16) -> BackendWithStreams { + let terminal_events: Arc<Mutex<Vec<TerminalEvent>>> = Arc::new(Mutex::new(Vec::new())); + let terminal_draw_events: Arc<Mutex<Vec<String>>> = Arc::new(Mutex::new(Vec::new())); + + let backend = TestBackend::new( + terminal_events.clone(), + terminal_draw_events.clone(), + Arc::new(Mutex::new(w)), + Arc::new(Mutex::new(h)), + ); + (terminal_events, terminal_draw_events, backend) +} diff --git a/src/tests/cases/ui.rs b/src/tests/cases/ui.rs index b89c28d..2f1f756 100644 --- a/src/tests/cases/ui.rs +++ b/src/tests/cases/ui.rs @@ -1,16 +1,16 @@ use crate::tests::fakes::TerminalEvent::*; use crate::tests::fakes::{ - create_fake_dns_client, create_fake_on_winch, get_interfaces, get_open_sockets, KeyboardEvents, - NetworkFrames, TestBackend, + create_fake_dns_client, create_fake_on_winch, get_interfaces, get_open_sockets, NetworkFrames, }; use ::insta::assert_snapshot; -use ::std::sync::{Arc, Mutex}; -use ::termion::event::{Event, Key}; use ::std::collections::HashMap; use ::std::net::IpAddr; +use crate::tests::cases::test_utils::{ + opts_ui, os_input_output, sleep_and_quit_events, test_backend_factory, +}; use packet_builder::payload::PayloadData; use packet_builder::*; use pnet::datalink::DataLinkReceiver; @@ -37,68 +37,23 @@ fn build_tcp_packet( pkt.packet().to_vec() } -struct LogWithMirror<T> { - pub write: Arc<Mutex<T>>, - pub mirror: Arc<Mutex<T>>, -} - -impl<T> LogWithMirror<T> { - pub fn new(log: T) -> Self { - let write = Arc::new(Mutex::new(log)); - let mirror = write.clone(); - LogWithMirror { write, mirror } - } -} - #[test] fn basic_startup() { - let keyboard_events = Box::new(KeyboardEvents::new(vec![ - None, // sleep - Some(Event::Key(Key::Ctrl('c'))), - ])); let network_frames = vec![NetworkFrames::new(vec![ None, // sleep ]) as Box<dyn DataLinkReceiver>]; - let terminal_width = Arc::new(Mutex::new(190)); - let terminal_height = Arc::new(Mutex::new(50)); - let terminal_events = LogWithMirror::new(Vec::new()); - let terminal_draw_events = LogWithMirror::new(Vec::new()); - - let backend = TestBackend::new( - terminal_events.write, - terminal_draw_events.write, - terminal_width, - terminal_height, - ); - let network_interfaces = get_interfaces(); - let dns_client = create_fake_dns_client(HashMap::new()); - let on_winch = create_fake_on_winch(false); - let cleanup = Box::new(|| {}); - let write_to_stdout = Box::new({ move |_output: String| {} }); - - let os_input = OsInputOutput { - network_interfaces, - network_frames, - get_open_sockets, - keyboard_events, - dns_client, - on_winch, - cleanup, - write_to_stdout, - }; - let opts = Opt { - interface: Some(String::from("interface_name")), - raw: false, - no_resolve: false, - }; + let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); + let os_input = os_input_output(network_frames, 1); + let opts = opts_ui(); start(backend, os_input, opts); - - let terminal_events_mirror = terminal_events.mirror.lock().unwrap(); - let terminal_draw_events_mirror = terminal_draw_events.mirror.lock().unwrap(); |