summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-03-16 16:08:53 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-04-11 06:35:07 -0300
commit89774b59c63cd82dd2b4b27112c399159c891815 (patch)
treed64015cbfe439295e6d1d9e6194ca279385ea816
parent78239aa18952d2aebdba7042d7dba2c9d501589a (diff)
downloadmullvadvpn-89774b59c63cd82dd2b4b27112c399159c891815.tar.xz
mullvadvpn-89774b59c63cd82dd2b4b27112c399159c891815.zip
Test `CachedDnsResolver`
-rw-r--r--Cargo.lock1
-rw-r--r--mullvad-rpc/Cargo.toml3
-rw-r--r--mullvad-rpc/src/cached_dns_resolver.rs83
3 files changed, 87 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 57a56e2d99..1ae167fb80 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -675,6 +675,7 @@ dependencies = [
"mullvad-types 0.1.0",
"native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
]
diff --git a/mullvad-rpc/Cargo.toml b/mullvad-rpc/Cargo.toml
index f243e76baa..b76062a226 100644
--- a/mullvad-rpc/Cargo.toml
+++ b/mullvad-rpc/Cargo.toml
@@ -19,3 +19,6 @@ native-tls = "0.1"
log = "0.4"
mullvad-types = { path = "../mullvad-types" }
+
+[dev-dependencies]
+tempdir = "0.3"
diff --git a/mullvad-rpc/src/cached_dns_resolver.rs b/mullvad-rpc/src/cached_dns_resolver.rs
index 9cf341de69..6677046048 100644
--- a/mullvad-rpc/src/cached_dns_resolver.rs
+++ b/mullvad-rpc/src/cached_dns_resolver.rs
@@ -61,3 +61,86 @@ impl CachedDnsResolver {
writeln!(cache_file, "{}", address)
}
}
+
+#[cfg(test)]
+mod tests {
+ extern crate tempdir;
+
+ use std::fs::{self, File};
+ use std::io::{Read, Write};
+
+ use self::tempdir::TempDir;
+ use super::*;
+
+ #[test]
+ fn uses_cached_address() {
+ let (_temp_dir, cache_dir) = create_test_dirs();
+ let cached_address = "127.0.0.1".parse().unwrap();
+
+ write_address(&cache_dir, cached_address);
+
+ let cache = create_cached_dns_resolver(&cache_dir);
+ let address = cache.resolve().unwrap();
+
+ assert_eq!(address, cached_address);
+ }
+
+ #[test]
+ fn caches_resolved_ip() {
+ let (_temp_dir, cache_dir) = create_test_dirs();
+ let cache = create_cached_dns_resolver(&cache_dir);
+
+ let address = cache.resolve().unwrap();
+
+ assert_eq!(get_cached_address(&cache_dir), address.to_string());
+ }
+
+ #[test]
+ fn resolves_even_if_impossible_to_store_in_cache() {
+ let (temp_dir, cache_dir) = create_test_dirs();
+ let cache = create_cached_dns_resolver(&cache_dir);
+
+ ::std::mem::drop(temp_dir);
+
+ assert!(cache.resolve().is_some());
+ }
+
+ fn create_test_dirs() -> (TempDir, PathBuf) {
+ let temp_dir = TempDir::new("ip-cache-test").unwrap();
+ let cache_dir = temp_dir.path().join("cache");
+
+ fs::create_dir(&cache_dir).unwrap();
+
+ (temp_dir, cache_dir)
+ }
+
+ fn write_address(dir: &Path, address: IpAddr) -> PathBuf {
+ let file_path = dir.join("api_ip_address.txt");
+ let mut file = File::create(&file_path).unwrap();
+
+ writeln!(file, "{}", address).unwrap();
+
+ file_path
+ }
+
+ fn get_cached_address(cache_dir: &Path) -> String {
+ let cache_file_path = cache_dir.join("api_ip_address.txt");
+
+ assert!(cache_file_path.exists());
+
+ let mut cache_file = File::open(cache_file_path).unwrap();
+ let mut cached_address = String::new();
+
+ cache_file.read_to_string(&mut cached_address).unwrap();
+
+ cached_address.trim().to_string()
+ }
+
+ fn create_cached_dns_resolver(cache_dir: &Path) -> CachedDnsResolver {
+ let hostname = "api.mullvad.net".to_owned();
+ let filename = "api_ip_address.txt";
+ let cache_file = cache_dir.join(filename);
+
+ CachedDnsResolver::new(hostname, cache_file)
+ }
+}