// Copyright 2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Polkadot is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . use super::*; use polkadot_node_subsystem_test_helpers::*; use polkadot_node_subsystem::{ messages::{AllMessages, AvailabilityStoreMessage}, overseer::{gen::TimeoutExt, Subsystem}, DummySubsystem, }; #[derive(Clone, Debug)] struct BlackHoleInterceptor; impl MessageInterceptor for BlackHoleInterceptor where Sender: overseer::SubsystemSender + overseer::SubsystemSender + Clone + 'static, { type Message = AvailabilityStoreMessage; fn intercept_incoming( &self, _sender: &mut Sender, msg: FromOverseer, ) -> Option> { match msg { FromOverseer::Communication { msg: _msg } => None, // to conclude the test cleanly sig => Some(sig), } } } async fn overseer_send>(overseer: &mut TestSubsystemContextHandle, msg: T) { overseer.send(FromOverseer::Communication { msg }).await; } #[test] fn integrity_test() { let pool = sp_core::testing::TaskExecutor::new(); let (context, mut overseer) = make_subsystem_context(pool); let sub = DummySubsystem; let sub_intercepted = InterceptedSubsystem::new(sub, BlackHoleInterceptor); // Try to send a message we know is going to be filtered. let test_fut = async move { let (tx, rx) = futures::channel::oneshot::channel(); overseer_send( &mut overseer, AvailabilityStoreMessage::QueryChunk(Default::default(), 0.into(), tx), ) .await; let _ = rx.timeout(std::time::Duration::from_millis(100)).await.unwrap(); overseer }; let subsystem = async move { sub_intercepted.start(context).future.await.unwrap(); }; futures::pin_mut!(test_fut); futures::pin_mut!(subsystem); futures::executor::block_on(futures::future::join( async move { let mut overseer = test_fut.await; overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; }, subsystem, )) .1; }