summaryrefslogtreecommitdiffhomepage
path: root/mullvad-tests/tests
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-06-08 14:57:56 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-07-03 10:53:20 -0300
commite2ab0eba4f7098eecb77a3494010f39b9d015a67 (patch)
treeb1aa5536ab1b8f51f597c38eec3730802a3da0cb /mullvad-tests/tests
parent88f9f4ced3c3245c0c0f3a1d10f87bb05b8ecd1b (diff)
downloadmullvadvpn-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.rs27
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);