1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
use strict;
use warnings;
use RT::Test tests => undef;
RT::Test->db_is_valid;
{
my $group = RT::Test->load_or_create_group('test', Members => [] );
ok $group, "loaded or created a group";
RT::Test->db_is_valid;
}
# G1 -> G2
{
my $group1 = RT::Test->load_or_create_group( 'test1', Members => [] );
ok $group1, "loaded or created a group";
my $group2 = RT::Test->load_or_create_group( 'test2', Members => [ $group1 ]);
ok $group2, "loaded or created a group";
ok $group2->HasMember( $group1->id ), "has member";
ok $group2->HasMemberRecursively( $group1->id ), "has member";
RT::Test->db_is_valid;
$RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
DBIx::SearchBuilder::Record::Cachable->FlushCache;
ok !$group2->HasMemberRecursively( $group1->id ), "has no member, broken DB";
my ($ecode, $res) = RT::Test->run_validator(resolve => 1);
isnt($ecode, 0, 'non-zero exit code');
ok $group2->HasMember( $group1->id ), "has member";
ok $group2->HasMemberRecursively( $group1->id ), "has member";
RT::Test->db_is_valid;
}
# G1 <- G2 <- G3 <- G4 <- G5
{
my @groups;
for (1..5) {
my $child = @groups? $groups[-1]: undef;
my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [ $child? ($child): () ] );
ok $group, "loaded or created a group";
ok $group->HasMember( $child->id ), "has member"
if $child;
ok $group->HasMemberRecursively( $_->id ), "has member"
foreach @groups;
push @groups, $group;
}
RT::Test->db_is_valid;
$RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
DBIx::SearchBuilder::Record::Cachable->FlushCache;
ok !$groups[1]->HasMemberRecursively( $groups[0]->id ), "has no member, broken DB";
my ($ecode, $res) = RT::Test->run_validator(resolve => 1);
isnt($ecode, 0, 'non-zero exit code');
for ( my $i = 1; $i < @groups; $i++ ) {
ok $groups[$i]->HasMember( $groups[$i-1]->id ), "has member";
ok $groups[$i]->HasMemberRecursively( $groups[$_]->id ), "has member"
foreach 0..$i-1;
}
RT::Test->db_is_valid;
}
# G1 <- (G2, G3, G4, G5)
{
my @groups;
for (2..5) {
my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [] );
ok $group, "loaded or created a group";
push @groups, $group;
}
my $parent = RT::Test->load_or_create_group( 'test1', Members => \@groups );
ok $parent, "loaded or created a group";
RT::Test->db_is_valid;
}
# G1 <- (G2, G3, G4) <- G5
{
my $gchild = RT::Test->load_or_create_group( 'test5', Members => [] );
ok $gchild, "loaded or created a group";
my @groups;
for (2..4) {
my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [ $gchild ] );
ok $group, "loaded or created a group";
push @groups, $group;
}
my $parent = RT::Test->load_or_create_group( 'test1', Members => \@groups );
ok $parent, "loaded or created a group";
RT::Test->db_is_valid;
}
# group without principal record and cgm records
# was causing infinite loop as principal was not created
{
my $group = RT::Test->load_or_create_group('Test');
ok $group && $group->id, 'loaded or created group';
my $dbh = $group->_Handle->dbh;
$dbh->do('DELETE FROM Principals WHERE id = ?', {RaiseError => 1}, $group->id);
$dbh->do('DELETE FROM CachedGroupMembers WHERE GroupId = ?', {RaiseError => 1}, $group->id);
DBIx::SearchBuilder::Record::Cachable->FlushCache;
my ($ecode, $res) = RT::Test->run_validator(resolve => 1, timeout => 30);
isnt($ecode, 0, 'non-zero exit code');
RT::Test->db_is_valid;
}
done_testing;
|