From ea5beeacb185309572836cc60989f95ea4705f9d Mon Sep 17 00:00:00 2001 From: Dylan William Hardison Date: Fri, 10 Aug 2018 15:41:53 -0400 Subject: [PATCH] Bug 1482475 - Add extensive testing framework --- .circleci/config.yml | 2 +- Bugzilla.pm | 3 + Bugzilla/Config.pm | 37 ++-- Bugzilla/DB/Sqlite.pm | 2 +- Bugzilla/Test/MockDB.pm | 49 ++++++ Bugzilla/Test/MockLocalconfig.pm | 18 ++ Bugzilla/Test/MockParams.pm | 71 ++++++++ Bugzilla/Test/Util.pm | 2 +- Makefile.PL | 1 + conf/log4perl-t.conf | 4 + extensions/BMO/t/bounty_attachment.t | 8 +- extensions/BMO/t/bug_format_comment.t | 90 ---------- extensions/PhabBugz/lib/Feed.pm | 4 +- t/phabbugz.t => extensions/PhabBugz/t/basic.t | 0 extensions/PhabBugz/t/feed-daemon-guts.t | 160 ++++++++++++++++++ extensions/Push/t/ReviewBoard.t | 3 +- extensions/RequestNagger/Extension.pm | 2 +- t/mock-db.t | 35 ++++ t/mock-params.t | 25 +++ t/sqlite-memory.t | 89 ++++++++++ 20 files changed, 484 insertions(+), 121 deletions(-) create mode 100644 Bugzilla/Test/MockDB.pm create mode 100644 Bugzilla/Test/MockLocalconfig.pm create mode 100644 Bugzilla/Test/MockParams.pm create mode 100644 conf/log4perl-t.conf delete mode 100644 extensions/BMO/t/bug_format_comment.t rename t/phabbugz.t => extensions/PhabBugz/t/basic.t (100%) create mode 100644 extensions/PhabBugz/t/feed-daemon-guts.t create mode 100644 t/mock-db.t create mode 100644 t/mock-params.t create mode 100644 t/sqlite-memory.t diff --git a/.circleci/config.yml b/.circleci/config.yml index a9a087609..d8c30f717 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -190,7 +190,7 @@ jobs: name: run sanity tests command: | [[ -f build_info/only_version_changed.txt ]] && exit 0 - /app/scripts/entrypoint.pl prove -qf $(circleci tests glob 't/*.t' | circleci tests split) | tee artifacts/$CIRCLE_JOB.txt + /app/scripts/entrypoint.pl prove -qf $(circleci tests glob 't/*.t' 'extensions/*/t/*.t' | circleci tests split) | tee artifacts/$CIRCLE_JOB.txt - store_artifacts: path: /app/artifacts - *store_log diff --git a/Bugzilla.pm b/Bugzilla.pm index b0387d179..5e48d21f4 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -85,6 +85,9 @@ sub init_page { # request cache are very annoying (see bug 1347335) # and this is not an expensive operation. clear_request_cache(); + if ($0 =~ /\.t/) { + return; + } if (Bugzilla->usage_mode == USAGE_MODE_CMDLINE) { init_console(); } diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm index d050ff9e0..85779fa6b 100644 --- a/Bugzilla/Config.pm +++ b/Bugzilla/Config.pm @@ -251,28 +251,11 @@ sub write_params { my ($param_data) = @_; $param_data ||= Bugzilla->params; - my $datadir = bz_locations()->{'datadir'}; - my $param_file = "$datadir/params"; - local $Data::Dumper::Sortkeys = 1; - my ($fh, $tmpname) = File::Temp::tempfile('params.XXXXX', - DIR => $datadir ); - my %params = %$param_data; $params{urlbase} = Bugzilla->localconfig->{urlbase}; - print $fh (Data::Dumper->Dump([\%params], ['*param'])) - || die "Can't write param file: $!"; - - close $fh; - - rename $tmpname, $param_file - or die "Can't rename $tmpname to $param_file: $!"; - - # It's not common to edit parameters and loading - # Bugzilla::Install::Filesystem is slow. - require Bugzilla::Install::Filesystem; - Bugzilla::Install::Filesystem::fix_file_permissions($param_file); + __PACKAGE__->_write_file( Data::Dumper->Dump([\%params], ['*param']) ); # And now we have to reset the params cache so that Bugzilla will re-read # them. @@ -311,6 +294,24 @@ sub read_param_file { return \%params; } +sub _write_file { + my ($class, $str) = @_; + my $datadir = bz_locations()->{'datadir'}; + my $param_file = "$datadir/params"; + my ($fh, $tmpname) = File::Temp::tempfile('params.XXXXX', + DIR => $datadir ); + print $fh $str || die "Can't write param file: $!"; + close $fh || die "Can't close param file: $!"; + + rename $tmpname, $param_file + or die "Can't rename $tmpname to $param_file: $!"; + + # It's not common to edit parameters and loading + # Bugzilla::Install::Filesystem is slow. + require Bugzilla::Install::Filesystem; + Bugzilla::Install::Filesystem::fix_file_permissions($param_file); +} + 1; __END__ diff --git a/Bugzilla/DB/Sqlite.pm b/Bugzilla/DB/Sqlite.pm index 3890d0795..81ee7d888 100644 --- a/Bugzilla/DB/Sqlite.pm +++ b/Bugzilla/DB/Sqlite.pm @@ -73,7 +73,7 @@ sub BUILDARGS { my $db_name = $params->{db_name}; # Let people specify paths intead of data/ for the DB. - if ($db_name and $db_name !~ m{[\\/]}) { + if ($db_name && $db_name ne ':memory:' && $db_name !~ m{[\\/]}) { # When the DB is first created, there's a chance that the # data directory doesn't exist at all, because the Install::Filesystem # code happens after DB creation. So we create the directory ourselves diff --git a/Bugzilla/Test/MockDB.pm b/Bugzilla/Test/MockDB.pm new file mode 100644 index 000000000..d158a73de --- /dev/null +++ b/Bugzilla/Test/MockDB.pm @@ -0,0 +1,49 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +package Bugzilla::Test::MockDB; +use 5.10.1; +use strict; +use warnings; +use Try::Tiny; +use Capture::Tiny qw(capture_merged); + +use Bugzilla::Test::MockLocalconfig ( + db_driver => 'sqlite', + db_name => ':memory:', +); +use Bugzilla; +BEGIN { Bugzilla->extensions }; +use Bugzilla::Test::MockParams; + +sub import { + require Bugzilla::Install; + require Bugzilla::Install::DB; + require Bugzilla::Field;; + + state $first_time = 0; + + return undef if $first_time++; + + return capture_merged { + Bugzilla->dbh->bz_setup_database(); + + # Populate the tables that hold the values for the fields. + Bugzilla->dbh->bz_populate_enum_tables(); +}); + +$lives_ok->('update_fielddefs_definition' => sub { + Bugzilla::Install::DB::update_fielddefs_definition(); +}); + +$lives_ok->('populate_field_definitions' => sub { + Bugzilla::Field::populate_field_definitions(); +}); + +$lives_ok->('init_workflow' => sub { + Bugzilla::Install::init_workflow(); +}); + +$lives_ok->('update_table_definitions' => sub { + Bugzilla::Install::DB->update_table_definitions({}); +}); + +$lives_ok->('update_system_groups' => sub { + Bugzilla::Install::update_system_groups(); +}); + +# "Log In" as the fake superuser who can do everything. +Bugzilla->set_user(Bugzilla::User->super_user); + +$lives_ok->('update_settings' => sub { + Bugzilla::Install::update_settings(); +}); + +SKIP: { + skip 'default product cannot be created without default assignee', 1; + $lives_ok->('create_default_product' => sub { + Bugzilla::Install::create_default_product(); + }); +} + +done_testing; -- 2.47.3