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: CodecUseFlag to indicate if messages should be serialized and de-serialized as part of message distribution
Implementations§
§impl<Provider> MlsGroupTestSetup<Provider>where
Provider: OpenMlsProvider + Default,
impl<Provider> MlsGroupTestSetup<Provider>where
Provider: OpenMlsProvider + Default,
pub fn new(
default_mgp: MlsGroupCreateConfig,
number_of_clients: usize,
use_codec: CodecUse,
) -> MlsGroupTestSetup<Provider>
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>>
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>>
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>>
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>>
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>>
pub fn distribute_to_members<AS>( &self, sender_id: &[u8], group: &mut Group, message: &MlsMessageIn, authentication_service: &AS, ) -> Result<(), ClientError<<Provider as OpenMlsProvider>::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.
pub fn check_group_states<AS>(
&self,
group: &mut Group,
authentication_service: AS,
)
pub fn check_group_states<AS>( &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.
pub fn random_new_members_for_group(
&self,
group: &Group,
number_of_members: usize,
) -> Result<Vec<Vec<u8>>, SetupError<<Provider as OpenMlsProvider>::StorageError>>
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>>
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>>
pub fn create_random_group<AS>( &self, target_group_size: usize, ciphersuite: Ciphersuite, authentication_service: AS, ) -> Result<GroupId, SetupError<<Provider as OpenMlsProvider>::StorageError>>
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>>
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>>
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>>
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>>
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.
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>>
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>>
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>>
pub fn perform_random_operation<AS>( &self, group: &mut Group, authentication_service: &AS, ) -> Result<(), SetupError<<Provider as OpenMlsProvider>::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> Conv for T
impl<T> Conv for T
§impl<T> Declassify for T
impl<T> Declassify for T
type Declassified = T
fn declassify(self) -> T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.