Prepare for 1.0020
[dbsrgits/DBM-Deep.git] / t / 41_transaction_multilevel.t
1 use strict;
2 use Test::More;
3 use Test::Deep;
4 use t::common qw( new_dbm );
5
6 use_ok( 'DBM::Deep' );
7
8 my $dbm_factory = new_dbm(
9     locking   => 1,
10     autoflush => 1,
11     num_txns  => 2,
12 );
13 while ( my $dbm_maker = $dbm_factory->() ) {
14     my $db1 = $dbm_maker->();
15     next unless $db1->supports('transactions');
16     my $db2 = $dbm_maker->();
17
18     $db1->{x} = { xy => { foo => 'y' } };
19     is( $db1->{x}{xy}{foo}, 'y', "Before transaction, DB1's X is Y" );
20     is( $db2->{x}{xy}{foo}, 'y', "Before transaction, DB2's X is Y" );
21
22     cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
23     cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
24
25     cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
26     cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
27
28     cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
29     cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
30
31     $db1->begin_work;
32
33         cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
34         cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
35
36         cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
37         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
38
39         cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
40         cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
41
42         is( $db1->{x}{xy}{foo}, 'y', "After transaction, DB1's X is Y" );
43         is( $db2->{x}{xy}{foo}, 'y', "After transaction, DB2's X is Y" );
44
45         $db1->{x} = { yz => { bar => 30 } };
46         ok( !exists $db1->{x}{xy}, "DB1: After reassignment of X, X->XY is gone" );
47         is( $db2->{x}{xy}{foo}, 'y', "DB2: After reassignment of DB1 X, X is Y" );
48
49         cmp_bag( [ keys %{$db1->{x}} ], [qw( yz )], "DB1->X keys correct" );
50         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
51
52     $db1->rollback;
53
54     cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
55     cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
56
57     cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
58     cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
59
60     cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
61     cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
62
63     is( $db1->{x}{xy}{foo}, 'y', "Before transaction, DB1's X is Y" );
64     is( $db2->{x}{xy}{foo}, 'y', "Before transaction, DB2's X is Y" );
65
66     $db1->begin_work;
67
68         cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
69         cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
70
71         cmp_bag( [ keys %{$db1->{x}} ], [qw( xy )], "DB1->X keys correct" );
72         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
73
74         cmp_bag( [ keys %{$db1->{x}{xy}} ], [qw( foo )], "DB1->X->XY keys correct" );
75         cmp_bag( [ keys %{$db2->{x}{xy}} ], [qw( foo )], "DB2->X->XY keys correct" );
76
77         is( $db1->{x}{xy}{foo}, 'y', "After transaction, DB1's X is Y" );
78         is( $db2->{x}{xy}{foo}, 'y', "After transaction, DB2's X is Y" );
79
80         $db1->{x} = { yz => { bar => 30 } };
81         ok( !exists $db1->{x}{xy}, "DB1: After reassignment of X, X->XY is gone" );
82         is( $db2->{x}{xy}{foo}, 'y', "DB2: After reassignment of DB1 X, X->YZ is Y" );
83
84         cmp_bag( [ keys %{$db1->{x}} ], [qw( yz )], "DB1->X keys correct" );
85         cmp_bag( [ keys %{$db2->{x}} ], [qw( xy )], "DB2->X keys correct" );
86
87     $db1->commit;
88
89     cmp_bag( [ keys %$db1 ], [qw( x )], "DB1 keys correct" );
90     cmp_bag( [ keys %$db2 ], [qw( x )], "DB2 keys correct" );
91
92     cmp_bag( [ keys %{$db1->{x}} ], [qw( yz )], "DB1->X keys correct" );
93     cmp_bag( [ keys %{$db2->{x}} ], [qw( yz )], "DB2->X keys correct" );
94
95     cmp_bag( [ keys %{$db1->{x}{yz}} ], [qw( bar )], "DB1->X->XY keys correct" );
96     cmp_bag( [ keys %{$db2->{x}{yz}} ], [qw( bar )], "DB2->X->XY keys correct" );
97 }
98
99 done_testing;