impl Arbitrary for SpendDescription and refine impl for ShieldedData

This commit is contained in:
Deirdre Connolly 2020-01-27 23:24:09 -05:00 committed by Deirdre Connolly
parent f8781c3415
commit 289f8ec9ca
1 changed files with 46 additions and 8 deletions

View File

@ -2,7 +2,7 @@ use std::{fmt, io};
use futures::future::Either; use futures::future::Either;
#[cfg(test)] #[cfg(test)]
use proptest::{arbitrary::Arbitrary, collection::vec, prelude::*}; use proptest::{arbitrary::Arbitrary, array, collection::vec, prelude::*};
#[cfg(test)] #[cfg(test)]
use proptest_derive::Arbitrary; use proptest_derive::Arbitrary;
@ -16,7 +16,6 @@ use crate::serialization::{SerializationError, ZcashDeserialize, ZcashSerialize}
/// ///
/// [ps]: https://zips.z.cash/protocol/protocol.pdf#spendencoding /// [ps]: https://zips.z.cash/protocol/protocol.pdf#spendencoding
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(test, derive(Arbitrary))]
pub struct SpendDescription { pub struct SpendDescription {
/// A value commitment to the value of the input note. /// A value commitment to the value of the input note.
/// ///
@ -36,6 +35,41 @@ pub struct SpendDescription {
pub spend_auth_sig: redjubjub::Signature<SpendAuth>, pub spend_auth_sig: redjubjub::Signature<SpendAuth>,
} }
#[cfg(test)]
impl Arbitrary for SpendDescription {
type Parameters = ();
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
(
array::uniform32(any::<u8>()),
any::<SaplingNoteTreeRootHash>(),
array::uniform32(any::<u8>()),
array::uniform32(any::<u8>()),
any::<Groth16Proof>(),
vec(any::<u8>(), 64),
)
.prop_map(
|(cv_bytes, anchor, nullifier_bytes, rpk_bytes, proof, sig_bytes)| {
return Self {
cv: cv_bytes,
anchor: anchor,
nullifier: nullifier_bytes,
rk: redjubjub::PublicKeyBytes::from(rpk_bytes),
zkproof: proof,
spend_auth_sig: redjubjub::Signature::from({
let mut b = [0u8; 64];
b.copy_from_slice(sig_bytes.as_slice());
b
}),
};
},
)
.boxed()
}
type Strategy = BoxedStrategy<Self>;
}
/// A _Output Description_, as described in [protocol specification §7.4][ps]. /// A _Output Description_, as described in [protocol specification §7.4][ps].
/// ///
/// [ps]: https://zips.z.cash/protocol/protocol.pdf#outputencoding /// [ps]: https://zips.z.cash/protocol/protocol.pdf#outputencoding
@ -146,19 +180,23 @@ impl Arbitrary for ShieldedData {
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
( (
prop_oneof![ prop_oneof![
Either::Left(any::<SpendDescription>()), any::<SpendDescription>().prop_map(Either::Left),
Either::Right(any::<OutputDescription>()) any::<OutputDescription>().prop_map(Either::Right)
], ],
vec(any::<SpendDescription>()), vec(any::<SpendDescription>(), 0..10),
vec(any::<OutputDescription>()), vec(any::<OutputDescription>(), 0..10),
vec(any::<u8>(), 64), vec(any::<u8>(), 64),
) )
.prop_map(|first, rest_spends, rest_outputs, sig_bytes| { .prop_map(|(first, rest_spends, rest_outputs, sig)| {
return Self { return Self {
first: first, first: first,
rest_spends: rest_spends, rest_spends: rest_spends,
rest_outputs: rest_outputs, rest_outputs: rest_outputs,
binding_sig: redjubjub::Signature::from(sig_bytes), binding_sig: redjubjub::Signature::from({
let mut b = [0u8; 64];
b.copy_from_slice(sig.as_slice());
b
}),
}; };
}) })
.boxed() .boxed()