Add complete system qualification evidence
This commit is contained in:
parent
775dd61963
commit
6952767503
1 changed files with 1256 additions and 84 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue