Skip to content

Commit 313c96e

Browse files
committed
Add a regression test for the random_order query
1 parent 325ffbc commit 313c96e

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

opsqueue/src/consumer/strategy.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ pub type ChunkStream<'a> = BoxStream<'a, Result<Chunk, sqlx::Error>>;
119119
#[cfg(test)]
120120
#[cfg(feature = "server-logic")]
121121
pub mod test {
122+
use crate::common::chunk::ChunkSize;
123+
use crate::common::StrategicMetadataMap;
124+
122125
use super::*;
123126
use itertools::Itertools;
124127
use sqlx::Row;
@@ -395,4 +398,51 @@ pub mod test {
395398
632, 630, SCAN json_each VIRTUAL TABLE INDEX 0:
396399
");
397400
}
401+
402+
use crate::db::Connection;
403+
use futures::stream::TryStreamExt as _;
404+
405+
#[sqlx::test]
406+
/// Tests whether the 'cutting the deck' technique is working
407+
///
408+
/// We do this by checking whether two selects in a huge amount of available chunks
409+
/// give a different result.
410+
/// (There is a super tiny chance of this test flaking).
411+
pub async fn test_random_strategy_is_random(pool: sqlx::SqlitePool) {
412+
let db_pools = crate::db::DBPools::from_test_pool(&pool);
413+
414+
let mut conn = db_pools.writer_conn().await.unwrap();
415+
let input_chunks: Vec<_> = (0..10_000).map(|x| Some(format!("{x}").into())).collect();
416+
crate::common::submission::db::insert_submission_from_chunks(
417+
None,
418+
input_chunks.clone(),
419+
None,
420+
StrategicMetadataMap::default(),
421+
ChunkSize::default(),
422+
&mut conn,
423+
)
424+
.await
425+
.unwrap();
426+
427+
let mut conn = db_pools.reader_conn().await.unwrap();
428+
let mut query_builder = QueryBuilder::default();
429+
let vals1: Vec<Chunk> = Strategy::Random
430+
.build_query(&mut query_builder, &Default::default())
431+
.build_query_as()
432+
.fetch(conn.get_inner())
433+
.try_collect()
434+
.await
435+
.unwrap();
436+
437+
let mut query_builder = QueryBuilder::default();
438+
let vals2: Vec<Chunk> = Strategy::Random
439+
.build_query(&mut query_builder, &Default::default())
440+
.build_query_as()
441+
.fetch(conn.get_inner())
442+
.try_collect()
443+
.await
444+
.unwrap();
445+
446+
assert!(vals1 != vals2)
447+
}
398448
}

0 commit comments

Comments
 (0)