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, RetrieveKeyRequest, RetrieveKeyRequestFallible,
13    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        }
23    }
24}
25
26impl Dummy<Faker> for Keyset {
27    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, _: &mut R) -> Self {
28        Self {
29            id: Uuid::new_v4(),
30            name: Word().fake(),
31            description: Words(3..10).fake::<Vec<String>>().join(" "),
32            is_disabled: false,
33        }
34    }
35}
36
37/// Generate a random `CreateDatasetRequest` with a random name and description.
38impl Dummy<Faker> for CreateKeysetRequest<'_> {
39    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, _: &mut R) -> Self {
40        let words: Vec<String> = Words(3..10).fake();
41
42        Self {
43            name: Cow::Owned(Word().fake()),
44            description: Cow::Owned(words.join(" ")),
45        }
46    }
47}
48
49/// Generate a random `CreateClientRequest` for the given `Keyset`.
50/// The name and description are random.
51impl Dummy<Keyset> for CreateClientRequest<'_> {
52    fn dummy_with_rng<R: Rng + ?Sized>(Keyset { id, .. }: &Keyset, _: &mut R) -> Self {
53        Self {
54            keyset_id: IdentifiedBy::Uuid(*id),
55            name: Cow::Owned(Word().fake()),
56            description: Cow::Owned(Word().fake()),
57        }
58    }
59}
60
61/// Generate a `GrantDatasetRequest` for the given `Keyset` and client ID (`Uuid`).
62impl Dummy<(&Keyset, Uuid)> for GrantKeysetRequest {
63    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
64        Self {
65            keyset_id: IdentifiedBy::Uuid(keyset.id),
66            client_id: *client_id,
67        }
68    }
69}
70
71impl Dummy<(&Keyset, Uuid)> for GenerateKeyRequest<'_> {
72    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
73        Self {
74            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
75            client_id: *client_id,
76            keys: Cow::Owned(fake::vec![GenerateKeySpec; 4]),
77            unverified_context: Default::default(),
78        }
79    }
80}
81
82impl Dummy<Faker> for GenerateKeySpec<'_> {
83    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
84        let mut buf: [u8; 16] = Default::default();
85        buf.try_fill(rng).unwrap();
86
87        Self {
88            iv: buf.into(),
89            descriptor: Cow::Owned(Word().fake()),
90            context: vec![],
91        }
92    }
93}
94
95impl Dummy<(&Keyset, Uuid)> for RetrieveKeyRequest<'_> {
96    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
97        Self {
98            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
99            client_id: *client_id,
100            keys: Cow::Owned(fake::vec![RetrieveKeySpec; 4]),
101            unverified_context: Default::default(),
102        }
103    }
104}
105
106impl Dummy<(&Keyset, Uuid)> for RetrieveKeyRequestFallible<'_> {
107    fn dummy_with_rng<R: Rng + ?Sized>((keyset, client_id): &(&Keyset, Uuid), _: &mut R) -> Self {
108        Self {
109            keyset_id: Some(IdentifiedBy::Uuid(keyset.id)),
110            client_id: *client_id,
111            keys: Cow::Owned(fake::vec![RetrieveKeySpec; 4]),
112            unverified_context: Default::default(),
113        }
114    }
115}
116
117impl Dummy<Faker> for RetrieveKeySpec<'_> {
118    fn dummy_with_rng<R: Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
119        let mut buf: [u8; 16] = Default::default();
120        buf.try_fill(rng).unwrap();
121
122        Self {
123            iv: buf.into(),
124            descriptor: Cow::Owned(Word().fake()),
125            tag: Cow::Owned([0u8; 16].map(|_| rng.gen()).to_vec()),
126            context: vec![],
127            tag_version: 1,
128        }
129    }
130}