pub struct MlsGroupTestSetup<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,
}test-utils) only.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: CodecUseFlag to indicate if messages should be serialized and de-serialized as part of message distribution
Implementations§
Source§impl<Provider: OpenMlsProvider + Default> MlsGroupTestSetup<Provider>
impl<Provider: OpenMlsProvider + Default> MlsGroupTestSetup<Provider>
Sourcepub fn new(
default_mgp: MlsGroupCreateConfig,
number_of_clients: usize,
use_codec: CodecUse,
) -> Self
pub fn new( default_mgp: MlsGroupCreateConfig, number_of_clients: usize, use_codec: CodecUse, ) -> Self
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.
Sourcepub fn get_fresh_key_package(
&self,
client: &Client<Provider>,
ciphersuite: Ciphersuite,
) -> Result<KeyPackage, SetupError<Provider::StorageError>>
pub fn get_fresh_key_package( &self, client: &Client<Provider>, ciphersuite: Ciphersuite, ) -> Result<KeyPackage, SetupError<Provider::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.
Sourcepub fn identity_by_index(&self, index: usize, group: &Group) -> Option<Vec<u8>>
pub fn identity_by_index(&self, index: usize, group: &Group) -> Option<Vec<u8>>
Convert an index in the tree into the corresponding identity.
Sourcepub fn identity_by_id(&self, id: &[u8], group: &Group) -> Option<Vec<u8>>
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.
Sourcepub fn deliver_welcome(
&self,
welcome: Welcome,
group: &Group,
) -> Result<(), SetupError<Provider::StorageError>>
pub fn deliver_welcome( &self, welcome: Welcome, group: &Group, ) -> Result<(), SetupError<Provider::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.
Sourcepub fn distribute_to_members<AS: Fn(&Credential) -> bool>(
&self,
sender_id: &[u8],
group: &mut Group,
message: &MlsMessageIn,
authentication_service: &AS,
) -> Result<(), ClientError<Provider::StorageError>>
pub fn distribute_to_members<AS: Fn(&Credential) -> bool>( &self, sender_id: &[u8], group: &mut Group, message: &MlsMessageIn, authentication_service: &AS, ) -> Result<(), ClientError<Provider::StorageError>>
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.
Sourcepub fn check_group_states<AS: Fn(&Credential) -> bool>(
&self,
group: &mut Group,
authentication_service: AS,
)
pub fn check_group_states<AS: Fn(&Credential) -> bool>( &self, group: &mut Group, authentication_service: AS, )
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.
Sourcepub fn random_new_members_for_group(
&self,
group: &Group,
number_of_members: usize,
) -> Result<Vec<Vec<u8>>, SetupError<Provider::StorageError>>
pub fn random_new_members_for_group( &self, group: &Group, number_of_members: usize, ) -> Result<Vec<Vec<u8>>, SetupError<Provider::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.
Sourcepub fn create_group(
&self,
ciphersuite: Ciphersuite,
) -> Result<GroupId, SetupError<Provider::StorageError>>
pub fn create_group( &self, ciphersuite: Ciphersuite, ) -> Result<GroupId, SetupError<Provider::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.
Sourcepub fn create_random_group<AS: Fn(&Credential) -> bool>(
&self,
target_group_size: usize,
ciphersuite: Ciphersuite,
authentication_service: AS,
) -> Result<GroupId, SetupError<Provider::StorageError>>
pub fn create_random_group<AS: Fn(&Credential) -> bool>( &self, target_group_size: usize, ciphersuite: Ciphersuite, authentication_service: AS, ) -> Result<GroupId, SetupError<Provider::StorageError>>
Create a random group of size group_size and return the GroupId
Sourcepub fn self_update<AS: Fn(&Credential) -> bool>(
&self,
action_type: ActionType,
group: &mut Group,
client_id: &[u8],
leaf_node_parameters: LeafNodeParameters,
authentication_service: &AS,
) -> Result<(), SetupError<Provider::StorageError>>
pub fn self_update<AS: Fn(&Credential) -> bool>( &self, action_type: ActionType, group: &mut Group, client_id: &[u8], leaf_node_parameters: LeafNodeParameters, authentication_service: &AS, ) -> Result<(), SetupError<Provider::StorageError>>
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.
Sourcepub fn add_clients<AS: Fn(&Credential) -> bool>(
&self,
action_type: ActionType,
group: &mut Group,
adder_id: &[u8],
addees: Vec<Vec<u8>>,
authentication_service: &AS,
) -> Result<(), SetupError<Provider::StorageError>>
pub fn add_clients<AS: Fn(&Credential) -> bool>( &self, action_type: ActionType, group: &mut Group, adder_id: &[u8], addees: Vec<Vec<u8>>, authentication_service: &AS, ) -> Result<(), SetupError<Provider::StorageError>>
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
adderis not part of the group - the
addeeis already part of the group - the
addeedoesn’t support the group’s ciphersuite.
Sourcepub fn remove_clients<AS: Fn(&Credential) -> bool>(
&self,
action_type: ActionType,
group: &mut Group,
remover_id: &[u8],
target_members: &[LeafNodeIndex],
authentication_service: AS,
) -> Result<(), SetupError<Provider::StorageError>>
pub fn remove_clients<AS: Fn(&Credential) -> bool>( &self, action_type: ActionType, group: &mut Group, remover_id: &[u8], target_members: &[LeafNodeIndex], authentication_service: AS, ) -> Result<(), SetupError<Provider::StorageError>>
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.
Sourcepub fn perform_random_operation<AS: Fn(&Credential) -> bool>(
&self,
group: &mut Group,
authentication_service: &AS,
) -> Result<(), SetupError<Provider::StorageError>>
pub fn perform_random_operation<AS: Fn(&Credential) -> bool>( &self, group: &mut Group, authentication_service: &AS, ) -> Result<(), SetupError<Provider::StorageError>>
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>
impl<Provider> Unpin for MlsGroupTestSetup<Provider>where
Provider: Unpin,
impl<Provider> UnwindSafe for MlsGroupTestSetup<Provider>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Classify for T
impl<T> Classify for T
type Classified = T
fn classify(self) -> T
§impl<T> Declassify for T
impl<T> Declassify for T
type Declassified = T
fn declassify(self) -> T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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