use crate::connection::transport::network_transport::TransportSslHandler;
use crate::core::{NegotiatedEncryptionSetting, TdsResult};
use crate::handler::handler_factory::SessionSettings;
use crate::message::messages::ResetConnectionMode;
use async_trait::async_trait;
#[async_trait]
pub(crate) trait NetworkWriter: Send + Sync + TransportSslHandler {
async fn send(&mut self, data: &[u8]) -> TdsResult<()>;
fn packet_size(&self) -> u32;
fn get_encryption_setting(&self) -> NegotiatedEncryptionSetting;
fn set_reset_mode(&mut self, _mode: ResetConnectionMode) {}
fn take_reset_mode(&mut self) -> ResetConnectionMode {
ResetConnectionMode::None
}
fn note_reset_dispatched(&mut self);
fn take_reset_dispatched(&mut self) -> bool;
fn channel_binding_token(&self) -> Option<Vec<u8>> {
None
}
}
#[async_trait]
pub(crate) trait NetworkReader: Send {
fn packet_size(&self) -> u32;
}
#[async_trait]
pub(crate) trait NetworkReaderWriter: NetworkReader + NetworkWriter {
fn notify_encryption_setting_change(&mut self, setting: NegotiatedEncryptionSetting);
fn notify_session_setting_change(&mut self, settings: &SessionSettings);
fn as_writer(&mut self) -> &mut dyn NetworkWriter;
}
#[cfg(test)]
mod tests {
use crate::connection::client_context::ClientContext;
use crate::connection::transport::network_transport::tests::MAX_BUFFER_SIZE;
use crate::connection::transport::network_transport::tests::create_readable_network_transport;
use crate::io::reader_writer::NetworkWriter;
use futures::StreamExt;
use rand::Rng;
use tokio_util::codec::{BytesCodec, FramedRead};
#[tokio::test]
async fn test_send_data() {
let context = ClientContext::default();
let (transport, server_side) = create_readable_network_transport(&context);
let mut network_writer = transport;
let mut rng = rand::rng();
let data_vector: Vec<u8> = (0..MAX_BUFFER_SIZE).map(|_| rng.random()).collect();
let mut framed_reader = FramedRead::new(server_side, BytesCodec::new());
let result = network_writer.send(&data_vector[..]).await;
match result {
Ok(_) => {}
Err(e) => panic!("Error sending data: {e}"),
}
let received = framed_reader
.next()
.await
.expect("No data")
.expect("Decode error");
assert_eq!(received.as_ref(), &data_vector[..]);
}
}