4
4
mod buffer_manager;
5
5
mod ffi_cxx;
6
6
mod log;
7
- mod transaction_manager;
7
+ pub mod transaction_manager;
8
8
9
9
use crate :: log:: Log ;
10
10
use buffer_manager:: BufferManager ;
@@ -102,16 +102,11 @@ impl Db {
102
102
103
103
#[ cfg( test) ]
104
104
mod tests {
105
- use crate :: transaction_manager:: Transaction ;
106
105
use crate :: Db ;
107
- use std:: fs:: { self , File , OpenOptions } ;
108
- use std:: io:: { Read , Seek , SeekFrom , Write } ;
106
+ use std:: fs;
109
107
use std:: path:: Path ;
110
- use tempfile:: TempDir ;
111
-
112
- fn get_temp_dir ( ) -> TempDir {
113
- TempDir :: new ( ) . unwrap ( )
114
- }
108
+ use kirunadb_test_helpers:: get_temp_dir;
109
+ use kirunadb_test_helpers:: open_db_err;
115
110
116
111
fn make_path_read_only ( path : & Path ) {
117
112
let mut path_permissions = path. metadata ( ) . unwrap ( ) . permissions ( ) ;
@@ -124,50 +119,6 @@ mod tests {
124
119
assert ! ( db. is_ok( ) ) ;
125
120
}
126
121
127
- fn open_db_err ( path : & Path ) {
128
- let db = Db :: open ( path) ;
129
- assert ! ( db. is_err( ) ) ;
130
- }
131
-
132
- fn commit_ok ( mut t : Transaction ) {
133
- let commit_result = t. commit ( ) ;
134
- assert ! ( commit_result. is_ok( ) ) ;
135
- }
136
-
137
- fn open_log_for_corruption ( db_path : & Path ) -> File {
138
- let log_path = db_path. join ( "LOG" ) ;
139
- OpenOptions :: new ( )
140
- . read ( true )
141
- . write ( true )
142
- . create ( false )
143
- . open ( log_path)
144
- . unwrap ( )
145
- }
146
-
147
- fn expect_u64 ( file : & mut File , offset : u64 , value : u64 ) {
148
- file. seek ( SeekFrom :: Start ( offset) ) . unwrap ( ) ;
149
- let mut u64_buf = [ 0 ; 8 ] ;
150
- file. read_exact ( & mut u64_buf) . unwrap ( ) ;
151
- let existing = u64:: from_ne_bytes ( u64_buf) ;
152
- assert_eq ! ( existing, value) ;
153
- }
154
-
155
- fn replace_u64 ( file : & mut File , offset : u64 , expected : u64 , new : u64 ) {
156
- expect_u64 ( file, offset, expected) ;
157
- file. seek ( SeekFrom :: Start ( offset) ) . unwrap ( ) ;
158
- file. write_all ( & new. to_ne_bytes ( ) ) . unwrap ( ) ;
159
- }
160
-
161
- fn replace_u8 ( file : & mut File , offset : u64 , expected : u8 , new : u8 ) {
162
- file. seek ( SeekFrom :: Start ( offset) ) . unwrap ( ) ;
163
- let mut u8_buf = [ 0 ; 1 ] ;
164
- file. read_exact ( & mut u8_buf) . unwrap ( ) ;
165
- let existing = u8:: from_ne_bytes ( u8_buf) ;
166
- assert_eq ! ( existing, expected) ;
167
- file. seek ( SeekFrom :: Start ( offset) ) . unwrap ( ) ;
168
- file. write_all ( & new. to_ne_bytes ( ) ) . unwrap ( ) ;
169
- }
170
-
171
122
#[ test]
172
123
fn create_db_in_existing_empty_dir ( ) {
173
124
let temp_dir = get_temp_dir ( ) ;
@@ -253,167 +204,5 @@ mod tests {
253
204
let _transaction = db. begin_transaction ( ) ;
254
205
}
255
206
256
- #[ test]
257
- fn sequential_transaction_ids ( ) {
258
- let temp_dir = get_temp_dir ( ) ;
259
- let path = temp_dir. path ( ) ;
260
- let mut db = Db :: open ( path) . unwrap ( ) ;
261
- let t1 = db. begin_transaction ( ) ;
262
- let t1_id = t1. id ( ) ;
263
- commit_ok ( t1) ;
264
- let t2 = db. begin_transaction ( ) ;
265
- let t2_id = t2. id ( ) ;
266
- commit_ok ( t2) ;
267
- assert_ne ! ( t1_id, t2_id) ;
268
- }
269
-
270
- #[ test]
271
- fn interleaved_transaction_ids ( ) {
272
- let temp_dir = get_temp_dir ( ) ;
273
- let path = temp_dir. path ( ) ;
274
- let mut db = Db :: open ( path) . unwrap ( ) ;
275
- let t1 = db. begin_transaction ( ) ;
276
- let t1_id = t1. id ( ) ;
277
- let t2 = db. begin_transaction ( ) ;
278
- let t2_id = t2. id ( ) ;
279
- commit_ok ( t1) ;
280
- commit_ok ( t2) ;
281
- assert_ne ! ( t1_id, t2_id) ;
282
- }
283
-
284
- #[ test]
285
- fn transaction_new_node ( ) {
286
- let temp_dir = get_temp_dir ( ) ;
287
- let path = temp_dir. path ( ) ;
288
- let mut db = Db :: open ( path) . unwrap ( ) ;
289
- let mut transaction = db. begin_transaction ( ) ;
290
- let _new_node_id = transaction. new_art_descriptor_node ( ) ;
291
- commit_ok ( transaction) ;
292
- }
293
-
294
- #[ test]
295
- fn transaction_two_new_nodes ( ) {
296
- let temp_dir = get_temp_dir ( ) ;
297
- let path = temp_dir. path ( ) ;
298
- let mut db = Db :: open ( path) . unwrap ( ) ;
299
- let mut t1 = db. begin_transaction ( ) ;
300
- let t1_new_node_id = t1. new_art_descriptor_node ( ) ;
301
- commit_ok ( t1) ;
302
- let mut t2 = db. begin_transaction ( ) ;
303
- let t2_new_node_id = t2. new_art_descriptor_node ( ) ;
304
- commit_ok ( t2) ;
305
- assert_ne ! ( t1_new_node_id, t2_new_node_id) ;
306
- }
307
-
308
- #[ test]
309
- fn node_id_assignment_consistent_on_reopen ( ) {
310
- let temp_dir = get_temp_dir ( ) ;
311
- let path = temp_dir. path ( ) ;
312
- let n1_id;
313
- {
314
- let mut created_db = Db :: open ( path) . unwrap ( ) ;
315
- let mut transaction = created_db. begin_transaction ( ) ;
316
- n1_id = transaction. new_art_descriptor_node ( ) ;
317
- commit_ok ( transaction) ;
318
- }
319
- {
320
- let mut opened_db = Db :: open ( path) . unwrap ( ) ;
321
- let mut transaction = opened_db. begin_transaction ( ) ;
322
- let n2_id = transaction. new_art_descriptor_node ( ) ;
323
- commit_ok ( transaction) ;
324
- assert_ne ! ( n1_id, n2_id) ;
325
- }
326
- }
327
-
328
- #[ test]
329
- fn node_id_assignment_consistent_on_reopen_two_ids ( ) {
330
- let temp_dir = get_temp_dir ( ) ;
331
- let path = temp_dir. path ( ) ;
332
- let n1_id;
333
- let n2_id;
334
- {
335
- let mut created_db = Db :: open ( path) . unwrap ( ) ;
336
- let mut t1 = created_db. begin_transaction ( ) ;
337
- n1_id = t1. new_art_descriptor_node ( ) ;
338
- commit_ok ( t1) ;
339
- let mut t2 = created_db. begin_transaction ( ) ;
340
- n2_id = t2. new_art_descriptor_node ( ) ;
341
- commit_ok ( t2) ;
342
- }
343
- {
344
- let mut opened_db = Db :: open ( path) . unwrap ( ) ;
345
- let mut transaction = opened_db. begin_transaction ( ) ;
346
- let n3_id = transaction. new_art_descriptor_node ( ) ;
347
- commit_ok ( transaction) ;
348
- assert_ne ! ( n1_id, n3_id) ;
349
- assert_ne ! ( n2_id, n3_id) ;
350
- }
351
- }
352
-
353
- #[ test]
354
- fn node_id_assignment_consistent_on_reopen_two_ids_lower_id_committed_later ( ) {
355
- let temp_dir = get_temp_dir ( ) ;
356
- let path = temp_dir. path ( ) ;
357
- let n1_id;
358
- let n2_id;
359
- {
360
- let mut created_db = Db :: open ( path) . unwrap ( ) ;
361
- let mut t1 = created_db. begin_transaction ( ) ;
362
- n1_id = t1. new_art_descriptor_node ( ) ;
363
- let mut t2 = created_db. begin_transaction ( ) ;
364
- n2_id = t2. new_art_descriptor_node ( ) ;
365
- commit_ok ( t2) ;
366
- commit_ok ( t1) ;
367
- }
368
- {
369
- let mut opened_db = Db :: open ( path) . unwrap ( ) ;
370
- let mut transaction = opened_db. begin_transaction ( ) ;
371
- let n3_id = transaction. new_art_descriptor_node ( ) ;
372
- commit_ok ( transaction) ;
373
- assert_ne ! ( n1_id, n3_id) ;
374
- assert_ne ! ( n2_id, n3_id) ;
375
- }
376
- }
377
-
378
- #[ test]
379
- fn node_id_assignment_corruption_repeated_id ( ) {
380
- let temp_dir = get_temp_dir ( ) ;
381
- let path = temp_dir. path ( ) ;
382
- let n1_id;
383
- let n2_id;
384
- {
385
- let mut created_db = Db :: open ( path) . unwrap ( ) ;
386
- let mut t1 = created_db. begin_transaction ( ) ;
387
- n1_id = t1. new_art_descriptor_node ( ) ;
388
- commit_ok ( t1) ;
389
- let mut t2 = created_db. begin_transaction ( ) ;
390
- n2_id = t2. new_art_descriptor_node ( ) ;
391
- commit_ok ( t2) ;
392
- }
393
- {
394
- let mut log_file = open_log_for_corruption ( path) ;
395
- expect_u64 ( & mut log_file, 1 , n1_id) ;
396
- replace_u64 ( & mut log_file, 10 , n2_id, n1_id) ;
397
- }
398
- open_db_err ( path) ;
399
- }
400
-
401
- #[ test]
402
- fn log_corruption_unknown_type ( ) {
403
- let temp_dir = get_temp_dir ( ) ;
404
- let path = temp_dir. path ( ) ;
405
- {
406
- let mut created_db = Db :: open ( path) . unwrap ( ) ;
407
- let mut transaction = created_db. begin_transaction ( ) ;
408
- transaction. new_art_descriptor_node ( ) ;
409
- commit_ok ( transaction) ;
410
- }
411
- {
412
- let mut log_file = open_log_for_corruption ( path) ;
413
- replace_u8 ( & mut log_file, 0 , 0 , 0xBD ) ;
414
- }
415
- open_db_err ( path) ;
416
- }
417
-
418
207
// TODO(laurynas): missing VERSION tests
419
208
}
0 commit comments