From 8d7b9a5905051ca2b30ccbeffe51c7d9676c6991 Mon Sep 17 00:00:00 2001 From: Marius Kittler Date: Thu, 22 Aug 2024 17:18:44 +0200 Subject: [PATCH] Ensure full test coverage of test code * Remove dead code * Avoid skipping tests * Mark lines only executed in case tests are failing or in case tests are executed with verbose logging as uncoverable * Mark lines executed in sub processes where coverage cannot be collected as uncoverable * Fix attempts to mark lines as uncoverable * See https://progress.opensuse.org/issues/165396 --- codecov.yml | 2 +- t/05-scheduler-full.t | 7 +- t/05-scheduler-restart-and-duplicate.t | 6 +- t/10-jobs.t | 2 +- t/16-utils.t | 1 - t/20-stale-job-detection.t | 3 +- t/26-controllerrunning.t | 1 - t/33-developer_mode.t | 2 +- t/43-scheduling-and-worker-scalability.t | 6 +- t/api/02-assets.t | 8 +- t/api/08-jobtemplates.t | 16 +- t/api/14-plugin_obs_rsync_async.t | 24 ++- t/full-stack.t | 5 +- t/lib/OpenQA/SeleniumTest.pm | 2 +- t/lib/OpenQA/Test/FakeWebSocketTransaction.pm | 4 +- t/lib/OpenQA/Test/Utils.pm | 164 ++++++------------ t/ui/01-list.t | 18 +- t/ui/16-activity-view.t | 4 +- t/ui/27-plugin_obs_rsync_gru.t | 4 +- 19 files changed, 98 insertions(+), 181 deletions(-) diff --git a/codecov.yml b/codecov.yml index 396b2fca53b..cfae565206f 100644 --- a/codecov.yml +++ b/codecov.yml @@ -13,7 +13,7 @@ coverage: default: target: 98 tests: - target: 99.6 + target: 100.0 paths: - t/ patch: diff --git a/t/05-scheduler-full.t b/t/05-scheduler-full.t index 320adfbcff6..4b8b8b6bcfb 100644 --- a/t/05-scheduler-full.t +++ b/t/05-scheduler-full.t @@ -30,7 +30,7 @@ use OpenQA::Worker::WebUIConnection; use OpenQA::Utils; require OpenQA::Test::Database; use OpenQA::Test::Utils qw( - mock_service_ports setup_mojo_app_with_default_worker_timeout + setup_mojo_app_with_default_worker_timeout setup_fullstack_temp_dir create_user_for_workers create_webapi setup_share_dir create_websocket_server stop_service unstable_worker @@ -55,9 +55,8 @@ my $api_key = $api_credentials->key; my $api_secret = $api_credentials->secret; # create web UI and websocket server -mock_service_ports; my $mojoport = service_port 'webui'; -my $ws = create_websocket_server(undef, 0, 1, 1); +my $ws = create_websocket_server(undef, 0, 1); my $webapi = create_webapi($mojoport, sub { }); my @workers; @@ -272,7 +271,7 @@ subtest 'Websocket server - close connection test' => sub { my $log; # create unstable ws - $ws = create_websocket_server(undef, 1, 0); + $ws = create_websocket_server(undef, 1); @workers = create_worker(@$worker_settings, 2, \$log); my $found_connection_closed_in_log = 0; diff --git a/t/05-scheduler-restart-and-duplicate.t b/t/05-scheduler-restart-and-duplicate.t index f136ec30a14..df9ca550cec 100644 --- a/t/05-scheduler-restart-and-duplicate.t +++ b/t/05-scheduler-restart-and-duplicate.t @@ -265,9 +265,9 @@ $job3 = job_get($round5->id); sub _print_job_cluster ($jobs) { return undef unless $ENV{HARNESS_IS_VERBOSE}; - my $cluster_jobs = $jobs->[0]->cluster_jobs; # uncoverable - note 'job ' . $_->TEST . ': ' . $_->id for @$jobs; # uncoverable - diag explain $cluster_jobs; # uncoverable + my $cluster_jobs = $jobs->[0]->cluster_jobs; # uncoverable statement + note 'job ' . $_->TEST . ': ' . $_->id for @$jobs; # uncoverable statement + diag explain $cluster_jobs; # uncoverable statement } subtest 'restarting one of two independent root jobs (only related indirectly via parallel dependency)' => sub { diff --git a/t/10-jobs.t b/t/10-jobs.t index 6cc82c7a78a..401c42b8acc 100644 --- a/t/10-jobs.t +++ b/t/10-jobs.t @@ -23,7 +23,7 @@ use Test::Mojo; use Test::Warnings qw(:report_warnings warning); use Mojo::File 'path'; use Mojo::JSON qw(decode_json encode_json); -use OpenQA::Test::Utils qw(perform_minion_jobs redirect_output); +use OpenQA::Test::Utils qw(perform_minion_jobs); use OpenQA::Test::TimeLimit '30'; my $schema_name = OpenQA::Test::Database::generate_schema_name; diff --git a/t/16-utils.t b/t/16-utils.t index f9f5d472783..8b826dba9cf 100644 --- a/t/16-utils.t +++ b/t/16-utils.t @@ -22,7 +22,6 @@ use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib"; use OpenQA::Utils (qw(:DEFAULT prjdir sharedir resultdir assetdir imagesdir base_host random_string random_hex), qw(download_rate download_speed usleep_backoff)); use OpenQA::Task::SignalGuard; -use OpenQA::Test::Utils 'redirect_output'; use OpenQA::Test::TimeLimit '10'; use Scalar::Util 'reftype'; use Test::MockObject; diff --git a/t/20-stale-job-detection.t b/t/20-stale-job-detection.t index 5db0b4c2d05..223d2419188 100644 --- a/t/20-stale-job-detection.t +++ b/t/20-stale-job-detection.t @@ -10,12 +10,13 @@ use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib"; use DateTime; use Test::Warnings ':report_warnings'; use Test::Output qw(combined_like stderr_like); +use Test::MockModule; use OpenQA::App; use OpenQA::Constants qw(DEFAULT_WORKER_TIMEOUT DB_TIMESTAMP_ACCURACY); use OpenQA::Jobs::Constants; use OpenQA::WebSockets; +use OpenQA::Scheduler; require OpenQA::Test::Database; -use OpenQA::Test::Utils qw(redirect_output); use OpenQA::Test::TimeLimit '10'; my $schema = OpenQA::Test::Database->new->create(fixtures_glob => '01-jobs.pl 02-workers.pl 06-job_dependencies.pl'); diff --git a/t/26-controllerrunning.t b/t/26-controllerrunning.t index 867370fdfe3..57bc7771550 100644 --- a/t/26-controllerrunning.t +++ b/t/26-controllerrunning.t @@ -280,4 +280,3 @@ sub resultset { FakeSchema::Find->new } package FakeSchema::Find; sub new { bless({}, shift) } -sub find { undef } diff --git a/t/33-developer_mode.t b/t/33-developer_mode.t index 985e1edd3c1..e3a37cb6ae8 100644 --- a/t/33-developer_mode.t +++ b/t/33-developer_mode.t @@ -76,7 +76,7 @@ ok(Mojolicious::Commands->start_app('OpenQA::WebAPI', 'eval', '1+0')); # start Selenium test driver and other daemons my $port = service_port 'webui'; my $driver = call_driver({mojoport => $port}); -$ws = create_websocket_server(undef, 0, 0); +$ws = create_websocket_server(undef, 0); $scheduler = create_scheduler; $livehandler = create_live_view_handler; diff --git a/t/43-scheduling-and-worker-scalability.t b/t/43-scheduling-and-worker-scalability.t index 72a0f681440..03273fedb34 100644 --- a/t/43-scheduling-and-worker-scalability.t +++ b/t/43-scheduling-and-worker-scalability.t @@ -21,7 +21,7 @@ require OpenQA::Test::Database; use OpenQA::Jobs::Constants; use OpenQA::Log qw(setup_log); use OpenQA::Test::Utils qw( - mock_service_ports setup_mojo_app_with_default_worker_timeout + setup_mojo_app_with_default_worker_timeout create_user_for_workers create_webapi create_websocket_server stop_service setup_fullstack_temp_dir simulate_load); use OpenQA::Test::TimeLimit '20'; @@ -52,8 +52,6 @@ BAIL_OUT 'invalid SCALABILITY_TEST_WORKER_COUNT/SCALABILITY_TEST_JOB_COUNT' note("Running scalability test with $worker_count worker(s) and $job_count job(s)."); note('Set SCALABILITY_TEST_WORKER_COUNT/SCALABILITY_TEST_JOB_COUNT to adjust this.'); -mock_service_ports; - # setup basedir, config dir and database my $tempdir = setup_fullstack_temp_dir('scalability'); my $schema = OpenQA::Test::Database->new->create; @@ -61,7 +59,7 @@ my $workers = $schema->resultset('Workers'); my $jobs = $schema->resultset('Jobs'); # create web UI and websocket server -my $web_socket_server = create_websocket_server(undef, 0, 1, 1, 1); +my $web_socket_server = create_websocket_server(undef, 0, 1, 1); my $webui = create_webapi(undef, 1); # prepare spawning workers diff --git a/t/api/02-assets.t b/t/api/02-assets.t index 15b32d2e3bd..d5d882d866e 100644 --- a/t/api/02-assets.t +++ b/t/api/02-assets.t @@ -18,11 +18,9 @@ my $t = client(Test::Mojo->new('OpenQA::WebAPI'), apikey => 'ARTHURKEY01', apise sub la { return unless $ENV{HARNESS_IS_VERBOSE}; - $t->get_ok('/api/v1/assets')->status_is(200); - my @assets = @{$t->tx->res->json->{assets}}; - for my $asset (@assets) { - printf "%d %-5s %s\n", $asset->{id}, $asset->{type}, $asset->{name}; - } + $t->get_ok('/api/v1/assets')->status_is(200); # uncoverable statement + my @assets = @{$t->tx->res->json->{assets}}; # uncoverable statement + note "asset: $_->{id}: $_->{type}/$_->{name}\n" for @assets; # uncoverable statement } sub iso_path { diff --git a/t/api/08-jobtemplates.t b/t/api/08-jobtemplates.t index 198ec18537e..2e6b248aa9f 100644 --- a/t/api/08-jobtemplates.t +++ b/t/api/08-jobtemplates.t @@ -955,11 +955,9 @@ subtest 'Create and modify groups with YAML' => sub { $t->post_ok("/api/v1/job_templates_scheduling/$job_group_id3", form => \%form); $t->status_is(200); return diag explain $t->tx->res->body unless $t->success; - if (!is($job_templates->search({prio => 16})->count, 2, 'two distinct job templates')) { - my $jt = $job_templates->search({prio => 16}); - while (my $j = $jt->next) { - diag explain dump_yaml(string => $j->to_hash); - } + my $templates = $job_templates->search({prio => 16}); + if (!is $templates->count, 2, 'two distinct job templates') { + diag explain dump_yaml(string => $_->to_hash) for $templates->all; # uncoverable statement } my %new_isos_post_params = ( _GROUP => 'foo', @@ -1010,11 +1008,9 @@ subtest 'Create and modify groups with YAML' => sub { schema => $schema_filename, template => dump_yaml(string => $yaml)}); return diag explain $t->tx->res->body unless $t->success; - if (!is($job_templates->search({prio => 7})->count, 4, 'four job templates created')) { - my $jt = $job_templates->search({prio => 7}); - while (my $j = $jt->next) { - diag explain dump_yaml(string => $j->to_hash); - } + my $templates = $job_templates->search({prio => 7}); + if (!is $templates->count, 4, 'four job templates created') { + diag explain dump_yaml(string => $_->to_hash) for $templates->all; # uncoverable statement } }; diff --git a/t/api/14-plugin_obs_rsync_async.t b/t/api/14-plugin_obs_rsync_async.t index 796e1aac99b..3822f236e53 100644 --- a/t/api/14-plugin_obs_rsync_async.t +++ b/t/api/14-plugin_obs_rsync_async.t @@ -18,11 +18,11 @@ $t->ua(OpenQA::Client->new(apikey => 'ARTHURKEY01', apisecret => 'EXCALIBUR')->i $t->app($app); sub start_gru { - start sub { - note('starting gru'); - $0 = 'openqa-gru'; - $ENV{MOJO_MODE} = 'test'; - Mojolicious::Commands->start_app('OpenQA::WebAPI', 'gru', 'run', '-m', 'test'); + start sub { # uncoverable because we do not track coverage of this sub process + note('starting gru'); # uncoverable statement + $0 = 'openqa-gru'; # uncoverable statement + $ENV{MOJO_MODE} = 'test'; # uncoverable statement + Mojolicious::Commands->start_app('OpenQA::WebAPI', 'gru', 'run', '-m', 'test'); # uncoverable statement }; } @@ -52,11 +52,10 @@ sub sleep_until_job_start { && ($other_job->{args}[0]->{project} eq $project) && $other_job->{notes}{project_lock}); } - - sleep .2; - $retries--; + sleep .2; # uncoverable statement + $retries--; # uncoverable statement } - die 'Timeout reached'; + die 'Timeout reached'; # uncoverable statement } sub sleep_until_all_jobs_finished { @@ -66,11 +65,10 @@ sub sleep_until_all_jobs_finished { while ($retries > 0) { my ($cnt, $jobs) = _jobs('inactive', 'active'); return 1 unless $cnt; - - sleep .2; - $retries--; + sleep .2; # uncoverable statement + $retries--; # uncoverable statement } - die 'Timeout reached'; + die 'Timeout reached'; # uncoverable statement } # this function communicates with t/data/openqa-trigger-from-obs/script/rsync.sh diff --git a/t/full-stack.t b/t/full-stack.t index 9bfbff3ee58..4478acc43ab 100644 --- a/t/full-stack.t +++ b/t/full-stack.t @@ -48,7 +48,7 @@ use File::Path qw(make_path remove_tree); use Module::Load::Conditional 'can_load'; use OpenQA::Test::Utils qw(create_websocket_server create_live_view_handler setup_share_dir), - qw(cache_minion_worker cache_worker_service mock_service_ports setup_fullstack_temp_dir), + qw(cache_minion_worker cache_worker_service setup_fullstack_temp_dir), qw(start_worker stop_service wait_for_or_bail_out); use OpenQA::Test::TimeLimit '200'; use OpenQA::Test::FullstackUtils; @@ -73,9 +73,8 @@ my $sharedir = setup_share_dir($ENV{OPENQA_BASEDIR}); # initialize database, start daemons my $schema = OpenQA::Test::Database->new->create(schema_name => 'public', drop_schema => 1); ok(Mojolicious::Commands->start_app('OpenQA::WebAPI', 'eval', '1+0'), 'assets are prefetched'); -mock_service_ports; my $mojoport = service_port 'websocket'; -$ws = create_websocket_server($mojoport, 0, 0); +$ws = create_websocket_server($mojoport, 0); my $driver = call_driver({mojoport => service_port 'webui'}); $livehandler = create_live_view_handler; diff --git a/t/lib/OpenQA/SeleniumTest.pm b/t/lib/OpenQA/SeleniumTest.pm index 0c28772456e..0c95c063004 100644 --- a/t/lib/OpenQA/SeleniumTest.pm +++ b/t/lib/OpenQA/SeleniumTest.pm @@ -215,7 +215,7 @@ sub javascript_console_has_no_warnings_or_errors ($test_name_suffix = '') { # ignore when server replied with 400 response; this may be provoked when testing error cases and if it is # not expected tests would fail anyways next if ($msg =~ qr/server responded with a status of 400/); # uncoverable statement - push(@errors, $log_entry); + push(@errors, $log_entry); # uncoverable statement } diag "Unexpected Javascript console errors$test_name_suffix: " . pp(\@errors) if @errors; diff --git a/t/lib/OpenQA/Test/FakeWebSocketTransaction.pm b/t/lib/OpenQA/Test/FakeWebSocketTransaction.pm index b10c08e8d5d..2305494fbce 100644 --- a/t/lib/OpenQA/Test/FakeWebSocketTransaction.pm +++ b/t/lib/OpenQA/Test/FakeWebSocketTransaction.pm @@ -29,8 +29,8 @@ sub send { my ($self, $message, $callback) = @_; if ($self->finish_called) { - fail('attempt to send message via finished connection'); - return undef; + fail('attempt to send message via finished connection'); # uncoverable statement + return undef; # uncoverable statement } push @{$self->sent_messages}, $message; diff --git a/t/lib/OpenQA/Test/Utils.pm b/t/lib/OpenQA/Test/Utils.pm index f9839385ee8..fa190acabe6 100644 --- a/t/lib/OpenQA/Test/Utils.pm +++ b/t/lib/OpenQA/Test/Utils.pm @@ -48,8 +48,7 @@ BEGIN { our (@EXPORT, @EXPORT_OK); @EXPORT_OK = qw( - mock_service_ports setup_mojo_app_with_default_worker_timeout - redirect_output create_user_for_workers + setup_mojo_app_with_default_worker_timeout create_user_for_workers create_webapi create_websocket_server create_scheduler create_live_view_handler unresponsive_worker broken_worker rejective_worker setup_share_dir setup_fullstack_temp_dir run_gru_job stop_service start_worker unstable_worker fake_asset_server @@ -70,18 +69,6 @@ our (@EXPORT, @EXPORT_OK); # # Potentially this approach can also be used in production code. -sub mock_service_ports { - my %ports; - Test::MockModule->new('OpenQA::Utils')->redefine( - service_port => sub { - my ($service) = @_; - my $port = $ports{$service} //= Mojo::IOLoop::Server->generate_port; - note("Mocking service port for $service to be $port"); - return $port; - }); - note('Used ports: ' . dumper(\%ports)); -} - sub setup_mojo_app_with_default_worker_timeout { OpenQA::App->set_singleton( Mojolicious->new(config => {global => {worker_timeout => DEFAULT_WORKER_TIMEOUT}}, log => undef)); @@ -92,13 +79,13 @@ sub cache_minion_worker { sub { # this service can be very noisy - require OpenQA::CacheService; - local $ENV{MOJO_MODE} = 'test'; - note('Starting cache minion worker'); - OpenQA::CacheService::run(qw(run --dequeue-timeout 1)); - note('Cache minion worker stopped'); - Devel::Cover::report() if Devel::Cover->can('report'); - _exit(0); + require OpenQA::CacheService; # uncoverable statement + local $ENV{MOJO_MODE} = 'test'; # uncoverable statement + note('Starting cache minion worker'); # uncoverable statement + OpenQA::CacheService::run(qw(run --dequeue-timeout 1)); # uncoverable statement + note('Cache minion worker stopped'); # uncoverable statement + Devel::Cover::report() if Devel::Cover->can('report'); # uncoverable statement + _exit(0); # uncoverable statement })->set_pipes(0)->separate_err(0)->blocking_stop(1)->channels(0); } @@ -107,14 +94,14 @@ sub cache_worker_service { sub { # this service can be very noisy - require OpenQA::CacheService; - local $ENV{MOJO_MODE} = 'test'; - my $port = service_port 'cache_service'; - note("Starting worker cache service on port $port"); - OpenQA::CacheService::run('daemon', '-l', "http://*:$port"); - note("Worker cache service on port $port stopped"); - Devel::Cover::report() if Devel::Cover->can('report'); - _exit(0); + require OpenQA::CacheService; # uncoverable statement + local $ENV{MOJO_MODE} = 'test'; # uncoverable statement + my $port = service_port 'cache_service'; # uncoverable statement + note("Starting worker cache service on port $port"); # uncoverable statement + OpenQA::CacheService::run('daemon', '-l', "http://*:$port"); # uncoverable statement + note("Worker cache service on port $port stopped"); # uncoverable statement + Devel::Cover::report() if Devel::Cover->can('report'); # uncoverable statement + _exit(0); # uncoverable statement })->set_pipes(0)->separate_err(0)->blocking_stop(1)->channels(0); } @@ -203,22 +190,9 @@ sub fake_asset_server { $c->rendered(200); } }); - - $mock->routes->get( - '/' => sub { - my $c = shift; - return $c->render(status => 200, text => "server is running"); - }); return $mock; } -sub redirect_output { - my ($buf) = @_; - open my $FD, '>', $buf; - *STDOUT = $FD; - *STDERR = $FD; -} - # define internal helper functions to keep track of Perl warnings produced by sub processes spawned by # the subsequent create_…-functions sub _setup_sub_process { @@ -227,12 +201,12 @@ sub _setup_sub_process { my ($process_name) = @_; $0 = $process_name; note "PID of $process_name: $$"; - $SIG{__WARN__} = sub { - log_error "Stopping $process_name process because a Perl warning occurred: @_"; - _exit 42; + $SIG{__WARN__} = sub { # uncoverable statement + log_error "Stopping $process_name process because a Perl warning occurred: @_"; # uncoverable statement + _exit 42; # uncoverable statement }; } -sub _fail_and_exit { fail shift; done_testing; exit shift } +sub _fail_and_exit { fail shift; done_testing; exit shift } # uncoverable statement my %RELEVANT_CHILD_PIDS; my $SIGCHLD_HANDLER = sub { # produces a test failure in case any relevant sub process terminated with a non-zero exit code @@ -303,14 +277,9 @@ sub create_webapi ($port = undef, $no_cover = undef) { return $h; } -sub create_websocket_server { - my ($port, $bogus, $nowait, $with_embedded_scheduler, $no_cover) = @_; - $port //= service_port 'websocket'; - - note("Starting WebSocket service. Port: $port"); - note("Bogus: $bogus | No wait: $nowait"); - - OpenQA::WebSockets::Client->singleton->port($port); +sub create_websocket_server ($port, $bogus, $with_embedded_scheduler = undef, $no_cover = undef) { + OpenQA::WebSockets::Client->singleton->port($port //= service_port 'websocket'); + note "Starting WebSocket service (port: $port, bogus: $bogus)"; my $h = _setup_sigchld_handler 'openqa-websocket', start sub { _setup_sub_process 'openqa-websocket'; local $ENV{MOJO_LISTEN} = "http://127.0.0.1:$port"; @@ -350,22 +319,6 @@ sub create_websocket_server { OpenQA::WebSockets::run; Devel::Cover::report() if !$no_cover && Devel::Cover->can('report'); }; - if (!defined $nowait) { - # wait for websocket server - my $limit = 20; - my $wait = time + $limit; - while (time < $wait) { - my $t = time; - my $socket = IO::Socket::INET->new( - PeerHost => '127.0.0.1', - PeerPort => $port, - Proto => 'tcp' - ); - last if $socket; - sleep 1 if time - $t < 1; - } - die("websocket server is not responsive after '$limit' seconds") unless time < $wait; - } return $h; } @@ -462,21 +415,13 @@ sub start_worker { start \@cmd; } -sub unstable_worker { - # the help of the Doctor would be really appreciated here. - my ($apikey, $apisecret, $host, $instance, $ticks, $sleep) = @_; - note("Starting unstable worker. Instance: $instance for host $host"); - $ticks = 1 unless defined $ticks; +sub unstable_worker ($apikey, $apisecret, $host, $instance, $ticks, $sleep = undef) { + my %worker_params = (apikey => $apikey, apisecret => $apisecret, instance => $instance, verbose => 1); + note "Starting unstable worker. Instance: $instance for host $host"; my $h = _setup_sigchld_handler 'openqa-worker-unstable', start sub { # uncoverable statement _setup_sub_process 'openqa-worker-unstable'; # uncoverable statement - my $worker = OpenQA::Worker->new( # uncoverable statement - { # uncoverable statement - apikey => $apikey, # uncoverable statement - apisecret => $apisecret, # uncoverable statement - instance => $instance, # uncoverable statement - verbose => 1 # uncoverable statement - }); # uncoverable statement + my $worker = OpenQA::Worker->new(\%worker_params); # uncoverable statement setup_worker($worker, $host); # uncoverable statement $worker->init(); # uncoverable statement if ($ticks < 0) { # uncoverable statement @@ -513,44 +458,37 @@ sub rejective_worker { c_worker($apikey, $apisecret, $host, $instance, 1, rejection_reason => $reason); } -sub c_worker { - my ($apikey, $apisecret, $host, $instance, $bogus, %options) = @_; - $bogus //= 1; +sub c_worker ($apikey, $apisecret, $host, $instance, $bogus, %options) { + my %worker_params = (apikey => $apikey, apisecret => $apisecret, instance => $instance, verbose => 1); - _setup_sigchld_handler 'openqa-worker', start sub { - _setup_sub_process 'openqa-worker'; - my $command_handler_mock = Test::MockModule->new('OpenQA::Worker::CommandHandler'); - if ($bogus) { + _setup_sigchld_handler 'openqa-worker', start sub { # uncoverable statement + _setup_sub_process 'openqa-worker'; # uncoverable statement + my $command_handler_mock = Test::MockModule->new('OpenQA::Worker::CommandHandler'); # uncoverable statement + if ($bogus) { # uncoverable statement $command_handler_mock->redefine( - handle_command => sub { - my ($self, $tx, $json) = @_; - log_debug('Received ws message: ' . Dumper($json)); + handle_command => sub { # uncoverable statement + my ($self, $tx, $json) = @_; # uncoverable statement + log_debug('Received ws message: ' . Dumper($json)); # uncoverable statement # if we've got a single job ID and a rejection reason simulate a worker # which rejects the job - my $rejection_reason = $options{rejection_reason}; - return undef unless defined $rejection_reason; - my $job_id = $json->{job}->{id}; - return undef unless defined $job_id; - log_debug("Rejecting job $job_id"); - $self->client->reject_jobs([$job_id], $rejection_reason); - }); + my $rejection_reason = $options{rejection_reason}; # uncoverable statement + return undef unless defined $rejection_reason; # uncoverable statement + my $job_id = $json->{job}->{id}; # uncoverable statement + return undef unless defined $job_id; # uncoverable statement + log_debug("Rejecting job $job_id"); # uncoverable statement + $self->client->reject_jobs([$job_id], $rejection_reason); # uncoverable statement + }); # uncoverable statement } - my $error = $options{error}; - my $worker_mock = Test::MockModule->new('OpenQA::Worker'); - $worker_mock->redefine(check_availability => $error) if defined $error; - my $worker = OpenQA::Worker->new( - { - apikey => $apikey, - apisecret => $apisecret, - instance => $instance, - verbose => 1 - }); - $worker->current_error($error) if defined $error; - setup_worker($worker, $host); - $worker->exec(); + my $error = $options{error}; # uncoverable statement + my $worker_mock = Test::MockModule->new('OpenQA::Worker'); # uncoverable statement + $worker_mock->redefine(check_availability => $error) if defined $error; # uncoverable statement + my $worker = OpenQA::Worker->new(\%worker_params); # uncoverable statement + $worker->current_error($error) if defined $error; # uncoverable statement + setup_worker($worker, $host); # uncoverable statement + $worker->exec(); # uncoverable statement - Devel::Cover::report() if Devel::Cover->can('report'); + Devel::Cover::report() if Devel::Cover->can('report'); # uncoverable statement }; } diff --git a/t/ui/01-list.t b/t/ui/01-list.t index e09e38a9847..4e7b7fb53da 100644 --- a/t/ui/01-list.t +++ b/t/ui/01-list.t @@ -249,20 +249,10 @@ subtest 'available comments shown' => sub { "Bug referenced: bsc#4\nclosed bugzilla bug", 'available bugref (bsc#4) shown for finished jobs' ); - - SKIP: { - skip 'comment icon for running and scheduled jobs skipped to imporove performance', 2; - is( - $driver->find_element('#job_99963 .fa-comment')->get_attribute('title'), - '2 comments available', - 'available comments shown for running jobs' - ); - is( - $driver->find_element('#job_99928 .fa-comment')->get_attribute('title'), - '1 comment available', - 'available comments shown for scheduled jobs' - ); - } + is_deeply([$driver->find_elements('#job_99963 .fa-comment')], + [], 'available comments not shown for running jobs (for performance reasons)'); + is_deeply([$driver->find_elements('#job_99928 .fa-comment')], + [], 'available comments not shown for scheduled jobs (for performance reasons)'); }; $driver->find_element_by_link_text('Build0091')->click(); diff --git a/t/ui/16-activity-view.t b/t/ui/16-activity-view.t index d567adc3aa3..850047ac9cd 100644 --- a/t/ui/16-activity-view.t +++ b/t/ui/16-activity-view.t @@ -133,7 +133,7 @@ subtest 'Current jobs' => sub { my $href = $links[0]->get_attribute('href'); unless ($href =~ m{/tests/(\d+)}) { fail("Link '$href' is not a test url"); # uncoverable statement - next; + next; # uncoverable statement } my $id = $1; my $exp = delete $state_result{$id}; @@ -145,7 +145,7 @@ subtest 'Current jobs' => sub { } if (keys %state_result) { fail "Missed the following jobs in the list:"; # uncoverable statement - diag(Data::Dumper->Dump([\%state_result], ['state_result'])); + diag(Data::Dumper->Dump([\%state_result], ['state_result'])); # uncoverable statement } my $first = wait_for_element(selector => '#results .list-group-item:first-child .timeago:not(:empty)'); diff --git a/t/ui/27-plugin_obs_rsync_gru.t b/t/ui/27-plugin_obs_rsync_gru.t index 6f1832e3cbf..440f7c93cd3 100644 --- a/t/ui/27-plugin_obs_rsync_gru.t +++ b/t/ui/27-plugin_obs_rsync_gru.t @@ -15,7 +15,9 @@ my $app = $t->app; my $minion = $app->minion; { - package FakeMinionJob; # uncoverable statement count:2 + # uncoverable statement count:1 + # uncoverable statement count:2 + package FakeMinionJob; use Mojo::Base -base, -signatures; has id => 0; has app => sub { $app };