@@ -119,6 +119,9 @@ pub type ChunkStream<'a> = BoxStream<'a, Result<Chunk, sqlx::Error>>;
119119#[ cfg( test) ]
120120#[ cfg( feature = "server-logic" ) ]
121121pub 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