use std::sync::Arc;
use tokio::sync::mpsc;
use crate::client::name_resolution::ChannelController;
use crate::client::name_resolution::ResolverUpdate;
use crate::client::name_resolution::WorkScheduler;
use crate::client::service_config::ServiceConfig;
pub(crate) struct TestWorkScheduler {
work_tx: mpsc::UnboundedSender<()>,
}
impl TestWorkScheduler {
pub(crate) fn new_pair() -> (Arc<dyn WorkScheduler>, mpsc::UnboundedReceiver<()>) {
let (work_tx, work_rx) = mpsc::unbounded_channel();
let sched = Self { work_tx };
(Arc::new(sched), work_rx)
}
}
impl WorkScheduler for TestWorkScheduler {
fn schedule_work(&self) {
self.work_tx.send(()).unwrap();
}
}
pub(crate) struct TestChannelController {
update_result: Result<(), String>,
update_tx: mpsc::UnboundedSender<ResolverUpdate>,
}
impl TestChannelController {
pub(crate) fn new_pair() -> (Self, mpsc::UnboundedReceiver<ResolverUpdate>) {
let (update_tx, update_rx) = mpsc::unbounded_channel();
let cc = Self {
update_result: Ok(()),
update_tx,
};
(cc, update_rx)
}
pub(crate) fn set_update_result(&mut self, update_result: Result<(), String>) {
self.update_result = update_result
}
}
impl ChannelController for TestChannelController {
fn update(&mut self, update: ResolverUpdate) -> Result<(), String> {
println!("Received resolver update: {:?}", &update);
self.update_tx.send(update).unwrap();
self.update_result.clone()
}
fn parse_service_config(&self, _: &str) -> Result<ServiceConfig, String> {
Err("Unimplemented".to_string())
}
}