Skip to main content

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, CreateKeysetResponse, GenerateKeyRequest,
12    GenerateKeySpec, GrantKeysetRequest, IdentifiedBy, Keyset, RetrieveKeyRequest,
13    RetrieveKeyRequestFallible, RetrieveKeySpec,
14};
15
16/// Generate a random `CreateDatasetRequest` with a random description and the given name.
17impl Dummy<&'static str> for CreateKeysetRequest<'_> {
18    fn dummy_with_rng<R: Rng + ?Sized>(name: &&'static str, _: &mut R) -> Self {
19        Self {
20            name: Cow::Borrowed(*name),
21            description: Cow::Owned("description".to_string()),
22            client: None,
23        }
24    }
25}
26
27impl Dummy<Faker> for Keyset {
28    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, _: &mut R) -> Self {
29        Self {
30            id: Uuid::new_v4(),
31            name: Word().fake(),
32            description: Words(3..10).fake::<Vec<String>>().join(" "),
33            is_disabled: false,
34            is_default: false,
35        }
36    }
37}
38
39/// Generate a random `CreateDatasetRequest` with a random name and description.
40impl Dummy<Faker> for CreateKeysetRequest<'_> {
41    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, _: &mut R) -> Self {
42        let words: Vec<String> = Words(3..10).fake();
43        let word: String = Word().fake();
44
45        Self {
46            name: Cow::Owned(format!("{word}-{}", Uuid::new_v4())),
47            description: Cow::Owned(words.join(" ")),
48            client: None,
49        }
50    }
51}
52
53/// Generate a random `CreateClientRequest` for the given `Keyset`.
54/// The name and description are random.
55impl Dummy<Keyset> for CreateClientRequest<'_> {
56    fn dummy_with_rng<R: Rng + ?Sized>(Keyset { id, .. }: &Keyset, _: &mut R) -> Self {
57        Self {
58            keyset_id: Some(IdentifiedBy::Uuid(*id)),
59            name: Cow::Owned(Word().fake()),
60            description: Cow::Owned(Word().fake()),
61        }
62    }
63}
64
65/// Generate a random `CreateClientRequest` from a `CreateKeysetResponse`.
66impl Dummy<CreateKeysetResponse> for CreateClientRequest<'_> {
67    fn dummy_with_rng<R: Rng + ?Sized>(resp: &CreateKeysetResponse, rng: &mut R) -> Self {
68        Self::dummy_with_rng(&resp.keyset, rng)
69    }
70}
71
72/// Generate a `GrantDatasetRequest` for the given `Keyset` and client ID (`Uuid`).
73impl Dummy<(&Keyset, Uuid)> for GrantKeysetRequest {
74    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
75        Self {
76            keyset_id: IdentifiedBy::Uuid(keyset.id),
77            client_id: *client_id,
78        }
79    }
80}
81
82impl Dummy<(&CreateKeysetResponse, Uuid)> for GrantKeysetRequest {
83    fn dummy_with_rng<R: Rng + ?Sized>(
84        (resp, client_id): &(&CreateKeysetResponse, Uuid),
85        rng: &mut R,
86    ) -> Self {
87        Self::dummy_with_rng(&(&resp.keyset, *client_id), rng)
88    }
89}
90
91impl Dummy<(&Keyset, Uuid)> for GenerateKeyRequest<'_> {
92    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
93        Self {
94            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
95            client_id: *client_id,
96            keys: Cow::Owned(fake::vec![GenerateKeySpec; 4]),
97            unverified_context: Default::default(),
98        }
99    }
100}
101
102impl Dummy<(&CreateKeysetResponse, Uuid)> for GenerateKeyRequest<'_> {
103    fn dummy_with_rng<R: Rng + ?Sized>(
104        (resp, client_id): &(&CreateKeysetResponse, Uuid),
105        rng: &mut R,
106    ) -> Self {
107        Self::dummy_with_rng(&(&resp.keyset, *client_id), rng)
108    }
109}
110
111impl Dummy<Faker> for GenerateKeySpec<'_> {
112    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
113        let mut buf: [u8; 16] = Default::default();
114        buf.try_fill(rng).unwrap();
115
116        Self {
117            iv: buf.into(),
118            descriptor: Cow::Owned(Word().fake()),
119            context: Default::default(),
120        }
121    }
122}
123
124impl Dummy<(&Keyset, Uuid)> for RetrieveKeyRequest<'_> {
125    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
126        Self {
127            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
128            client_id: *client_id,
129            keys: Cow::Owned(fake::vec![RetrieveKeySpec; 4]),
130            unverified_context: Default::default(),
131        }
132    }
133}
134
135impl Dummy<(&CreateKeysetResponse, Uuid)> for RetrieveKeyRequest<'_> {
136    fn dummy_with_rng<R: Rng + ?Sized>(
137        (resp, client_id): &(&CreateKeysetResponse, Uuid),
138        rng: &mut R,
139    ) -> Self {
140        Self::dummy_with_rng(&(&resp.keyset, *client_id), rng)
141    }
142}
143
144impl Dummy<(&Keyset, Uuid)> for RetrieveKeyRequestFallible<'_> {
145    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
146        Self {
147            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
148            client_id: *client_id,
149            keys: Cow::Owned(fake::vec![RetrieveKeySpec; 4]),
150            unverified_context: Default::default(),
151        }
152    }
153}
154
155impl Dummy<Faker> for RetrieveKeySpec<'_> {
156    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
157        let mut buf: [u8; 16] = Default::default();
158        buf.try_fill(rng).unwrap();
159
160        Self {
161            iv: buf.into(),
162            descriptor: Cow::Owned(Word().fake()),
163            tag: Cow::Owned([0u8; 16].map(|_| rng.gen()).to_vec()),
164            context: Cow::Owned(vec![]),
165            tag_version: 1,
166        }
167    }
168}