diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-06-08 14:57:56 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-07-03 10:53:20 -0300 |
| commit | e2ab0eba4f7098eecb77a3494010f39b9d015a67 (patch) | |
| tree | b1aa5536ab1b8f51f597c38eec3730802a3da0cb /mullvad-tests/tests | |
| parent | 88f9f4ced3c3245c0c0f3a1d10f87bb05b8ecd1b (diff) | |
| download | mullvadvpn-e2ab0eba4f7098eecb77a3494010f39b9d015a67.tar.xz mullvadvpn-e2ab0eba4f7098eecb77a3494010f39b9d015a67.zip | |
Refactor file notification monitoring in tests
Create a `PathWatcher` helper type that presents itself as an `Iterator`
over events on a specified path. It also allows setting a timeout for
waiting for each event, so that it doesn't block indefinately.
Although it watches a specific path, in reality it watches the path's
parent directory, so that it can continue watching the file if it gets
removed and recreated.
Diffstat (limited to 'mullvad-tests/tests')
| -rw-r--r-- | mullvad-tests/tests/connection.rs | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/mullvad-tests/tests/connection.rs b/mullvad-tests/tests/connection.rs index 91a110fd8a..7ae5efca21 100644 --- a/mullvad-tests/tests/connection.rs +++ b/mullvad-tests/tests/connection.rs @@ -10,7 +10,7 @@ use std::sync::mpsc; use std::time::Duration; use mullvad_tests::mock_openvpn::search_openvpn_args; -use mullvad_tests::{wait_for_file_write_finish, DaemonRunner, MockOpenVpnPluginRpcClient}; +use mullvad_tests::{watch_event, DaemonRunner, MockOpenVpnPluginRpcClient, PathWatcher}; use mullvad_types::states::{DaemonState, SecurityState, TargetState}; #[cfg(target_os = "linux")] @@ -44,15 +44,14 @@ fn spawns_openvpn() { let mut daemon = DaemonRunner::spawn(); let mut rpc_client = daemon.rpc_client().unwrap(); let openvpn_args_file = daemon.mock_openvpn_args_file(); + let mut openvpn_args_file_events = PathWatcher::watch(&openvpn_args_file).unwrap(); assert!(!openvpn_args_file.exists()); rpc_client.set_account(Some("123456".to_owned())).unwrap(); rpc_client.connect().unwrap(); - wait_for_file_write_finish(&openvpn_args_file, Duration::from_secs(5)); - - assert!(openvpn_args_file.exists()); + openvpn_args_file_events.assert_create_write_close_sequence(); } #[test] @@ -60,20 +59,22 @@ fn respawns_openvpn_if_it_crashes() { let mut daemon = DaemonRunner::spawn(); let mut rpc_client = daemon.rpc_client().unwrap(); let openvpn_args_file = daemon.mock_openvpn_args_file(); + let mut openvpn_args_file_events = PathWatcher::watch(&openvpn_args_file).unwrap(); + + openvpn_args_file_events.set_timeout(Duration::from_secs(10)); assert!(!openvpn_args_file.exists()); rpc_client.set_account(Some("123456".to_owned())).unwrap(); rpc_client.connect().unwrap(); - wait_for_file_write_finish(&openvpn_args_file, Duration::from_secs(5)); + openvpn_args_file_events.assert_create_write_close_sequence(); // Stop OpenVPN by removing the mock OpenVPN arguments file fs::remove_file(&openvpn_args_file).expect("Failed to remove the mock OpenVPN arguments file"); + assert_eq!(openvpn_args_file_events.next(), Some(watch_event::REMOVE)); - wait_for_file_write_finish(&openvpn_args_file, Duration::from_secs(5)); - - assert!(openvpn_args_file.exists()); + openvpn_args_file_events.assert_create_write_close_sequence(); } #[test] @@ -189,12 +190,14 @@ fn returns_to_connecting_state() { let mut daemon = DaemonRunner::spawn(); let mut rpc_client = daemon.rpc_client().unwrap(); let openvpn_args_file = daemon.mock_openvpn_args_file(); + let mut openvpn_args_file_events = PathWatcher::watch(&openvpn_args_file).unwrap(); let state_events = rpc_client.new_state_subscribe().unwrap(); rpc_client.set_account(Some("123456".to_owned())).unwrap(); rpc_client.connect().unwrap(); assert_state_event(&state_events, CONNECTING_STATE); + openvpn_args_file_events.assert_create_write_close_sequence(); let mut mock_plugin_client = create_mock_openvpn_plugin_client(openvpn_args_file); @@ -206,7 +209,8 @@ fn returns_to_connecting_state() { mock_plugin_client.route_predown().unwrap(); // Wait for new OpenVPN instance - wait_for_file_write_finish(&openvpn_args_file, Duration::from_secs(5)); + assert_eq!(openvpn_args_file_events.next(), Some(watch_event::REMOVE)); + openvpn_args_file_events.assert_create_write_close_sequence(); assert_state_event(&state_events, CONNECTING_STATE); assert_eq!(rpc_client.get_state().unwrap(), CONNECTING_STATE); @@ -265,7 +269,10 @@ fn create_mock_openvpn_plugin_client<P: AsRef<Path>>( fn get_plugin_arguments<P: AsRef<Path>>(openvpn_args_file_path: P) -> (String, String) { let args_file_path = openvpn_args_file_path.as_ref(); - wait_for_file_write_finish(&args_file_path, Duration::from_secs(5)); + if !args_file_path.exists() { + let _wait_for_args_file = PathWatcher::watch(&args_file_path) + .map(|mut events| events.find(|&event| event == watch_event::CLOSE_WRITE)); + } let mut arguments = search_openvpn_args(&args_file_path, OPENVPN_PLUGIN_NAME).skip(1); |
