@@ -252,3 +252,77 @@ fn overlay_deletions() {
252252
253253 let _overlay_b = test. update ( ) . 0 ;
254254}
255+
256+ #[ test]
257+ fn overlay_detect_alredy_committed_chain ( ) {
258+ let mut test = Test :: new ( "overlay_wrong_chains" ) ;
259+
260+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 1 ] ) ) ;
261+ let overlay_a = test. update ( ) . 0 ;
262+
263+ test. start_overlay_session ( [ & overlay_a] ) ;
264+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 2 ] ) ) ;
265+ let overlay_b = test. update ( ) . 0 ;
266+
267+ test. start_overlay_session ( [ & overlay_b, & overlay_a] ) ;
268+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 3 ] ) ) ;
269+ let overlay_c = test. update ( ) . 0 ;
270+
271+ let params = nomt:: SessionParams :: default ( )
272+ . witness_mode ( nomt:: WitnessMode :: read_write ( ) )
273+ . overlay ( [ & overlay_c, & overlay_b, & overlay_a] )
274+ . unwrap ( ) ;
275+
276+ test. commit_overlay ( overlay_a) ;
277+ test. commit_overlay ( overlay_b) ;
278+ test. commit_overlay ( overlay_c) ;
279+
280+ assert ! ( test. try_begin_session( params) . is_err( ) ) ;
281+ }
282+
283+ #[ test]
284+ fn overlay_detect_parallel_non_committed_overlay_chain ( ) {
285+ let mut test = Test :: new ( "overlay_detect_parallel_non_committed_overlay_chain" ) ;
286+
287+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 1 ] ) ) ;
288+ let overlay_a = test. update ( ) . 0 ;
289+
290+ test. start_overlay_session ( [ & overlay_a] ) ;
291+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 2 ] ) ) ;
292+ let overlay_b = test. update ( ) . 0 ;
293+
294+ test. start_overlay_session ( [ & overlay_b, & overlay_a] ) ;
295+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 3 ] ) ) ;
296+ let overlay_c = test. update ( ) . 0 ;
297+
298+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 4 ] ) ) ;
299+ let overlay_d = test. update ( ) . 0 ;
300+
301+ test. start_overlay_session ( [ & overlay_d] ) ;
302+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 5 ] ) ) ;
303+ let overlay_e = test. update ( ) . 0 ;
304+
305+ test. start_overlay_session ( [ & overlay_e, & overlay_d] ) ;
306+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 6 ] ) ) ;
307+ let overlay_f = test. update ( ) . 0 ;
308+
309+ test. start_overlay_session ( [ & overlay_f, & overlay_e, & overlay_d] ) ;
310+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 7 ] ) ) ;
311+ let overlay_g = test. update ( ) . 0 ;
312+
313+ test. commit_overlay ( overlay_d) ;
314+ test. commit_overlay ( overlay_e) ;
315+ test. commit_overlay ( overlay_f) ;
316+
317+ let params = nomt:: SessionParams :: default ( )
318+ . witness_mode ( nomt:: WitnessMode :: read_write ( ) )
319+ . overlay ( [ & overlay_c, & overlay_b, & overlay_a] )
320+ . unwrap ( ) ;
321+ assert ! ( test. try_begin_session( params) . is_err( ) ) ;
322+
323+ let params = nomt:: SessionParams :: default ( )
324+ . witness_mode ( nomt:: WitnessMode :: read_write ( ) )
325+ . overlay ( [ & overlay_g] )
326+ . unwrap ( ) ;
327+ assert ! ( test. try_begin_session( params) . is_ok( ) ) ;
328+ }
0 commit comments