MlsGroupTestSetup

Struct MlsGroupTestSetup 

pub struct MlsGroupTestSetup<Provider>
where Provider: OpenMlsProvider,
{ pub clients: RwLock<HashMap<Vec<u8>, RwLock<Client<Provider>>>>, pub groups: RwLock<HashMap<GroupId, Group>>, pub waiting_for_welcome: RwLock<HashMap<Vec<u8>, Vec<u8>>>, pub default_mgp: MlsGroupCreateConfig, pub use_codec: CodecUse, }
Expand description

MlsGroupTestSetup is the main struct of the framework. It contains the state of all clients. The waiting_for_welcome field acts as a temporary store for KeyPackages that are used to add new members to groups. Note, that the MlsGroupTestSetup can only be initialized with a fixed number of clients and that create_clients has to be called before it can be otherwise used.

Fields§

§clients: RwLock<HashMap<Vec<u8>, RwLock<Client<Provider>>>>§groups: RwLock<HashMap<GroupId, Group>>§waiting_for_welcome: RwLock<HashMap<Vec<u8>, Vec<u8>>>§default_mgp: MlsGroupCreateConfig§use_codec: CodecUse

Flag to indicate if messages should be serialized and de-serialized as part of message distribution

Implementations§

§

impl<Provider> MlsGroupTestSetup<Provider>
where Provider: OpenMlsProvider + Default,

pub fn new( default_mgp: MlsGroupCreateConfig, number_of_clients: usize, use_codec: CodecUse, ) -> MlsGroupTestSetup<Provider>

Create a new MlsGroupTestSetup with the given default MlsGroupCreateConfig and the given number of clients. For lifetime reasons, create_clients has to be called in addition with the same number of clients.

pub fn get_fresh_key_package( &self, client: &Client<Provider>, ciphersuite: Ciphersuite, ) -> Result<KeyPackage, SetupError<<Provider as OpenMlsProvider>::StorageError>>

Create a fresh KeyPackage for client client for use when adding it to a group. The KeyPackageBundle will be fetched automatically when delivering the Welcome via deliver_welcome. This function throws an error if the client does not support the given ciphersuite.

pub fn identity_by_index(&self, index: usize, group: &Group) -> Option<Vec<u8>>

Convert an index in the tree into the corresponding identity.

pub fn identity_by_id(&self, id: &[u8], group: &Group) -> Option<Vec<u8>>

Convert an identity in the tree into the corresponding key package reference.

pub fn deliver_welcome( &self, welcome: Welcome, group: &Group, ) -> Result<(), SetupError<<Provider as OpenMlsProvider>::StorageError>>

Deliver a Welcome message to the intended recipients. It uses the given group group to obtain the current public tree of the group. Note, that this tree only exists if distribute_to_members was previously used to distribute the commit adding the members to the group. This function will throw an error if no key package was previously created for the client by get_fresh_key_package.

pub fn distribute_to_members<AS>( &self, sender_id: &[u8], group: &mut Group, message: &MlsMessageIn, authentication_service: &AS, ) -> Result<(), ClientError<<Provider as OpenMlsProvider>::StorageError>>
where AS: Fn(&Credential) -> bool,

Distribute a set of messages sent by the sender with identity sender_id to their intended recipients in group Group. This function also verifies that all members of that group agree on the public tree.

pub fn check_group_states<AS>( &self, group: &mut Group, authentication_service: AS, )
where AS: Fn(&Credential) -> bool,

Check if the public tree and the exporter secret with label “test” and length of the given group is the same for each group member. It also has each group member encrypt an application message and delivers all of these messages to all other members. This function panics if any of the above tests fail.

pub fn random_new_members_for_group( &self, group: &Group, number_of_members: usize, ) -> Result<Vec<Vec<u8>>, SetupError<<Provider as OpenMlsProvider>::StorageError>>

Get number_of_members new members for the given group group for use with the add_members function. If not enough clients are left that are not already members of this group, this function will return an error. TODO #310: Make this function ensure that the given members support the ciphersuite of the group.

pub fn create_group( &self, ciphersuite: Ciphersuite, ) -> Result<GroupId, SetupError<<Provider as OpenMlsProvider>::StorageError>>

Have a random client create a new group with ciphersuite ciphersuite and return the GroupId. Only works reliably if all clients support all ciphersuites, as it will throw an error if the randomly chosen client does not support the given ciphersuite. TODO #310: Fix to always work reliably, probably by introducing a mapping from ciphersuite to the set of client ids supporting it.

pub fn create_random_group<AS>( &self, target_group_size: usize, ciphersuite: Ciphersuite, authentication_service: AS, ) -> Result<GroupId, SetupError<<Provider as OpenMlsProvider>::StorageError>>
where AS: Fn(&Credential) -> bool,

Create a random group of size group_size and return the GroupId

pub fn self_update<AS>( &self, action_type: ActionType, group: &mut Group, client_id: &[u8], leaf_node_parameters: LeafNodeParameters, authentication_service: &AS, ) -> Result<(), SetupError<<Provider as OpenMlsProvider>::StorageError>>
where AS: Fn(&Credential) -> bool,

Have the client with identity client_id either propose or commit (depending on action_type) a self update in group group. Will throw an error if the client is not actually a member of group group.

pub fn add_clients<AS>( &self, action_type: ActionType, group: &mut Group, adder_id: &[u8], addees: Vec<Vec<u8>>, authentication_service: &AS, ) -> Result<(), SetupError<<Provider as OpenMlsProvider>::StorageError>>
where AS: Fn(&Credential) -> bool,

Has the adder either propose or commit (depending on the action_type) an add of the addee to the Group group. Returns an error if

  • the adder is not part of the group
  • the addee is already part of the group
  • the addee doesn’t support the group’s ciphersuite.

pub fn remove_clients<AS>( &self, action_type: ActionType, group: &mut Group, remover_id: &[u8], target_members: &[LeafNodeIndex], authentication_service: AS, ) -> Result<(), SetupError<<Provider as OpenMlsProvider>::StorageError>>
where AS: Fn(&Credential) -> bool,

Has the remover propose or commit (depending on the action_type) the removal the target_members from the Group group. If the remover or one of the target_members is not part of the group, it returns an error.

pub fn perform_random_operation<AS>( &self, group: &mut Group, authentication_service: &AS, ) -> Result<(), SetupError<<Provider as OpenMlsProvider>::StorageError>>
where AS: Fn(&Credential) -> bool,

This function picks a random member of group group and has them perform a random commit- or proposal action. TODO #133: This won’t work yet due to the missing proposal validation.

Auto Trait Implementations§

§

impl<Provider> !Freeze for MlsGroupTestSetup<Provider>

§

impl<Provider> RefUnwindSafe for MlsGroupTestSetup<Provider>

§

impl<Provider> Send for MlsGroupTestSetup<Provider>
where Provider: Send,

§

impl<Provider> Sync for MlsGroupTestSetup<Provider>
where Provider: Send + Sync,

§

impl<Provider> Unpin for MlsGroupTestSetup<Provider>
where Provider: Unpin,

§

impl<Provider> UnwindSafe for MlsGroupTestSetup<Provider>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Classify for T

§

type Classified = T

§

fn classify(self) -> T

§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Declassify for T

§

type Declassified = T

§

fn declassify(self) -> T

§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more