use fetchttp::*;
use std::time::{Duration, Instant};
#[tokio::test]
async fn test_headers_performance() {
let start = Instant::now();
for _ in 0..1000 {
let mut headers = Headers::new();
headers.set("content-type", "application/json").unwrap();
headers.set("accept", "application/json").unwrap();
headers.set("user-agent", "fetchttp/0.1.0").unwrap();
let _ = headers.get("content-type").unwrap();
let _ = headers.has("accept").unwrap();
}
let elapsed = start.elapsed();
assert!(
elapsed < Duration::from_millis(100),
"Headers operations too slow: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_body_operations_performance() {
let start = Instant::now();
for _ in 0..100 {
let stream = ReadableStream::from_text("test body content");
let _text = stream.text().await.unwrap();
let data = serde_json::json!({"key": "value", "number": 42});
let stream = ReadableStream::from_json(&data);
let _parsed: serde_json::Value = stream.json().await.unwrap();
}
let elapsed = start.elapsed();
assert!(
elapsed < Duration::from_millis(500),
"Body operations too slow: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_request_creation_performance() {
let start = Instant::now();
for i in 0..1000 {
let mut init = RequestInit::new();
init.method = Some("POST".to_string());
init.body = Some(ReadableStream::from_text("test body"));
let _request = Request::new(&format!("https://example.com/{}", i), Some(init)).unwrap();
}
let elapsed = start.elapsed();
assert!(
elapsed < Duration::from_millis(200),
"Request creation too slow: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_response_creation_performance() {
let start = Instant::now();
for _ in 0..1000 {
let _response =
Response::new(Some(ReadableStream::from_text("response body")), None).unwrap();
}
let elapsed = start.elapsed();
assert!(
elapsed < Duration::from_millis(100),
"Response creation too slow: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_json_serialization_performance() {
let start = Instant::now();
for _ in 0..100 {
let data = serde_json::json!({
"name": "test",
"value": 42,
"items": [1, 2, 3, 4, 5],
"nested": {
"key": "value"
}
});
let stream = ReadableStream::from_json(&data);
let _parsed: serde_json::Value = stream.json().await.unwrap();
}
let elapsed = start.elapsed();
assert!(
elapsed < Duration::from_millis(200),
"JSON serialization too slow: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_concurrent_operations() {
let start = Instant::now();
let mut handles = Vec::new();
for i in 0..10 {
let handle = tokio::spawn(async move {
for j in 0..100 {
let mut headers = Headers::new();
headers
.set("x-test", &format!("value-{}-{}", i, j))
.unwrap();
let stream = ReadableStream::from_text(&format!("body-{}-{}", i, j));
let _text = stream.text().await.unwrap();
}
});
handles.push(handle);
}
for handle in handles {
handle.await.unwrap();
}
let elapsed = start.elapsed();
assert!(
elapsed < Duration::from_secs(2),
"Concurrent operations too slow: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_memory_usage_stability() {
for _ in 0..1000 {
let mut headers = Headers::new();
headers.set("content-type", "application/json").unwrap();
let request = Request::new("https://example.com", None).unwrap();
let _cloned = request.clone_request().unwrap();
let response = Response::new(Some(ReadableStream::from_text("test")), None).unwrap();
let _cloned = response.clone_response().unwrap();
}
}