[Rt-commit] rt branch, 4.0/restore-principal-in-validator, created. rt-4.0.10-95-ga39f5fa

Ruslan Zakirov ruz at bestpractical.com
Fri Mar 15 10:42:31 EDT 2013


The branch, 4.0/restore-principal-in-validator has been created
        at  a39f5fac6465f3e892d2e02723f030cbf36646f4 (commit)

- Log -----------------------------------------------------------------
commit 21c7ddf7189e35a2173636a91455165d506c9dc3
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Mar 15 18:24:53 2013 +0400

    move helpers into RT::Test from a test file

diff --git a/lib/RT/Test.pm b/lib/RT/Test.pm
index d1eb05f..efd856a 100644
--- a/lib/RT/Test.pm
+++ b/lib/RT/Test.pm
@@ -705,6 +705,39 @@ sub load_or_create_user {
     return $obj;
 }
 
+
+sub load_or_create_group {
+    my $self = shift;
+    my $name = shift;
+    my %args = (@_);
+
+    my $group = RT::Group->new( RT->SystemUser );
+    $group->LoadUserDefinedGroup( $name );
+    unless ( $group->id ) {
+        my ($id, $msg) = $group->CreateUserDefinedGroup(
+            Name => $name,
+        );
+        die "$msg" unless $id;
+    }
+
+    if ( $args{Members} ) {
+        my $cur = $group->MembersObj;
+        while ( my $entry = $cur->Next ) {
+            my ($status, $msg) = $entry->Delete;
+            die "$msg" unless $status;
+        }
+
+        foreach my $new ( @{ $args{Members} } ) {
+            my ($status, $msg) = $group->AddMember(
+                ref($new)? $new->id : $new,
+            );
+            die "$msg" unless $status;
+        }
+    }
+
+    return $group;
+}
+
 =head2 load_or_create_queue
 
 =cut
@@ -993,6 +1026,36 @@ sub run_mailgate {
     $self->run_and_capture(%args);
 }
 
+sub run_validator {
+    my $self = shift;
+    my %args = (check => 1, resolve => 0, force => 1, @_ );
+
+    my $validator_path = "$RT::SbinPath/rt-validator";
+
+    my $cmd = $validator_path;
+    die "Couldn't find $cmd command" unless -f $cmd;
+
+    while( my ($k,$v) = each %args ) {
+        next unless $v;
+        $cmd .= " --$k '$v'";
+    }
+    $cmd .= ' 2>&1';
+
+    require IPC::Open2;
+    my ($child_out, $child_in);
+    my $pid = IPC::Open2::open2($child_out, $child_in, $cmd);
+    close $child_in;
+
+    my $result = do { local $/; <$child_out> };
+    close $child_out;
+    waitpid $pid, 0;
+
+    DBIx::SearchBuilder::Record::Cachable->FlushCache
+        if $args{'resolve'};
+
+    return ($?, $result);
+}
+
 sub run_and_capture {
     my $self = shift;
     my %args = @_;
diff --git a/t/validator/group_members.t b/t/validator/group_members.t
index fbe7580..e920327 100644
--- a/t/validator/group_members.t
+++ b/t/validator/group_members.t
@@ -4,102 +4,43 @@ use warnings;
 
 use RT::Test tests => 60;
 
-sub load_or_create_group {
-    my $name = shift;
-    my %args = (@_);
-
-    my $group = RT::Group->new( RT->SystemUser );
-    $group->LoadUserDefinedGroup( $name );
-    unless ( $group->id ) {
-        my ($id, $msg) = $group->CreateUserDefinedGroup(
-            Name => $name,
-        );
-        die "$msg" unless $id;
-    }
-
-    if ( $args{Members} ) {
-        my $cur = $group->MembersObj;
-        while ( my $entry = $cur->Next ) {
-            my ($status, $msg) = $entry->Delete;
-            die "$msg" unless $status;
-        }
-
-        foreach my $new ( @{ $args{Members} } ) {
-            my ($status, $msg) = $group->AddMember(
-                ref($new)? $new->id : $new,
-            );
-            die "$msg" unless $status;
-        }
-    }
-    
-    return $group;
-}
-
-my $validator_path = "$RT::SbinPath/rt-validator";
-sub run_validator {
-    my %args = (check => 1, resolve => 0, force => 1, @_ );
-
-    my $cmd = $validator_path;
-    die "Couldn't find $cmd command" unless -f $cmd;
-
-    while( my ($k,$v) = each %args ) {
-        next unless $v;
-        $cmd .= " --$k '$v'";
-    }
-    $cmd .= ' 2>&1';
-
-    require IPC::Open2;
-    my ($child_out, $child_in);
-    my $pid = IPC::Open2::open2($child_out, $child_in, $cmd);
-    close $child_in;
-
-    my $result = do { local $/; <$child_out> };
-    close $child_out;
-    waitpid $pid, 0;
-
-    DBIx::SearchBuilder::Record::Cachable->FlushCache
-        if $args{'resolve'};
-
-    return ($?, $result);
-}
-
 {
-    my ($ecode, $res) = run_validator();
+    my ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 }
 
 {
-    my $group = load_or_create_group('test', Members => [] );
+    my $group = RT::Test->load_or_create_group('test', Members => [] );
     ok $group, "loaded or created a group";
 
-    my ($ecode, $res) = run_validator();
+    my ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 }
 
 # G1 -> G2
 {
-    my $group1 = load_or_create_group( 'test1', Members => [] );
+    my $group1 = RT::Test->load_or_create_group( 'test1', Members => [] );
     ok $group1, "loaded or created a group";
 
-    my $group2 = load_or_create_group( 'test2', Members => [ $group1 ]);
+    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";
 
-    my ($ecode, $res) = run_validator();
+    my ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 
     $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
     DBIx::SearchBuilder::Record::Cachable->FlushCache;
     ok !$group2->HasMemberRecursively( $group1->id ), "has no member, broken DB";
 
-    ($ecode, $res) = run_validator(resolve => 1);
+    ($ecode, $res) = RT::Test->run_validator(resolve => 1);
 
     ok $group2->HasMember( $group1->id ), "has member";
     ok $group2->HasMemberRecursively( $group1->id ), "has member";
 
-    ($ecode, $res) = run_validator();
+    ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 }
 
@@ -109,7 +50,7 @@ sub run_validator {
     for (1..5) {
         my $child = @groups? $groups[-1]: undef;
 
-        my $group = load_or_create_group( 'test'. $_, Members => [ $child? ($child): () ] );
+        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"
@@ -120,7 +61,7 @@ sub run_validator {
         push @groups, $group;
     }
 
-    my ($ecode, $res) = run_validator();
+    my ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 
     $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
@@ -128,7 +69,7 @@ sub run_validator {
 
     ok !$groups[1]->HasMemberRecursively( $groups[0]->id ), "has no member, broken DB";
 
-    ($ecode, $res) = run_validator(resolve => 1);
+    ($ecode, $res) = RT::Test->run_validator(resolve => 1);
 
     for ( my $i = 1; $i < @groups; $i++ ) {
         ok $groups[$i]->HasMember( $groups[$i-1]->id ), "has member";
@@ -136,7 +77,7 @@ sub run_validator {
             foreach 0..$i-1;
     }
 
-    ($ecode, $res) = run_validator();
+    ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 }
 
@@ -144,34 +85,34 @@ sub run_validator {
 {
     my @groups;
     for (2..5) {
-        my $group = load_or_create_group( 'test'. $_, Members => [] );
+        my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [] );
         ok $group, "loaded or created a group";
         push @groups, $group;
     }
 
-    my $parent = load_or_create_group( 'test1', Members => \@groups );
+    my $parent = RT::Test->load_or_create_group( 'test1', Members => \@groups );
     ok $parent, "loaded or created a group";
 
-    my ($ecode, $res) = run_validator();
+    my ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 }
 
 # G1 <- (G2, G3, G4) <- G5
 {
-    my $gchild = load_or_create_group( 'test5', Members => [] );
+    my $gchild = RT::Test->load_or_create_group( 'test5', Members => [] );
     ok $gchild, "loaded or created a group";
     
     my @groups;
     for (2..4) {
-        my $group = load_or_create_group( 'test'. $_, Members => [ $gchild ] );
+        my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [ $gchild ] );
         ok $group, "loaded or created a group";
         push @groups, $group;
     }
 
-    my $parent = load_or_create_group( 'test1', Members => \@groups );
+    my $parent = RT::Test->load_or_create_group( 'test1', Members => \@groups );
     ok $parent, "loaded or created a group";
 
-    my ($ecode, $res) = run_validator();
+    my ($ecode, $res) = RT::Test->run_validator();
     is $res, '', 'empty result';
 }
 

commit 1d0f69fde472a296863661f6489aa184523d2067
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Mar 15 18:29:41 2013 +0400

    validator: create Principal in force resolve mode
    
    If principal is missing in {Group,User}->Principal relation then
    user have two choices: delete pointing object or create
    new principal record. It was decided to do nothing in auto-force
    -resolve mode. However, absent principal means that $group->Disabled
    returns undef and we use that call in other places. undef may cause
    infinite loop while trying to restore other records, for example CGM.
    
    prompt_action is only used in this place, so it's ok to change its
    behavior.

diff --git a/sbin/rt-validator.in b/sbin/rt-validator.in
index dcf72b8..5d981e6 100644
--- a/sbin/rt-validator.in
+++ b/sbin/rt-validator.in
@@ -222,7 +222,7 @@ foreach my $table ( qw(Users Groups) ) {
             bind_values => [ $type ],
             action => sub {
                 my $id = shift;
-                return unless my $a = prompt_action( ['Delete', 'create'], $msg );
+                return unless my $a = prompt_action( ['Create', 'delete'], $msg );
 
                 if ( $a eq 'd' ) {
                     delete_record( $table, $id );
@@ -1104,7 +1104,7 @@ sub prompt_action {
     my $token = shift || join ':', caller;
 
     return '' unless $opt{'resolve'};
-    return '' if $opt{'force'};
+    return lc substr $actions->[0], 0, 1 if $opt{'force'};
     return $cached_answer{ $token } if exists $cached_answer{ $token };
 
     print $msg, "\n";

commit a39f5fac6465f3e892d2e02723f030cbf36646f4
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Mar 15 18:38:27 2013 +0400

    test edge case in validator

diff --git a/t/validator/group_members.t b/t/validator/group_members.t
index e920327..bc46f37 100644
--- a/t/validator/group_members.t
+++ b/t/validator/group_members.t
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 60;
+use RT::Test tests => 63;
 
 {
     my ($ecode, $res) = RT::Test->run_validator();
@@ -116,3 +116,20 @@ use RT::Test tests => 60;
     is $res, '', 'empty result';
 }
 
+# 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);
+    ok $res;
+
+    ($ecode, $res) = RT::Test->run_validator();
+    is $res, '', 'empty result';
+}

-----------------------------------------------------------------------


More information about the Rt-commit mailing list