Struct holochain::sweettest::SweetConductor
source · pub struct SweetConductor { /* private fields */ }
Expand description
A useful Conductor abstraction for testing, allowing startup and shutdown as well as easy installation of apps across multiple Conductors and Agents.
This is intentionally NOT Clone
, because the drop handle triggers a shutdown of
the conductor handle, which would render all other cloned instances useless.
If you need multiple references to a SweetConductor, put it in an Arc
Implementations§
source§impl SweetConductor
impl SweetConductor
sourcepub async fn new(
handle: ConductorHandle,
env_dir: TestDir,
config: ConductorConfig
) -> SweetConductor
pub async fn new(
handle: ConductorHandle,
env_dir: TestDir,
config: ConductorConfig
) -> SweetConductor
Create a SweetConductor from an already-built ConductorHandle and environments RibosomeStore The conductor will be supplied with a single test AppInterface named “sweet-interface” so that signals may be emitted
sourcepub async fn from_config<C: Into<ConductorConfig>>(config: C) -> SweetConductor
pub async fn from_config<C: Into<ConductorConfig>>(config: C) -> SweetConductor
Create a SweetConductor with a new set of TestEnvs from the given config
sourcepub async fn from_builder(builder: ConductorBuilder) -> SweetConductor
pub async fn from_builder(builder: ConductorBuilder) -> SweetConductor
Create a SweetConductor from a partially-configured ConductorBuilder
sourcepub async fn handle_from_existing(
db_dir: &Path,
keystore: MetaLairClient,
config: &ConductorConfig,
extra_dnas: &[DnaFile]
) -> ConductorHandle
pub async fn handle_from_existing(
db_dir: &Path,
keystore: MetaLairClient,
config: &ConductorConfig,
extra_dnas: &[DnaFile]
) -> ConductorHandle
Create a handle from an existing environment and config
sourcepub async fn from_standard_config() -> SweetConductor
pub async fn from_standard_config() -> SweetConductor
Create a SweetConductor with a new set of TestEnvs from the given config
sourcepub fn keystore(&self) -> MetaLairClient
pub fn keystore(&self) -> MetaLairClient
Access the MetaLairClient for this conductor
sourcepub async fn enable_app(
&self,
id: InstalledAppId
) -> ConductorResult<(InstalledApp, Vec<(CellId, CellError)>)>
pub async fn enable_app(
&self,
id: InstalledAppId
) -> ConductorResult<(InstalledApp, Vec<(CellId, CellError)>)>
Convenience function that uses the internal handle to enable an app
sourcepub async fn disable_app(
&self,
id: InstalledAppId,
reason: DisabledAppReason
) -> ConductorResult<InstalledApp>
pub async fn disable_app(
&self,
id: InstalledAppId,
reason: DisabledAppReason
) -> ConductorResult<InstalledApp>
Convenience function that uses the internal handle to disable an app
sourcepub async fn start_app(
&self,
id: InstalledAppId
) -> ConductorResult<InstalledApp>
pub async fn start_app(
&self,
id: InstalledAppId
) -> ConductorResult<InstalledApp>
Convenience function that uses the internal handle to start an app
sourcepub async fn pause_app(
&self,
id: InstalledAppId,
reason: PausedAppReason
) -> ConductorResult<InstalledApp>
pub async fn pause_app(
&self,
id: InstalledAppId,
reason: PausedAppReason
) -> ConductorResult<InstalledApp>
Convenience function that uses the internal handle to pause an app
sourcepub fn get_sweet_cell(&self, cell_id: CellId) -> ConductorApiResult<SweetCell>
pub fn get_sweet_cell(&self, cell_id: CellId) -> ConductorApiResult<SweetCell>
Construct a SweetCell for a cell which has already been created
sourcepub async fn setup_app_for_agent<'a, R, D>(
&mut self,
installed_app_id: &str,
agent: AgentPubKey,
roles: D
) -> ConductorApiResult<SweetApp>where
R: Into<DnaWithRole> + Clone + 'a,
D: IntoIterator<Item = &'a R>,
pub async fn setup_app_for_agent<'a, R, D>(
&mut self,
installed_app_id: &str,
agent: AgentPubKey,
roles: D
) -> ConductorApiResult<SweetApp>where
R: Into<DnaWithRole> + Clone + 'a,
D: IntoIterator<Item = &'a R>,
Opinionated app setup. Creates an app for the given agent, using the given DnaFiles, with no extra configuration.
sourcepub async fn setup_app<'a, R, D>(
&mut self,
installed_app_id: &str,
dnas: D
) -> ConductorApiResult<SweetApp>where
R: Into<DnaWithRole> + Clone + 'a,
D: IntoIterator<Item = &'a R> + Clone,
pub async fn setup_app<'a, R, D>(
&mut self,
installed_app_id: &str,
dnas: D
) -> ConductorApiResult<SweetApp>where
R: Into<DnaWithRole> + Clone + 'a,
D: IntoIterator<Item = &'a R> + Clone,
Opinionated app setup. Creates an app using the given DnaFiles, with no extra configuration. An AgentPubKey will be generated, and is accessible via the returned SweetApp.
sourcepub async fn setup_app_for_agents<'a, A, R, D>(
&mut self,
app_id_prefix: &str,
agents: A,
roles: D
) -> ConductorApiResult<SweetAppBatch>where
A: IntoIterator<Item = &'a AgentPubKey>,
R: Into<DnaWithRole> + Clone + 'a,
D: IntoIterator<Item = &'a R>,
pub async fn setup_app_for_agents<'a, A, R, D>(
&mut self,
app_id_prefix: &str,
agents: A,
roles: D
) -> ConductorApiResult<SweetAppBatch>where
A: IntoIterator<Item = &'a AgentPubKey>,
R: Into<DnaWithRole> + Clone + 'a,
D: IntoIterator<Item = &'a R>,
Opinionated app setup. Creates one app per agent, using the given DnaFiles.
All InstalledAppIds and RoleNames are auto-generated. In tests driven directly by Rust, you typically won’t care what these values are set to, but in case you do, they are set as so:
- InstalledAppId: {app_id_prefix}-{agent_pub_key}
- RoleName: {dna_hash}
Returns a batch of SweetApps, sorted in the same order as Agents passed in.
sourcepub async fn create_clone_cell(
&mut self,
payload: CreateCloneCellPayload
) -> ConductorApiResult<ClonedCell>
pub async fn create_clone_cell(
&mut self,
payload: CreateCloneCellPayload
) -> ConductorApiResult<ClonedCell>
Call into the underlying create_clone_cell function, and register the created dna with SweetConductor so it will be reloaded on restart.
sourcepub fn signals(&mut self) -> SignalStream
pub fn signals(&mut self) -> SignalStream
Get a stream of all Signals emitted on the “sweet-interface” AppInterface.
This is designed to crash if called more than once, because as currently implemented, creating multiple signal streams would simply cause multiple consumers of the same underlying streams, not a fresh subscription
sourcepub async fn admin_ws_client(&self) -> (WebsocketSender, WebsocketReceiver)
pub async fn admin_ws_client(&self) -> (WebsocketSender, WebsocketReceiver)
Get a new websocket client which can send requests over the admin interface. It presupposes that an admin interface has been configured. (The standard_config includes an admin interface at port 0.)
sourcepub async fn shutdown(&mut self)
pub async fn shutdown(&mut self)
Shutdown this conductor. This will wait for the conductor to shutdown but keep the inner state to restart it.
Attempting to use this conductor without starting it up again will cause a panic.
sourcepub fn is_running(&self) -> bool
pub fn is_running(&self) -> bool
Check if this conductor is running
sourcepub fn raw_handle(&self) -> ConductorHandle
pub fn raw_handle(&self) -> ConductorHandle
Get the ConductorHandle within this Conductor. Be careful when using this, because this leaks out handles, which may make it harder to shut down the conductor during tests.
sourcepub async fn force_all_publish_dht_ops(&self)
pub async fn force_all_publish_dht_ops(&self)
Force trigger all dht ops that haven’t received enough validation receipts yet.
sourcepub async fn exchange_peer_info(conductors: impl IntoIterator<Item = &Self>)
pub async fn exchange_peer_info(conductors: impl IntoIterator<Item = &Self>)
Let each conductor know about each others’ agents so they can do networking
sourcepub async fn exchange_peer_info_sampled(
conductors: impl IntoIterator<Item = &Self>,
rng: &mut StdRng,
s: usize
)
pub async fn exchange_peer_info_sampled(
conductors: impl IntoIterator<Item = &Self>,
rng: &mut StdRng,
s: usize
)
Let each conductor know about each others’ agents so they can do networking
Methods from Deref<Target = SweetConductorHandle>§
sourcepub async fn call<I, O, F>(&self, zome: &SweetZome, fn_name: F, payload: I) -> Owhere
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
pub async fn call<I, O, F>(&self, zome: &SweetZome, fn_name: F, payload: I) -> Owhere
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
Make a zome call to a Cell, as if that Cell were the caller. Most common case. No capability is necessary, since the authorship capability is automatically granted.
sourcepub async fn call_fallible<I, O, F>(
&self,
zome: &SweetZome,
fn_name: F,
payload: I
) -> ConductorApiResult<O>where
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
pub async fn call_fallible<I, O, F>(
&self,
zome: &SweetZome,
fn_name: F,
payload: I
) -> ConductorApiResult<O>where
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
Like call
, but without the unwrap
sourcepub async fn call_from<I, O, F>(
&self,
provenance: &AgentPubKey,
cap_secret: Option<CapSecret>,
zome: &SweetZome,
fn_name: F,
payload: I
) -> Owhere
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
pub async fn call_from<I, O, F>(
&self,
provenance: &AgentPubKey,
cap_secret: Option<CapSecret>,
zome: &SweetZome,
fn_name: F,
payload: I
) -> Owhere
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
Make a zome call to a Cell, as if some other Cell were the caller. More general case. Can optionally provide a capability.
sourcepub async fn call_from_fallible<I, O, F>(
&self,
provenance: &AgentPubKey,
cap_secret: Option<CapSecret>,
zome: &SweetZome,
fn_name: F,
payload: I
) -> ConductorApiResult<O>where
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
pub async fn call_from_fallible<I, O, F>(
&self,
provenance: &AgentPubKey,
cap_secret: Option<CapSecret>,
zome: &SweetZome,
fn_name: F,
payload: I
) -> ConductorApiResult<O>where
FunctionName: From<F>,
I: Serialize + Debug,
O: DeserializeOwned + Debug,
Like call_from
, but without the unwrap
sourcepub async fn signal_stream(&self) -> impl Stream<Item = Signal>
pub async fn signal_stream(&self) -> impl Stream<Item = Signal>
Get a stream of all Signals emitted since the time of this function call.
Trait Implementations§
source§impl AsRef<SweetConductorHandle> for SweetConductor
impl AsRef<SweetConductorHandle> for SweetConductor
source§fn as_ref(&self) -> &SweetConductorHandle
fn as_ref(&self) -> &SweetConductorHandle
source§impl Borrow<SweetConductorHandle> for SweetConductor
impl Borrow<SweetConductorHandle> for SweetConductor
source§fn borrow(&self) -> &SweetConductorHandle
fn borrow(&self) -> &SweetConductorHandle
source§impl Debug for SweetConductor
impl Debug for SweetConductor
source§impl Deref for SweetConductor
impl Deref for SweetConductor
source§impl Drop for SweetConductor
impl Drop for SweetConductor
source§impl From<(Option<SweetConductorHandle>, TestDir, MetaLairClient, Spaces, ConductorConfig, Vec<DnaFile, Global>, Option<Box<dyn Stream<Item = Signal> + Sync + Send + Unpin + 'static, Global>>)> for SweetConductor
impl From<(Option<SweetConductorHandle>, TestDir, MetaLairClient, Spaces, ConductorConfig, Vec<DnaFile, Global>, Option<Box<dyn Stream<Item = Signal> + Sync + Send + Unpin + 'static, Global>>)> for SweetConductor
source§fn from(
original: (Option<SweetConductorHandle>, TestDir, MetaLairClient, Spaces, ConductorConfig, Vec<DnaFile>, Option<SignalStream>)
) -> SweetConductor
fn from(
original: (Option<SweetConductorHandle>, TestDir, MetaLairClient, Spaces, ConductorConfig, Vec<DnaFile>, Option<SignalStream>)
) -> SweetConductor
Auto Trait Implementations§
impl !RefUnwindSafe for SweetConductor
impl Send for SweetConductor
impl Sync for SweetConductor
impl Unpin for SweetConductor
impl !UnwindSafe for SweetConductor
Blanket Implementations§
§impl<T> Any for Twhere
T: Any + ?Sized,
impl<T> Any for Twhere
T: Any + ?Sized,
§fn type_id_compat(&self) -> TypeId
fn type_id_compat(&self) -> TypeId
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata
) -> <T as Pointee>::Metadata
fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata
) -> <T as Pointee>::Metadata
§impl<F, W, T, D> Deserialize<With<T, W>, D> for Fwhere
W: DeserializeWith<F, T, D>,
D: Fallible + ?Sized,
F: ?Sized,
impl<F, W, T, D> Deserialize<With<T, W>, D> for Fwhere
W: DeserializeWith<F, T, D>,
D: Fallible + ?Sized,
F: ?Sized,
§fn deserialize(
&self,
deserializer: &mut D
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize(
&self,
deserializer: &mut D
) -> Result<With<T, W>, <D as Fallible>::Error>
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.