zerokms_protocol/
testing.rs

1//! Implementations of `Dummy` for various types in the `zerokms-protocol` crate.
2use fake::{
3    faker::lorem::en::{Word, Words},
4    Dummy, Fake, Faker,
5};
6use rand::{Fill, Rng};
7use std::borrow::Cow;
8use uuid::Uuid;
9
10use crate::{
11    CreateClientRequest, CreateKeysetRequest, GenerateKeyRequest, GenerateKeySpec,
12    GrantKeysetRequest, IdentifiedBy, Keyset,
13};
14
15/// Generate a random `CreateDatasetRequest` with a random description and the given name.
16impl Dummy<&'static str> for CreateKeysetRequest<'_> {
17    fn dummy_with_rng<R: Rng + ?Sized>(name: &&'static str, _: &mut R) -> Self {
18        Self {
19            name: Cow::Borrowed(*name),
20            description: Cow::Owned("description".to_string()),
21        }
22    }
23}
24
25impl Dummy<Faker> for Keyset {
26    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, _: &mut R) -> Self {
27        Self {
28            id: Uuid::new_v4(),
29            name: Word().fake(),
30            description: Words(3..10).fake::<Vec<String>>().join(" "),
31            is_disabled: false,
32        }
33    }
34}
35
36/// Generate a random `CreateDatasetRequest` with a random name and description.
37impl Dummy<Faker> for CreateKeysetRequest<'_> {
38    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, _: &mut R) -> Self {
39        let words: Vec<String> = Words(3..10).fake();
40
41        Self {
42            name: Cow::Owned(Word().fake()),
43            description: Cow::Owned(words.join(" ")),
44        }
45    }
46}
47
48/// Generate a random `CreateClientRequest` for the given `Keyset`.
49/// The name and description are random.
50impl Dummy<Keyset> for CreateClientRequest<'_> {
51    fn dummy_with_rng<R: Rng + ?Sized>(Keyset { id, .. }: &Keyset, _: &mut R) -> Self {
52        Self {
53            keyset_id: IdentifiedBy::Uuid(*id),
54            name: Cow::Owned(Word().fake()),
55            description: Cow::Owned(Word().fake()),
56        }
57    }
58}
59
60/// Generate a `GrantDatasetRequest` for the given `Keyset` and client ID (`Uuid`).
61impl Dummy<(&Keyset, Uuid)> for GrantKeysetRequest {
62    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
63        Self {
64            keyset_id: IdentifiedBy::Uuid(keyset.id),
65            client_id: *client_id,
66        }
67    }
68}
69
70impl Dummy<(&Keyset, Uuid)> for GenerateKeyRequest<'_> {
71    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
72        Self {
73            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
74            client_id: *client_id,
75            keys: Cow::Owned(fake::vec![GenerateKeySpec; 4]),
76            unverified_context: Default::default(),
77        }
78    }
79}
80
81impl Dummy<Faker> for GenerateKeySpec<'_> {
82    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
83        let mut buf: [u8; 16] = Default::default();
84        buf.try_fill(rng).unwrap();
85
86        Self {
87            iv: buf.into(),
88            descriptor: Cow::Owned(Word().fake()),
89            context: vec![],
90        }
91    }
92}