Add complete system qualification evidence

This commit is contained in:
ms2k 2026-07-18 14:09:04 +09:00
commit 6952767503

View file

@ -40,7 +40,9 @@ use tokio_tungstenite::{
mod support;
use support::{mint_provider_token, oidc_provider, required_env, revoke_remora_grants};
use support::{
mint_provider_token, oidc_provider, required_env, restore_remora_grants, revoke_remora_grants,
};
type Socket = WebSocketStream<MaybeTlsStream<tokio::net::TcpStream>>;
const BROWSER_ORIGIN: &str = "https://remora.test";
@ -60,6 +62,7 @@ impl Harness {
if std::env::var("REMORA_LIVE_EVENTS_REQUIRE").is_err() {
return None;
}
restore_remora_grants().await.unwrap();
let pool = connect(
&required_env("DATABASE_URL"),
PoolConfig {
@ -156,7 +159,7 @@ impl Harness {
PublicApiConfig {
cursor_secret: b"live-events-fixture-cursor-secret".to_vec(),
member_access_ttl: Duration::from_secs(60),
event_retention: Duration::from_millis(500),
event_retention: Duration::from_secs(2),
event_poll_interval: Duration::from_millis(250),
event_heartbeat_interval: Duration::from_millis(100),
event_ticket_ttl: Duration::from_secs(30),
@ -403,7 +406,7 @@ async fn live_event_replay_authorization_progress_and_resync_converge() {
.await
.unwrap();
let expiring_cursor = fresh["event_cursor"].as_str().unwrap().to_owned();
tokio::time::sleep(Duration::from_millis(600)).await;
tokio::time::sleep(Duration::from_millis(2_100)).await;
let mut expired = harness
.connect(&harness.token, Some(&expiring_cursor))
.await;
@ -749,12 +752,25 @@ async fn next_frame(socket: &mut Socket) -> EventFrameDto {
}
async fn next_job_frame(socket: &mut Socket, job_id: &str) -> EventFrameDto {
loop {
let frame = next_frame(socket).await;
if matches!(&frame, EventFrameDto::JobChanged(event) if event.job_id.as_str() == job_id) {
return frame;
tokio::time::timeout(Duration::from_secs(10), async {
loop {
let frame = next_frame(socket).await;
match &frame {
EventFrameDto::JobChanged(event) if event.job_id.as_str() == job_id => {
return frame;
}
EventFrameDto::ResyncRequired(event) => {
panic!(
"unexpected resync while waiting for job event: {:?}",
event.reason
)
}
_ => {}
}
}
}
})
.await
.expect("job event timeout")
}
async fn next_job_progress(
@ -762,42 +778,54 @@ async fn next_job_progress(
job_id: &str,
completed_bytes: Option<u64>,
) -> EventFrameDto {
loop {
let frame = next_job_frame(socket, job_id).await;
let EventFrameDto::JobChanged(event) = &frame else {
unreachable!()
};
let observed = event
.progress
.0
.as_ref()
.map(|progress| progress.completed_bytes.get());
if observed == completed_bytes {
return frame;
tokio::time::timeout(Duration::from_secs(10), async {
loop {
let frame = next_job_frame(socket, job_id).await;
let EventFrameDto::JobChanged(event) = &frame else {
unreachable!()
};
let observed = event
.progress
.0
.as_ref()
.map(|progress| progress.completed_bytes.get());
if observed == completed_bytes {
return frame;
}
}
}
})
.await
.expect("job progress timeout")
}
async fn next_deletion_frame(socket: &mut Socket, operation_id: &str) -> EventFrameDto {
loop {
let frame = next_frame(socket).await;
if matches!(
&frame,
EventFrameDto::DeletionChanged(event)
if event.operation_id.as_str() == operation_id
) {
return frame;
tokio::time::timeout(Duration::from_secs(10), async {
loop {
let frame = next_frame(socket).await;
if matches!(
&frame,
EventFrameDto::DeletionChanged(event)
if event.operation_id.as_str() == operation_id
) {
return frame;
}
}
}
})
.await
.expect("deletion event timeout")
}
async fn next_resync(socket: &mut Socket) -> EventFrameDto {
loop {
let frame = next_frame(socket).await;
if matches!(frame, EventFrameDto::ResyncRequired(_)) {
return frame;
tokio::time::timeout(Duration::from_secs(10), async {
loop {
let frame = next_frame(socket).await;
if matches!(frame, EventFrameDto::ResyncRequired(_)) {
return frame;
}
}
}
})
.await
.expect("resync event timeout")
}
fn assert_resync(frame: EventFrameDto, expected: ResyncReasonDto) {
@ -807,7 +835,7 @@ fn assert_resync(frame: EventFrameDto, expected: ResyncReasonDto) {
fn assert_resync_reason(frame: EventFrameDto, expected: ResyncReasonDto) -> u64 {
let EventFrameDto::ResyncRequired(frame) = frame else {
panic!("expected resync_required");
panic!("expected resync_required, got {frame:?}");
};
assert_eq!(frame.reason, expected);
frame.sequence.get()