referrerpolicy=no-referrer-when-downgrade

polkadot_overseer/
dummy.rs

1// Copyright (C) Parity Technologies (UK) Ltd.
2// This file is part of Polkadot.
3
4// Polkadot is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8
9// Polkadot is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License
15// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
16
17use crate::{
18	prometheus::Registry, HeadSupportsParachains, InitializedOverseerBuilder, MetricsTrait,
19	Overseer, OverseerMetrics, OverseerSignal, OverseerSubsystemContext, SpawnGlue,
20};
21use orchestra::{FromOrchestra, SpawnedSubsystem, Subsystem, SubsystemContext};
22use polkadot_node_subsystem_types::{errors::SubsystemError, messages::*};
23// Generated dummy messages
24use crate::messages::*;
25
26/// A dummy subsystem that implements [`Subsystem`] for all
27/// types of messages. Used for tests or as a placeholder.
28#[derive(Clone, Copy, Debug)]
29pub struct DummySubsystem;
30
31impl<Context> Subsystem<Context, SubsystemError> for DummySubsystem
32where
33	Context: SubsystemContext<Signal = OverseerSignal, Error = SubsystemError>,
34{
35	fn start(self, mut ctx: Context) -> SpawnedSubsystem<SubsystemError> {
36		let future = Box::pin(async move {
37			loop {
38				match ctx.recv().await {
39					Err(_) => return Ok(()),
40					Ok(FromOrchestra::Signal(OverseerSignal::Conclude)) => return Ok(()),
41					Ok(overseer_msg) => {
42						gum::debug!(
43							target: "dummy-subsystem",
44							"Discarding a message sent from overseer {:?}",
45							overseer_msg
46						);
47						continue
48					},
49				}
50			}
51		});
52
53		SpawnedSubsystem { name: "dummy-subsystem", future }
54	}
55}
56
57/// Create an overseer with all subsystem being `Sub`.
58///
59/// Preferred way of initializing a dummy overseer for subsystem tests.
60pub fn dummy_overseer_builder<Spawner, SupportsParachains>(
61	spawner: Spawner,
62	supports_parachains: SupportsParachains,
63	registry: Option<&Registry>,
64) -> Result<
65	InitializedOverseerBuilder<
66		SpawnGlue<Spawner>,
67		SupportsParachains,
68		DummySubsystem,
69		DummySubsystem,
70		DummySubsystem,
71		DummySubsystem,
72		DummySubsystem,
73		DummySubsystem,
74		DummySubsystem,
75		DummySubsystem,
76		DummySubsystem,
77		DummySubsystem,
78		DummySubsystem,
79		DummySubsystem,
80		DummySubsystem,
81		DummySubsystem,
82		DummySubsystem,
83		DummySubsystem,
84		DummySubsystem,
85		DummySubsystem,
86		DummySubsystem,
87		DummySubsystem,
88		DummySubsystem,
89		DummySubsystem,
90		DummySubsystem,
91		DummySubsystem,
92	>,
93	SubsystemError,
94>
95where
96	SpawnGlue<Spawner>: orchestra::Spawner + 'static,
97	SupportsParachains: HeadSupportsParachains,
98{
99	one_for_all_overseer_builder(spawner, supports_parachains, DummySubsystem, registry)
100}
101
102/// Create an overseer with all subsystem being `Sub`.
103pub fn one_for_all_overseer_builder<Spawner, SupportsParachains, Sub>(
104	spawner: Spawner,
105	supports_parachains: SupportsParachains,
106	subsystem: Sub,
107	registry: Option<&Registry>,
108) -> Result<
109	InitializedOverseerBuilder<
110		SpawnGlue<Spawner>,
111		SupportsParachains,
112		Sub,
113		Sub,
114		Sub,
115		Sub,
116		Sub,
117		Sub,
118		Sub,
119		Sub,
120		Sub,
121		Sub,
122		Sub,
123		Sub,
124		Sub,
125		Sub,
126		Sub,
127		Sub,
128		Sub,
129		Sub,
130		Sub,
131		Sub,
132		Sub,
133		Sub,
134		Sub,
135		Sub,
136	>,
137	SubsystemError,
138>
139where
140	SpawnGlue<Spawner>: orchestra::Spawner + 'static,
141	SupportsParachains: HeadSupportsParachains,
142	Sub: Clone
143		+ Subsystem<OverseerSubsystemContext<AvailabilityDistributionMessage>, SubsystemError>
144		+ Subsystem<OverseerSubsystemContext<AvailabilityRecoveryMessage>, SubsystemError>
145		+ Subsystem<OverseerSubsystemContext<AvailabilityStoreMessage>, SubsystemError>
146		+ Subsystem<OverseerSubsystemContext<BitfieldDistributionMessage>, SubsystemError>
147		+ Subsystem<OverseerSubsystemContext<BitfieldSigningMessage>, SubsystemError>
148		+ Subsystem<OverseerSubsystemContext<CandidateBackingMessage>, SubsystemError>
149		+ Subsystem<OverseerSubsystemContext<CandidateValidationMessage>, SubsystemError>
150		+ Subsystem<OverseerSubsystemContext<ChainApiMessage>, SubsystemError>
151		+ Subsystem<OverseerSubsystemContext<CollationGenerationMessage>, SubsystemError>
152		+ Subsystem<OverseerSubsystemContext<CollatorProtocolMessage>, SubsystemError>
153		+ Subsystem<OverseerSubsystemContext<NetworkBridgeRxMessage>, SubsystemError>
154		+ Subsystem<OverseerSubsystemContext<NetworkBridgeTxMessage>, SubsystemError>
155		+ Subsystem<OverseerSubsystemContext<ProvisionerMessage>, SubsystemError>
156		+ Subsystem<OverseerSubsystemContext<RuntimeApiMessage>, SubsystemError>
157		+ Subsystem<OverseerSubsystemContext<StatementDistributionMessage>, SubsystemError>
158		+ Subsystem<OverseerSubsystemContext<ApprovalDistributionMessage>, SubsystemError>
159		+ Subsystem<OverseerSubsystemContext<ApprovalVotingMessage>, SubsystemError>
160		+ Subsystem<OverseerSubsystemContext<ApprovalVotingParallelMessage>, SubsystemError>
161		+ Subsystem<OverseerSubsystemContext<GossipSupportMessage>, SubsystemError>
162		+ Subsystem<OverseerSubsystemContext<DisputeCoordinatorMessage>, SubsystemError>
163		+ Subsystem<OverseerSubsystemContext<DisputeDistributionMessage>, SubsystemError>
164		+ Subsystem<OverseerSubsystemContext<ChainSelectionMessage>, SubsystemError>
165		+ Subsystem<OverseerSubsystemContext<PvfCheckerMessage>, SubsystemError>
166		+ Subsystem<OverseerSubsystemContext<ProspectiveParachainsMessage>, SubsystemError>,
167{
168	let metrics = <OverseerMetrics as MetricsTrait>::register(registry)?;
169
170	let builder = Overseer::builder()
171		.availability_distribution(subsystem.clone())
172		.availability_recovery(subsystem.clone())
173		.availability_store(subsystem.clone())
174		.bitfield_distribution(subsystem.clone())
175		.bitfield_signing(subsystem.clone())
176		.candidate_backing(subsystem.clone())
177		.candidate_validation(subsystem.clone())
178		.pvf_checker(subsystem.clone())
179		.chain_api(subsystem.clone())
180		.collation_generation(subsystem.clone())
181		.collator_protocol(subsystem.clone())
182		.network_bridge_tx(subsystem.clone())
183		.network_bridge_rx(subsystem.clone())
184		.provisioner(subsystem.clone())
185		.runtime_api(subsystem.clone())
186		.statement_distribution(subsystem.clone())
187		.approval_distribution(subsystem.clone())
188		.approval_voting(subsystem.clone())
189		.approval_voting_parallel(subsystem.clone())
190		.gossip_support(subsystem.clone())
191		.dispute_coordinator(subsystem.clone())
192		.dispute_distribution(subsystem.clone())
193		.chain_selection(subsystem.clone())
194		.prospective_parachains(subsystem.clone())
195		.activation_external_listeners(Default::default())
196		.active_leaves(Default::default())
197		.spawner(SpawnGlue(spawner))
198		.metrics(metrics)
199		.supports_parachains(supports_parachains);
200	Ok(builder)
201}