in glean-core/src/upload/mod.rs [1881:1960]
fn maximum_wait_attemps_is_enforced() {
let (glean, dir) = new_glean(None);
let mut upload_manager = PingUploadManager::no_policy(dir.path());
// Define a max_wait_attemps policy, this is disabled for tests by default.
let max_wait_attempts = 3;
upload_manager
.policy
.set_max_wait_attempts(Some(max_wait_attempts));
// Add a rate limiter to the upload mangager with max of 1 ping 5secs.
//
// We arbitrarily set the maximum pings per interval to a very low number,
// when the rate limiter reaches it's limit get_upload_task returns a PingUploadTask::Wait,
// which will allow us to test the limitations around returning too many of those in a row.
let secs_per_interval = 5;
let max_pings_per_interval = 1;
upload_manager.set_rate_limiter(secs_per_interval, max_pings_per_interval);
// Enqueue two pings
upload_manager.enqueue_ping(
&glean,
PingPayload {
document_id: Uuid::new_v4().to_string(),
upload_path: PATH.into(),
json_body: "".into(),
headers: None,
body_has_info_sections: true,
ping_name: "ping-name".into(),
uploader_capabilities: vec![],
},
);
upload_manager.enqueue_ping(
&glean,
PingPayload {
document_id: Uuid::new_v4().to_string(),
upload_path: PATH.into(),
json_body: "".into(),
headers: None,
body_has_info_sections: true,
ping_name: "ping-name".into(),
uploader_capabilities: vec![],
},
);
// Get the first ping, it should be returned normally.
match upload_manager.get_upload_task(&glean, false) {
PingUploadTask::Upload { .. } => {}
_ => panic!("Expected upload manager to return the next request!"),
}
// Try to get the next ping,
// we should be throttled and thus get a PingUploadTask::Wait.
// Check that we are indeed allowed to get this response as many times as expected.
for _ in 0..max_wait_attempts {
let task = upload_manager.get_upload_task(&glean, false);
assert!(task.is_wait());
}
// Check that after we get PingUploadTask::Wait the allowed number of times,
// we then get PingUploadTask::Done.
assert_eq!(
upload_manager.get_upload_task(&glean, false),
PingUploadTask::done()
);
// Wait for the rate limiter to allow upload tasks again.
thread::sleep(Duration::from_secs(secs_per_interval));
// Check that we are allowed again to get pings.
let task = upload_manager.get_upload_task(&glean, false);
assert!(task.is_upload());
// And once we are done we don't need to wait anymore.
assert_eq!(
upload_manager.get_upload_task(&glean, false),
PingUploadTask::done()
);
}