From b637dd7b4e2e8fccdfe212eb3e94bd5e2f6cd09e Mon Sep 17 00:00:00 2001 From: Daniel Mueller Date: Sat, 19 Jan 2019 16:23:40 -0800 Subject: Add tests for the storage command This change adds two tests for the storage command. The first one verifies that a proper error message is emitted if a storage command is attempted on a Pro device. The second one checks the output of the status subcommand and expected changes to it when opening or closing the encrypted volume. --- nitrocli/src/tests/mod.rs | 1 + nitrocli/src/tests/storage.rs | 93 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 nitrocli/src/tests/storage.rs diff --git a/nitrocli/src/tests/mod.rs b/nitrocli/src/tests/mod.rs index 1f30e22..a3855f8 100644 --- a/nitrocli/src/tests/mod.rs +++ b/nitrocli/src/tests/mod.rs @@ -42,6 +42,7 @@ mod pin; mod pws; mod run; mod status; +mod storage; /// A trait simplifying checking for expected errors. pub trait UnwrapError { diff --git a/nitrocli/src/tests/storage.rs b/nitrocli/src/tests/storage.rs new file mode 100644 index 0000000..d017f34 --- /dev/null +++ b/nitrocli/src/tests/storage.rs @@ -0,0 +1,93 @@ +// storage.rs + +// ************************************************************************* +// * Copyright (C) 2019 Daniel Mueller (deso@posteo.net) * +// * * +// * This program is free software: you can redistribute it and/or modify * +// * it under the terms of the GNU General Public License as published by * +// * the Free Software Foundation, either version 3 of the License, or * +// * (at your option) any later version. * +// * * +// * This program is distributed in the hope that it will be useful, * +// * but WITHOUT ANY WARRANTY; without even the implied warranty of * +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +// * GNU General Public License for more details. * +// * * +// * You should have received a copy of the GNU General Public License * +// * along with this program. If not, see . * +// ************************************************************************* + +use super::*; + +#[test_device] +fn status_on_pro(device: nitrokey::Pro) { + let res = Nitrocli::with_dev(device).handle(&["storage", "status"]); + assert_eq!( + res.unwrap_str_err(), + "This command is only available on the Nitrokey Storage", + ); +} + +#[test_device] +fn status_open_close(device: nitrokey::Storage) -> crate::Result<()> { + fn make_re(open: Option) -> regex::Regex { + let encrypted = match open { + Some(open) => { + if open { + "active" + } else { + "(read-only|inactive)" + } + } + None => "(read-only|active|inactive)", + }; + let re = format!( + r#"^Status: + SD card ID: 0x[[:xdigit:]]{{8}} + firmware: (un)?locked + storage keys: (not )?created + volumes: + unencrypted: (read-only|active|inactive) + encrypted: {} + hidden: (read-only|active|inactive) +$"#, + encrypted + ); + regex::Regex::new(&re).unwrap() + } + + let mut ncli = Nitrocli::with_dev(device); + let out = ncli.handle(&["storage", "status"])?; + assert!(make_re(None).is_match(&out), out); + + let _ = ncli.handle(&["storage", "open"])?; + let out = ncli.handle(&["storage", "status"])?; + assert!(make_re(Some(true)).is_match(&out), out); + + let _ = ncli.handle(&["storage", "close"])?; + let out = ncli.handle(&["storage", "status"])?; + assert!(make_re(Some(false)).is_match(&out), out); + + Ok(()) +} + +#[test_device] +fn encrypted_open_close(device: nitrokey::Storage) -> crate::Result<()> { + let mut ncli = Nitrocli::with_dev(device); + let out = ncli.handle(&["storage", "open"])?; + assert!(out.is_empty()); + + let device = nitrokey::Storage::connect()?; + assert!(device.get_status()?.encrypted_volume.active); + assert!(!device.get_status()?.hidden_volume.active); + drop(device); + + let out = ncli.handle(&["storage", "close"])?; + assert!(out.is_empty()); + + let device = nitrokey::Storage::connect()?; + assert!(!device.get_status()?.encrypted_volume.active); + assert!(!device.get_status()?.hidden_volume.active); + + Ok(()) +} -- cgit v1.2.1