@@ -660,10 +660,15 @@ where
660660}
661661
662662#[ cfg( test) ]
663+
663664mod tests {
664665 use super :: { drop_database, DUMMY_MIGRATION , MIGRATIONS } ;
665666 use crate :: postgres_store:: PostgresPlaintextBackend ;
666667 use api:: define_kv_store_tests;
668+ use api:: kv_store:: KvStore ;
669+ use api:: types:: { DeleteObjectRequest , GetObjectRequest , KeyValue , PutObjectRequest } ;
670+
671+ use bytes:: Bytes ;
667672 use tokio:: sync:: OnceCell ;
668673 use tokio_postgres:: NoTls ;
669674
@@ -779,4 +784,70 @@ mod tests {
779784
780785 drop_database ( POSTGRES_ENDPOINT , DEFAULT_DB , vss_db, NoTls ) . await . unwrap ( ) ;
781786 }
787+
788+ #[ tokio:: test]
789+ async fn supports_objects_up_to_non_large_object_threshold ( ) {
790+ let vss_db = "supports_objects_up_to_non_large_object_threshold" ;
791+ let _ = drop_database ( POSTGRES_ENDPOINT , DEFAULT_DB , vss_db, NoTls ) . await ;
792+
793+ const MAXIMUM_SUPPORTED_VALUE_SIZE : usize = 1024 * 1024 * 1024 ;
794+ const PROTOCOL_OVERHEAD_MARGIN : usize = 150 ;
795+
796+ // Construct entry that's for a field that's the maximum size of a non-"large_object" object
797+ let large_value = vec ! [ 0u8 ; MAXIMUM_SUPPORTED_VALUE_SIZE - PROTOCOL_OVERHEAD_MARGIN ] ;
798+ let kv = KeyValue { key : "k1" . into ( ) , version : 0 , value : Bytes :: from ( large_value) } ;
799+
800+ {
801+ let store =
802+ PostgresPlaintextBackend :: new ( POSTGRES_ENDPOINT , DEFAULT_DB , vss_db) . await . unwrap ( ) ;
803+ let ( start, end) = store. migrate_vss_database ( MIGRATIONS ) . await . unwrap ( ) ;
804+ assert_eq ! ( start, MIGRATIONS_START ) ;
805+ assert_eq ! ( end, MIGRATIONS_END ) ;
806+ assert_eq ! ( store. get_upgrades_list( ) . await , [ MIGRATIONS_START ] ) ;
807+ assert_eq ! ( store. get_schema_version( ) . await , MIGRATIONS_END ) ;
808+
809+ // Round trip with non-large_object of threshold size
810+
811+ store
812+ . put (
813+ "token" . to_string ( ) ,
814+ PutObjectRequest {
815+ store_id : "store_id" . to_string ( ) ,
816+ global_version : None ,
817+ transaction_items : vec ! [ kv] ,
818+ delete_items : vec ! [ ] ,
819+ } ,
820+ )
821+ . await
822+ . unwrap ( ) ;
823+
824+ let resp_kv = store
825+ . get (
826+ "token" . to_string ( ) ,
827+ GetObjectRequest { store_id : "store_id" . to_string ( ) , key : "k1" . to_string ( ) } ,
828+ )
829+ . await
830+ . unwrap ( )
831+ . value
832+ . unwrap ( ) ;
833+ assert_eq ! (
834+ resp_kv. value. len( ) ,
835+ MAXIMUM_SUPPORTED_VALUE_SIZE - PROTOCOL_OVERHEAD_MARGIN
836+ ) ;
837+ assert ! ( resp_kv. value. iter( ) . all( |& b| b == 0 ) ) ;
838+
839+ store
840+ . delete (
841+ "token" . to_string ( ) ,
842+ DeleteObjectRequest {
843+ store_id : "store_id" . to_string ( ) ,
844+ key_value : Some ( resp_kv) ,
845+ } ,
846+ )
847+ . await
848+ . unwrap ( ) ;
849+ } ;
850+
851+ drop_database ( POSTGRES_ENDPOINT , DEFAULT_DB , vss_db, NoTls ) . await . unwrap ( ) ;
852+ }
782853}
0 commit comments