p2panda_core/
test_utils.rs1use std::cell::RefCell;
4use std::rc::Rc;
5
6use tracing_subscriber;
7
8use crate::{Body, Extensions, Hash, Header, Operation, SeqNum, SigningKey, Topic, VerifyingKey};
9
10pub fn setup_logging() {
11 if std::env::var("RUST_LOG").is_ok() {
12 let _ = tracing_subscriber::fmt()
13 .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
14 .try_init();
15 }
16}
17
18#[derive(Clone, Default)]
19pub struct TestLog {
20 signing_key: SigningKey,
21 backlink: Rc<RefCell<Option<Hash>>>,
22 seq_num: Rc<RefCell<SeqNum>>,
23 log_id: Topic,
24}
25
26impl TestLog {
27 pub fn new() -> Self {
28 Self {
29 signing_key: SigningKey::generate(),
30 backlink: Rc::default(),
31 seq_num: Rc::default(),
32 log_id: Topic::random(),
33 }
34 }
35
36 pub fn from_signing_key(signing_key: SigningKey) -> Self {
37 let mut log = TestLog::new();
38 log.signing_key = signing_key;
39 log
40 }
41
42 pub fn id(&self) -> Topic {
43 self.log_id
44 }
45
46 pub fn author(&self) -> VerifyingKey {
47 self.signing_key.verifying_key()
48 }
49
50 pub fn operation<E: Extensions>(&self, body: &[u8], extensions: E) -> Operation<E> {
51 let body = Body::from(body);
52
53 let mut seq_num = self.seq_num.borrow_mut();
54 let mut backlink = self.backlink.borrow_mut();
55
56 let mut header = Header::<E>::builder().body(&body);
57
58 if let Some(backlink) = *backlink {
59 header = header.chain(*seq_num, backlink);
60 }
61
62 let header = header.build(&self.signing_key, extensions);
63
64 *backlink = Some(header.hash());
65 *seq_num += 1;
66
67 Operation {
68 hash: header.hash(),
69 header,
70 body: if body.size() == 0 { None } else { Some(body) },
71 }
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use crate::{AnyHeader, Header, SigningKey};
78
79 #[test]
80 fn zero_byte_body() {
81 let signing_key = SigningKey::generate();
82 let header = Header::builder().body(&[]).build(&signing_key, ());
83
84 assert_eq!(header.payload_size, 0);
86 assert!(header.payload_hash.is_none());
87
88 let bytes = header.encode();
90 assert!(AnyHeader::decode(&bytes).is_ok());
91 }
92}