Skip to main content

nntp_proxy/
network.rs

1//! Network socket optimization utilities
2//!
3//! This module provides utilities for optimizing TCP socket performance
4//! for high-throughput NNTP transfers.
5//!
6//! The module is organized into:
7//! - `optimizers`: Trait-based optimization strategies for different connection types
8
9pub mod optimizers;
10
11// Re-export the optimizers for easier access
12pub use optimizers::{ConnectionOptimizer, NetworkOptimizer, TcpOptimizer, TlsOptimizer};
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17    use crate::constants::socket::{HIGH_THROUGHPUT_RECV_BUFFER, HIGH_THROUGHPUT_SEND_BUFFER};
18    use tokio::net::TcpStream;
19
20    #[test]
21    fn test_constants() {
22        assert_eq!(HIGH_THROUGHPUT_RECV_BUFFER, 16 * 1024 * 1024);
23        assert_eq!(HIGH_THROUGHPUT_SEND_BUFFER, 16 * 1024 * 1024);
24    }
25
26    #[test]
27    fn test_buffer_size_is_reasonable() {
28        // Buffer sizes should be large but not excessive
29        const _: () = assert!(HIGH_THROUGHPUT_RECV_BUFFER >= 1024 * 1024); // At least 1MB
30        const _: () = assert!(HIGH_THROUGHPUT_RECV_BUFFER <= 128 * 1024 * 1024); // At most 128MB
31        const _: () = assert!(HIGH_THROUGHPUT_SEND_BUFFER >= 1024 * 1024);
32        const _: () = assert!(HIGH_THROUGHPUT_SEND_BUFFER <= 128 * 1024 * 1024);
33    }
34
35    #[test]
36    fn test_buffer_sizes_are_equal() {
37        assert_eq!(HIGH_THROUGHPUT_RECV_BUFFER, HIGH_THROUGHPUT_SEND_BUFFER);
38    }
39
40    #[test]
41    fn test_buffer_sizes_are_power_of_two_or_multiple() {
42        let size = HIGH_THROUGHPUT_RECV_BUFFER;
43        assert_eq!(size % (1024 * 1024), 0);
44    }
45
46    #[tokio::test]
47    async fn test_connection_optimizer() {
48        use crate::stream::ConnectionStream;
49
50        let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
51        let addr = listener.local_addr().unwrap();
52
53        let tcp_stream = std::net::TcpStream::connect(addr).unwrap();
54        tcp_stream.set_nonblocking(true).unwrap();
55        let tokio_stream = TcpStream::from_std(tcp_stream).unwrap();
56
57        let conn_stream = ConnectionStream::plain(tokio_stream);
58
59        let optimizer = ConnectionOptimizer::new(&conn_stream);
60        let result = optimizer.optimize();
61        assert!(result.is_ok());
62    }
63
64    #[test]
65    fn test_buffer_size_calculation() {
66        assert_eq!(HIGH_THROUGHPUT_RECV_BUFFER, 16 * 1024 * 1024);
67        assert_eq!(HIGH_THROUGHPUT_RECV_BUFFER, 16_777_216);
68        assert_eq!(HIGH_THROUGHPUT_RECV_BUFFER / 1024, 16384); // KB
69        assert_eq!(HIGH_THROUGHPUT_RECV_BUFFER / (1024 * 1024), 16); // MB
70    }
71
72    #[test]
73    fn test_buffer_size_for_large_articles() {
74        let typical_large_article = 10 * 1024 * 1024; // 10MB
75        let very_large_article = 100 * 1024 * 1024; // 100MB
76        assert!(HIGH_THROUGHPUT_RECV_BUFFER > typical_large_article);
77        assert!(HIGH_THROUGHPUT_RECV_BUFFER < very_large_article);
78    }
79}