t/Client_8_0_Async/40_scroll.t (111 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. use Test::More; use Test::Deep; use Test::Exception; use lib 't/lib'; use strict; use warnings; our ( $s, $total_seen, $max_seen ); $ENV{ES_VERSION} = '8_0'; our $es = do "es_async.pl" or die( $@ || $! ); wait_for( $es->indices->delete( index => '_all', ignore => 404 ) ); test_scroll( "No indices", { on_results => \&on_results }, total => 0, max_score => 0, total_seen => 0, max_seen => 0, ); do "index_test_data_7.pl" or die( $@ || $! ); test_scroll( "Match all - on_result", { on_result => \&on_results, size => 10 }, total => 100, max_score => 1, total_seen => 100, max_seen => 1 ); test_scroll( "Match all - on_results", { on_results => \&on_results, size => 10 }, total => 100, max_score => 1, total_seen => 100, max_seen => 10 ); test_scroll( "Query", { body => { query => { term => { color => 'red' } }, suggest => { mysuggest => { text => 'green', term => { field => 'color' } } }, aggs => { switch => { terms => { field => 'switch' } } }, }, size => 10, on_results => \&on_results }, total => 50, max_score => num( 1.0, 0.5 ), aggs => bool(1), suggest => bool(1), total_seen => 50, max_seen => 10 ); test_scroll( "Finish", { on_results => sub { on_results(@_); $s->finish if $total_seen == 30; }, size => 10 }, total => 100, max_score => 1, total_seen => 30, max_seen => 10 ); { # Test auto finish fork protection. my $count = 0; my $s = $es->scroll_helper( size => 5, on_result => sub { $count++ } ); my $pid = fork(); unless ( defined($pid) ) { die "Cannot fork. Lack of resources?"; } unless ($pid) { # Child. Call finish check that its not finished # (the call to finish did nothing). wait_for( $s->finish() ); exit 0; } else { # Wait for children waitpid( $pid, 0 ); is $?, 0, "Child exited without errors"; } ok !$s->is_finished(), "Our Scroll is not finished"; wait_for( $s->start ); is $count, 100, "All documents retrieved"; ok $s->is_finished, "Our scroll is finished"; } # { # # Test Scroll usage attempt in a different process. # my $count = 0; # my $s = $es->scroll_helper( # size => 5, # on_result => sub { $count++ }, # on_error => sub { die @_ } # ); # my $pid = fork(); # unless ( defined($pid) ) { die "Cannot fork. Lack of resources?"; } # unless ($pid) { # eval { wait_for( $s->start ) }; # my $err = $@; # exit( eval { $err->is('Illegal') && 123 } || 999 ); # } # else { # # Wait for children # waitpid( $pid, 0 ); # is $? >> 8, 123, "Child threw Illegal exception"; # } # } # { # # Test valid Scroll usage after initial fork # my $pid = fork(); # unless ( defined($pid) ) { die "Cannot fork. Lack of resources?"; } # unless ($pid) { # my $count = 0; # my $s = $es->scroll_helper( # size => 5, # on_result => sub { $count++ }, # on_error => sub { die @_ } # ); # wait_for( $s->start ); # exit 0; # } # else { # # Wait for children # waitpid( $pid, 0 ); # is $? , 0, "Scroll completed successfully"; # } # } done_testing; wait_for( $es->indices->delete( index => 'test' ) ); #=================================== sub test_scroll { #=================================== my ( $title, $params, %tests ) = @_; $max_seen = $total_seen = 0; subtest $title => sub { $s = $es->scroll_helper( on_start => sub { test_start( $title, \%tests, @_ ) }, %$params ); wait_for( $s->start ); is $total_seen, $tests{total_seen}, "$title - total seen"; is $max_seen, $tests{max_seen}, "$title - max seen"; }; } #=================================== sub test_start { #=================================== my ( $title, $tests, $s ) = @_; is $s->total, $tests->{total}, "$title - total"; cmp_deeply $s->max_score, $tests->{max_score}, "$title - max_score"; cmp_deeply $s->suggest, $tests->{suggest}, "$title - suggest"; cmp_deeply $s->aggregations, $tests->{aggs}, "$title - aggs"; } #=================================== sub on_results { #=================================== $max_seen = @_ if @_ > $max_seen; $total_seen += @_; }