Skip to content

Commit bae0469

Browse files
committed
auth: test bcs + signing roundtrip
1 parent a5d21ee commit bae0469

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

common/src/auth.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// user auth v1
22

3+
#[cfg(test)]
4+
use proptest_derive::Arbitrary;
35
use serde::{Deserialize, Serialize};
46
use thiserror::Error;
57

@@ -14,7 +16,8 @@ pub enum Error {
1416

1517
// TODO(phlip9): do we even need any signup fields?
1618
/// Sign up
17-
#[derive(Deserialize, Serialize)]
19+
#[derive(Debug, PartialEq, Deserialize, Serialize)]
20+
#[cfg_attr(test, derive(Arbitrary))]
1821
pub struct UserSignupRequest {
1922
pub display_name: Option<String>,
2023
pub email: Option<String>,
@@ -62,3 +65,19 @@ impl ed25519::Signable for UserSignupRequest {
6265
const DOMAIN_SEPARATOR_STR: &'static [u8] =
6366
b"LEXE-REALM::UserSignupRequest";
6467
}
68+
69+
#[cfg(test)]
70+
mod test {
71+
use super::*;
72+
use crate::test_utils::{assert_bcs_roundtrip, assert_signed_roundtrip};
73+
74+
#[test]
75+
fn test_user_signup_request_canonical() {
76+
assert_bcs_roundtrip::<UserSignupRequest>();
77+
}
78+
79+
#[test]
80+
fn test_user_signed_request_sign_verify() {
81+
assert_signed_roundtrip::<UserSignupRequest>();
82+
}
83+
}

common/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ pub mod sha256;
3232
pub mod shutdown;
3333
pub mod task;
3434

35+
#[cfg(test)]
36+
pub mod test_utils;
37+
3538
/// Assert at compile time that two `usize` values are equal. This assert has a
3639
/// nice benefit where there compiler error will actually _print out_ the
3740
/// two values.

common/src/test_utils.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use proptest::arbitrary::Arbitrary;
2+
use proptest::proptest;
3+
use serde::de::DeserializeOwned;
4+
use serde::Serialize;
5+
6+
use crate::ed25519;
7+
8+
pub fn assert_bcs_roundtrip<T>()
9+
where
10+
T: Arbitrary + PartialEq + Serialize + DeserializeOwned,
11+
{
12+
proptest!(|(value: T)| {
13+
let ser_value = bcs::to_bytes(&value).unwrap();
14+
let value2 = bcs::from_bytes::<T>(&ser_value).unwrap();
15+
let ser_value2 = bcs::to_bytes(&value2).unwrap();
16+
17+
assert_eq!(&value, &value2);
18+
assert_eq!(&ser_value, &ser_value2);
19+
});
20+
}
21+
22+
pub fn assert_signed_roundtrip<T>()
23+
where
24+
T: Arbitrary + PartialEq + Serialize + DeserializeOwned + ed25519::Signable,
25+
{
26+
proptest!(|(seed: [u8; 32], value: T)| {
27+
let key_pair = ed25519::KeyPair::from_seed(&seed);
28+
let pubkey = key_pair.public_key();
29+
30+
let (ser_value, signed_value) = key_pair.sign_struct(&value).unwrap();
31+
let signed_value2 = pubkey.verify_signed_struct(&ser_value).unwrap();
32+
let (ser_value2, _) = key_pair.sign_struct(signed_value2.inner()).unwrap();
33+
34+
assert_eq!(signed_value, signed_value2.as_ref());
35+
assert_eq!(&ser_value, &ser_value2);
36+
});
37+
}

0 commit comments

Comments
 (0)