diff options
| -rw-r--r-- | nitrocli/src/tests/mod.rs | 13 | ||||
| -rw-r--r-- | nitrocli/src/tests/pin.rs | 64 | 
2 files changed, 77 insertions, 0 deletions
| diff --git a/nitrocli/src/tests/mod.rs b/nitrocli/src/tests/mod.rs index 4e25091..ef8d2bd 100644 --- a/nitrocli/src/tests/mod.rs +++ b/nitrocli/src/tests/mod.rs @@ -36,6 +36,7 @@ const NITROKEY_DEFAULT_USER_PIN: &str = "123456";  #[test_device]  fn dummy() {} +mod pin;  mod run;  mod status; @@ -92,6 +93,14 @@ impl Nitrocli {      result    } +  pub fn user_pin(&mut self, pin: impl Into<ffi::OsString>) { +    self.user_pin = Some(pin.into()) +  } + +  pub fn new_user_pin(&mut self, pin: impl Into<ffi::OsString>) { +    self.new_user_pin = Some(pin.into()) +  } +    fn model_to_arg(model: nitrokey::Model) -> &'static str {      match model {        nitrokey::Model::Pro => "--model=pro", @@ -136,4 +145,8 @@ impl Nitrocli {      let (res, out, _) = self.do_run(args, |c, a| crate::args::handle_arguments(c, a));      res.map(|_| String::from_utf8_lossy(&out).into_owned())    } + +  pub fn model(&self) -> Option<nitrokey::Model> { +    self.model +  }  } diff --git a/nitrocli/src/tests/pin.rs b/nitrocli/src/tests/pin.rs new file mode 100644 index 0000000..fe61b2d --- /dev/null +++ b/nitrocli/src/tests/pin.rs @@ -0,0 +1,64 @@ +// pin.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 <http://www.gnu.org/licenses/>. * +// ************************************************************************* + +use nitrokey::Authenticate; +use nitrokey::Device; + +use super::*; + +#[test_device] +fn unblock(device: nitrokey::DeviceWrapper) -> crate::Result<()> { +  let (device, err) = device.authenticate_user("wrong-pin").unwrap_err(); +  assert_eq!(err, nitrokey::CommandError::WrongPassword); +  assert!(device.get_user_retry_count() < 3); + +  let model = device.get_model(); +  let _ = Nitrocli::with_dev(device).handle(&["pin", "unblock"])?; +  let device = nitrokey::connect_model(model)?; +  assert_eq!(device.get_user_retry_count(), 3); +  Ok(()) +} + +#[test_device] +fn set_user(device: nitrokey::DeviceWrapper) -> crate::Result<()> { +  let mut ncli = Nitrocli::with_dev(device); + +  // Set a new user PIN. +  ncli.new_user_pin("new-pin"); +  let out = ncli.handle(&["pin", "set", "user"])?; +  assert!(out.is_empty()); + +  let device = nitrokey::connect_model(ncli.model().unwrap())?; +  let (device, err) = device +    .authenticate_user(NITROKEY_DEFAULT_USER_PIN) +    .unwrap_err(); +  assert_eq!(err, nitrokey::CommandError::WrongPassword); +  drop(device); + +  // Revert to the default user PIN. +  ncli.user_pin("new-pin"); +  ncli.new_user_pin(NITROKEY_DEFAULT_USER_PIN); + +  let out = ncli.handle(&["pin", "set", "user"])?; +  assert!(out.is_empty()); + +  let device = nitrokey::connect_model(ncli.model().unwrap())?; +  let _ = device.authenticate_user(NITROKEY_DEFAULT_USER_PIN).unwrap(); +  Ok(()) +} | 
