keyfork/keyfork-seed/src/tests.rs

92 lines
3.4 KiB
Rust
Raw Normal View History

2023-09-12 04:00:30 +00:00
use crate::client::Client;
use hex_literal::hex;
2023-09-12 06:36:05 +00:00
use keyfork_derive_util::{request::*, DerivationPath, DerivationIndex, ExtendedPrivateKey};
use std::sync::mpsc::channel;
use std::{os::unix::net::UnixStream, str::FromStr};
use tempdir::TempDir;
use tokio::runtime::Builder;
#[test]
fn it_works() {
// Test literals taken from keyfork-derive-util.
2023-09-12 04:00:30 +00:00
// Setup
let entropy = &hex!("000102030405060708090a0b0c0d0e0f")[..];
let mnemonic = keyforkd::Mnemonic::from_entropy(entropy, Default::default()).unwrap();
let rt = Builder::new_multi_thread().enable_io().build().unwrap();
let tempdir = TempDir::new("keyfork-seed").unwrap();
let socket_path = tempdir.path().join("keyforkd.sock");
2023-09-12 04:00:30 +00:00
let (tx, rx) = channel();
let handle = rt.spawn({
let socket_path = socket_path.clone();
async move {
2023-09-12 04:00:30 +00:00
let mut server = keyforkd::UnixServer::bind(&socket_path).unwrap();
// Connections can be pending for a few seconds, so signal to the main
// test we're ready to start accepting.
tx.send(()).unwrap();
let service = keyforkd::ServiceBuilder::new()
.layer(keyforkd::middleware::BincodeLayer::new())
.service(keyforkd::Keyforkd::new(mnemonic));
server.run(service).await.unwrap();
}
});
2023-09-12 04:00:30 +00:00
rx.recv().unwrap();
let socket = UnixStream::connect(&socket_path).unwrap();
let mut client = Client::new(socket);
let req = DerivationRequest::new(
DerivationAlgorithm::Ed25519,
DerivationPath::from_str("m/0'/1'/2'/2'/1000000000'").unwrap(),
);
2023-09-12 04:00:30 +00:00
let response = client.request(&req).unwrap();
assert_eq!(
response.data,
hex!("8f94d394a8e8fd6b1bc2f3f49f5c47e385281d5c17e65324b0f62483e37e8793")
);
handle.abort();
}
2023-09-12 06:36:05 +00:00
#[test]
fn misc_multi_requests() {
// Setup
let entropy = &hex!("000102030405060708090a0b0c0d0e0f")[..];
let mnemonic = keyforkd::Mnemonic::from_entropy(entropy, Default::default()).unwrap();
let rt = Builder::new_multi_thread().enable_io().build().unwrap();
let tempdir = TempDir::new("keyfork-seed").unwrap();
let socket_path = tempdir.path().join("keyforkd.sock");
let (tx, rx) = channel();
let handle = rt.spawn({
let socket_path = socket_path.clone();
async move {
let mut server = keyforkd::UnixServer::bind(&socket_path).unwrap();
// Connections can be pending for a few seconds, so signal to the main
// test we're ready to start accepting.
tx.send(()).unwrap();
let service = keyforkd::ServiceBuilder::new()
.layer(keyforkd::middleware::BincodeLayer::new())
.service(keyforkd::Keyforkd::new(mnemonic));
server.run(service).await.unwrap();
}
});
rx.recv().unwrap();
let socket = UnixStream::connect(&socket_path).unwrap();
let mut client = Client::new(socket);
let req = DerivationRequest::new(
DerivationAlgorithm::Ed25519,
DerivationPath::from_str("m/7366512'/0'").unwrap(),
);
let response = client.request(&req).unwrap();
let key = ExtendedPrivateKey::<ed25519_dalek::SigningKey>::new_from_parts(
&response.data,
response.depth,
response.chain_code,
).unwrap();
for i in 0..255 {
key.derive_child(&DerivationIndex::new(i, true).unwrap()).unwrap();
}
handle.abort();
}