From c74b8b3ea8dc4fe7c6891ae120540f8da5623227 Mon Sep 17 00:00:00 2001
From: Robin Krahl <robin.krahl@ireas.org>
Date: Sun, 29 Dec 2019 12:51:28 +0100
Subject: Add list_devices function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This patch adds support for libnitrokey’s NK_list_devices function by
introducing the top-level list_devices function.  It returns a vector of
DeviceInfo structs with information about all connected Nitrokey
devices.
---
 tests/device.rs | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

(limited to 'tests')

diff --git a/tests/device.rs b/tests/device.rs
index e367558..5e60002 100644
--- a/tests/device.rs
+++ b/tests/device.rs
@@ -8,8 +8,8 @@ use std::process::Command;
 use std::{thread, time};
 
 use nitrokey::{
-    Authenticate, CommandError, CommunicationError, Config, ConfigureOtp, Device, Error,
-    GenerateOtp, GetPasswordSafe, LibraryError, OtpMode, OtpSlotData, Storage, VolumeMode,
+    Authenticate, CommandError, CommunicationError, Config, ConfigureOtp, Device, DeviceInfo,
+    Error, GenerateOtp, GetPasswordSafe, LibraryError, OtpMode, OtpSlotData, Storage, VolumeMode,
     DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN,
 };
 use nitrokey_test::test as test_device;
@@ -31,6 +31,33 @@ fn count_nitrokey_block_devices() -> usize {
         .count()
 }
 
+#[test_device]
+fn list_no_devices() {
+    let devices = nitrokey::list_devices();
+    assert_ok!(Vec::<DeviceInfo>::new(), devices);
+}
+
+#[test_device]
+fn list_devices(_device: DeviceWrapper) {
+    let devices = unwrap_ok!(nitrokey::list_devices());
+    for device in devices {
+        assert!(!device.path.is_empty());
+        if let Some(model) = device.model {
+            match model {
+                nitrokey::Model::Pro => {
+                    assert!(device.serial_number.is_some());
+                    let serial_number = device.serial_number.unwrap();
+                    assert!(!serial_number.is_empty());
+                    assert_valid_serial_number(&serial_number);
+                },
+                nitrokey::Model::Storage => {
+                    assert_eq!(None, device.serial_number);
+                },
+            }
+        }
+    }
+}
+
 #[test_device]
 fn connect_no_device() {
     let mut manager = unwrap_ok!(nitrokey::take());
@@ -83,12 +110,17 @@ fn disconnect(device: DeviceWrapper) {
     assert_empty_serial_number();
 }
 
+fn assert_valid_serial_number(serial_number: &str) {
+    assert!(serial_number.is_ascii());
+    assert!(serial_number.chars().all(|c| c.is_ascii_hexdigit()));
+}
+
 #[test_device]
 fn get_serial_number(device: DeviceWrapper) {
     let serial_number = unwrap_ok!(device.get_serial_number());
-    assert!(serial_number.is_ascii());
-    assert!(serial_number.chars().all(|c| c.is_ascii_hexdigit()));
+    assert_valid_serial_number(&serial_number);
 }
+
 #[test_device]
 fn get_firmware_version(device: Pro) {
     let version = unwrap_ok!(device.get_firmware_version());
-- 
cgit v1.2.3