From cd7b73b108efc5bc75f8f70364425ebeb9ba3a62 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 19 Feb 2020 07:39:49 -0500 Subject: [PATCH] Port changes from 30rooms/70publicroomslist.pl to 50federation/40publicroomlist.pl to fix flaky test. --- tests/50federation/40publicroomlist.pl | 137 +++++++++++++------------ 1 file changed, 74 insertions(+), 63 deletions(-) diff --git a/tests/50federation/40publicroomlist.pl b/tests/50federation/40publicroomlist.pl index a44f27cc4..3eb3de4ff 100644 --- a/tests/50federation/40publicroomlist.pl +++ b/tests/50federation/40publicroomlist.pl @@ -29,74 +29,85 @@ visibility => "public", room_alias_name => $alias_local, %$room, - ) + )->on_done( sub { + my ( $room_id ) = @_; + log_if_fail "Created room $room_id with alias $alias_local"; + }); } keys %rooms ) ->then( sub { - $client->do_request_json( - method => "GET", - hostname => $server_name, - uri => "/v1/publicRooms", - ) - })->then( sub { - my ( $body ) = @_; - - log_if_fail "publicRooms", $body; - - assert_json_keys( $body, qw( chunk )); - assert_json_list( $body->{chunk} ); - - my %seen = map { - $_ => 0, - } keys ( %rooms ); - - foreach my $room ( @{ $body->{chunk} } ) { - assert_json_keys( $room, - qw( world_readable guest_can_join num_joined_members ) - ); - - my $name = $room->{name}; - my $topic = $room->{topic}; - my $canonical_alias = $room->{canonical_alias}; - - my $aliases = $room->{aliases}; - defined $aliases or next; - - foreach my $alias ( @{$aliases} ) { - foreach my $alias_local ( keys %rooms ) { - $alias =~ m/^\Q#$alias_local:\E/ or next; - - my $room_config = $rooms{$alias_local}; - - log_if_fail "Alias", $alias_local; - log_if_fail "Room", $room; - - assert_eq( $canonical_alias, $alias, "canonical alias" ); - assert_eq( $room->{num_joined_members}, 1, "num_joined_members" ); - - if( defined $name ) { - assert_eq( $room_config->{name}, $name, 'room name' ); - } - else { - defined $room_config->{name} and die "Expected not to find a name"; - } - - if( defined $topic ) { - assert_eq( $room_config->{topic}, $topic, 'room topic' ); - } - else { - defined $room_config->{topic} and die "Expected not to find a topic"; + my $iter = 0; + retry_until_success { + $client->do_request_json( + method => "GET", + hostname => $server_name, + uri => "/v1/publicRooms", + )->then( sub { + my ($body) = @_; + + $iter++; + log_if_fail "Iteration $iter: publicRooms result", $body; + + assert_json_keys($body, qw(chunk)); + assert_json_list($body->{chunk}); + + my %seen = map { + $_ => 0, + } keys(%rooms); + + foreach my $room (@{$body->{chunk}}) { + assert_json_keys($room, + qw(world_readable guest_can_join num_joined_members) + ); + + my $name = $room->{name}; + my $topic = $room->{topic}; + my $canonical_alias = $room->{canonical_alias}; + + my $aliases = $room->{aliases}; + defined $aliases or next; + + foreach my $alias (@{$aliases}) { + foreach my $alias_local (keys %rooms) { + $alias =~ m/^\Q#$alias_local:\E/ or next; + + my $room_config = $rooms{$alias_local}; + + log_if_fail "Alias", $alias_local; + log_if_fail "Room", $room; + + assert_eq($canonical_alias, $alias, "canonical alias"); + assert_eq($room->{num_joined_members}, 1, "num_joined_members"); + + if (defined $name) { + assert_eq($room_config->{name}, $name, 'room name'); + } + else { + defined $room_config->{name} and die "Expected not to find a name"; + } + + if (defined $topic) { + assert_eq($room_config->{topic}, $topic, 'room topic'); + } + else { + defined $room_config->{topic} and die "Expected not to find a topic"; + } + + $seen{$alias_local} = 1; + last; + } } - - $seen{$alias_local} = 1; - last; } - } - } - foreach my $key ( keys %seen ) { - $seen{$key} or die "Did not find a /publicRooms result for $key"; - } + foreach my $key (keys %seen) { + $seen{$key} or die "Did not find a /publicRooms result for $key"; + } - Future->done(1); + Future->done(1); + })->on_fail(sub { + my ($exc) = @_; + chomp $exc; + log_if_fail "Iteration $iter: not ready yet: $exc"; + }); + }; }) }