22mod integration {
33 use anyhow:: Result ;
44 use datafusion_postgres:: { ServerOptions , auth:: AuthManager } ;
5- use dotenv:: dotenv ;
5+ // Not using dotenv - all env vars set explicitly in TestServer::start()
66 use rand:: Rng ;
77 use serial_test:: serial;
88 use std:: sync:: Arc ;
@@ -21,24 +21,51 @@ mod integration {
2121 impl TestServer {
2222 async fn start ( ) -> Result < Self > {
2323 let _ = env_logger:: builder ( ) . is_test ( true ) . try_init ( ) ;
24- dotenv ( ) . ok ( ) ;
24+ // Don't use dotenv() - set all environment variables explicitly
25+ // to match the lib tests which work correctly
2526
2627 let test_id = Uuid :: new_v4 ( ) . to_string ( ) ;
2728 let port = 5433 + rand:: rng ( ) . random_range ( 1 ..100 ) as u16 ;
2829
2930 unsafe {
31+ // Core settings
3032 std:: env:: set_var ( "PGWIRE_PORT" , port. to_string ( ) ) ;
3133 std:: env:: set_var ( "TIMEFUSION_TABLE_PREFIX" , format ! ( "test-{}" , test_id) ) ;
34+
35+ // S3/MinIO settings - same as lib tests
36+ std:: env:: set_var ( "AWS_S3_BUCKET" , "timefusion-tests" ) ;
37+ std:: env:: set_var ( "AWS_ACCESS_KEY_ID" , "minioadmin" ) ;
38+ std:: env:: set_var ( "AWS_SECRET_ACCESS_KEY" , "minioadmin" ) ;
39+ std:: env:: set_var ( "AWS_S3_ENDPOINT" , "http://127.0.0.1:9000" ) ;
40+ std:: env:: set_var ( "AWS_DEFAULT_REGION" , "us-east-1" ) ;
41+ std:: env:: set_var ( "AWS_ALLOW_HTTP" , "true" ) ;
42+
43+ // Disable config database
44+ std:: env:: set_var ( "AWS_S3_LOCKING_PROVIDER" , "" ) ;
45+
46+ // Foyer cache settings - use unique cache dir per test to avoid conflicts
47+ std:: env:: set_var ( "TIMEFUSION_FOYER_MEMORY_MB" , "64" ) ;
48+ std:: env:: set_var ( "TIMEFUSION_FOYER_DISK_GB" , "1" ) ;
49+ std:: env:: set_var ( "TIMEFUSION_FOYER_TTL_SECONDS" , "60" ) ;
50+ std:: env:: set_var ( "TIMEFUSION_FOYER_SHARDS" , "4" ) ;
51+ std:: env:: set_var ( "TIMEFUSION_FOYER_CACHE_DIR" , format ! ( "/tmp/timefusion_cache_{}" , test_id) ) ;
3252 }
3353
54+ // Create database OUTSIDE the spawn to ensure table initialization completes
55+ // in the main test context.
56+ let db = Database :: new ( ) . await ?;
57+ let db = Arc :: new ( db) ;
58+
59+ // Pre-warm the table by creating it now, outside the PGWire handler context.
60+ db. get_or_create_table ( "test_project" , "otel_logs_and_spans" ) . await ?;
61+
62+ let db_clone = db. clone ( ) ;
3463 let shutdown = Arc :: new ( Notify :: new ( ) ) ;
3564 let shutdown_clone = shutdown. clone ( ) ;
3665
3766 tokio:: spawn ( async move {
38- let db = Database :: new ( ) . await . expect ( "Failed to create database" ) ;
39- let db = Arc :: new ( db) ;
40- let mut ctx = db. clone ( ) . create_session_context ( ) ;
41- db. setup_session_context ( & mut ctx) . expect ( "Failed to setup context" ) ;
67+ let mut ctx = db_clone. clone ( ) . create_session_context ( ) ;
68+ db_clone. setup_session_context ( & mut ctx) . expect ( "Failed to setup context" ) ;
4269
4370 let opts = ServerOptions :: new ( ) . with_port ( port) . with_host ( "0.0.0.0" . to_string ( ) ) ;
4471 let auth_manager = Arc :: new ( AuthManager :: new ( ) ) ;
@@ -164,109 +191,7 @@ mod integration {
164191
165192 // Verify schema
166193 let rows = client. query ( "SELECT * FROM otel_logs_and_spans WHERE project_id = $1 LIMIT 1" , & [ & "test_project" ] ) . await ?;
167- assert_eq ! ( rows[ 0 ] . columns( ) . len( ) , 87 ) ;
168-
169- Ok ( ( ) )
170- }
171-
172- #[ tokio:: test( flavor = "multi_thread" , worker_threads = 4 ) ]
173- #[ serial]
174- #[ ignore] // Slow integration test - run with: cargo test --test integration_test -- --ignored
175- async fn test_concurrent_postgres_requests ( ) -> Result < ( ) > {
176- let server = TestServer :: start ( ) . await ?;
177- let insert = TestServer :: insert_sql ( ) ;
178-
179- const CLIENTS : usize = 3 ;
180- const OPS_PER_CLIENT : usize = 5 ;
181-
182- // Concurrent inserts with mixed reads
183- let mut handles = vec ! [ ] ;
184- for client_id in 0 ..CLIENTS {
185- let server_port = server. port ;
186- let test_prefix = format ! ( "{}-client-{client_id}" , server. test_id) ;
187- let insert = insert. clone ( ) ;
188-
189- handles. push ( tokio:: spawn ( async move {
190- let client = TestServer :: connect ( server_port) . await ?;
191- for op in 0 ..OPS_PER_CLIENT {
192- let span_id = format ! ( "{test_prefix}-op-{op}" ) ;
193- client
194- . execute (
195- & insert,
196- & [
197- & "test_project" ,
198- & span_id,
199- & format ! ( "concurrent_span_{client_id}_{op}" ) ,
200- & "OK" ,
201- & "Test" ,
202- & "INFO" ,
203- & vec ! [ format!( "Concurrent test summary: client {} op {}" , client_id, op) ] ,
204- ] ,
205- )
206- . await ?;
207-
208- if op % 2 == 0 {
209- client. query ( "SELECT COUNT(*) FROM otel_logs_and_spans WHERE project_id = $1" , & [ & "test_project" ] ) . await ?;
210- }
211- }
212- Ok :: < _ , anyhow:: Error > ( ( ) )
213- } ) ) ;
214- }
215-
216- for handle in handles {
217- handle. await ??;
218- }
219-
220- // Verify results
221- let client = server. client ( ) . await ?;
222- let count: i64 = client
223- . query_one (
224- & format ! (
225- "SELECT COUNT(*) FROM otel_logs_and_spans WHERE project_id = 'test_project' AND id LIKE '{}%'" ,
226- server. test_id
227- ) ,
228- & [ ] ,
229- )
230- . await ?
231- . get ( 0 ) ;
232- assert_eq ! ( count, ( CLIENTS * OPS_PER_CLIENT ) as i64 ) ;
233-
234- // Concurrent read performance test
235- let mut read_handles = vec ! [ ] ;
236- for _ in 0 ..3 {
237- let server_port = server. port ;
238- let test_id = server. test_id . clone ( ) ;
239-
240- read_handles. push ( tokio:: spawn ( async move {
241- let client = TestServer :: connect ( server_port) . await ?;
242- for j in 0 ..5 {
243- match j % 3 {
244- 0 => client. query ( "SELECT COUNT(*) FROM otel_logs_and_spans WHERE project_id = $1" , & [ & "test_project" ] ) . await ?,
245- 1 => {
246- client
247- . query (
248- & format ! ( "SELECT name FROM otel_logs_and_spans WHERE project_id = 'test_project' AND id LIKE '{test_id}%' LIMIT 10" ) ,
249- & [ ] ,
250- )
251- . await ?
252- }
253- _ => {
254- client
255- . query (
256- "SELECT status_code, COUNT(*) FROM otel_logs_and_spans WHERE project_id = 'test_project' GROUP BY status_code" ,
257- & [ ] ,
258- )
259- . await ?
260- }
261- } ;
262- }
263- Ok :: < _ , anyhow:: Error > ( ( ) )
264- } ) ) ;
265- }
266-
267- for handle in read_handles {
268- handle. await ??;
269- }
194+ assert_eq ! ( rows[ 0 ] . columns( ) . len( ) , 89 ) ;
270195
271196 Ok ( ( ) )
272197 }
0 commit comments