meson: Add 'running' test setup, as a replacement for installcheck

To run all tests that support running against existing server:
$ meson test --setup running

To run just the main pg_regress tests against existing server:
$ meson test --setup running regress-running/regress

To ensure the 'running' setup continues to work, test it as part of the
freebsd CI task.

Discussion: https://postgr.es/m/CAH2-Wz=XDQcmLoo7RR_i6FKQdDmcyb9q5gStnfuuQXrOGhB2sQ@mail.gmail.com
This commit is contained in:
Andres Freund 2022-12-07 12:13:35 -08:00
parent 8305629afe
commit 3f0e786ccb
17 changed files with 132 additions and 15 deletions

View File

@ -195,6 +195,21 @@ task:
meson test $MTEST_ARGS --num-processes ${TEST_JOBS} meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
EOF EOF
# test runningcheck, freebsd chosen because it's currently fast enough
test_running_script: |
su postgres <<-EOF
set -e
ulimit -c unlimited
meson test $MTEST_ARGS --quiet --suite setup
export LD_LIBRARY_PATH="$(pwd)/build/tmp_install/usr/local/pgsql/lib/:$LD_LIBRARY_PATH"
mkdir -p build/testrun
build/tmp_install/usr/local/pgsql/bin/initdb -N build/runningcheck --no-instructions -A trust
echo "include '$(pwd)/src/tools/ci/pg_ci_base.conf'" >> build/runningcheck/postgresql.conf
build/tmp_install/usr/local/pgsql/bin/pg_ctl -c -o '-c fsync=off' -D build/runningcheck -l build/testrun/runningcheck.log start
meson test $MTEST_ARGS --num-processes ${TEST_JOBS} --setup running
build/tmp_install/usr/local/pgsql/bin/pg_ctl -D build/runningcheck stop
EOF
on_failure: on_failure:
<<: *on_failure_meson <<: *on_failure_meson
cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores

View File

@ -25,5 +25,8 @@ tests += {
'regress_args': [ 'regress_args': [
'--temp-config', files('basic_archive.conf'), '--temp-config', files('basic_archive.conf'),
], ],
# Disabled because these tests require "shared_preload_libraries=basic_archive",
# which typical runningcheck users do not have (e.g. buildfarm clients).
'runningcheck': false,
}, },
} }

View File

@ -33,5 +33,8 @@ tests += {
'regress_args': [ 'regress_args': [
'--temp-config', files('pg_freespacemap.conf') '--temp-config', files('pg_freespacemap.conf')
], ],
# Disabled because these tests require "autovacuum=off", which
# typical runningcheck users do not have (e.g. buildfarm clients).
'runningcheck': false,
}, },
} }

View File

@ -41,5 +41,9 @@ tests += {
'pg_stat_statements', 'pg_stat_statements',
], ],
'regress_args': ['--temp-config', files('pg_stat_statements.conf')], 'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
# Disabled because these tests require
# "shared_preload_libraries=pg_stat_statements", which typical
# runningcheck users do not have (e.g. buildfarm clients).
'runningcheck': false,
}, },
} }

View File

@ -28,6 +28,9 @@ tests += {
'sql': [ 'sql': [
'pg_walinspect', 'pg_walinspect',
], ],
# Disabled because these tests require "wal_level=replica", which
# some runningcheck users do not have (e.g. buildfarm clients).
'regress_args': ['--temp-config', files('walinspect.conf')], 'regress_args': ['--temp-config', files('walinspect.conf')],
'runningcheck': false,
}, },
} }

View File

@ -43,6 +43,9 @@ tests += {
'regress_args': [ 'regress_args': [
'--temp-config', files('logical.conf'), '--temp-config', files('logical.conf'),
], ],
# Disabled because these tests require "wal_level=logical", which
# typical runningcheck users do not have (e.g. buildfarm clients).
'runningcheck': false,
}, },
'isolation': { 'isolation': {
'specs': [ 'specs': [
@ -61,6 +64,8 @@ tests += {
'regress_args': [ 'regress_args': [
'--temp-config', files('logical.conf'), '--temp-config', files('logical.conf'),
], ],
# see above
'runningcheck': false,
}, },
'tap': { 'tap': {
'tests': [ 'tests': [

View File

@ -2108,6 +2108,12 @@ ninja
detailed information about interpreting the test results. You can detailed information about interpreting the test results. You can
repeat this test at any later time by issuing the same command. repeat this test at any later time by issuing the same command.
</para> </para>
<para>
To run pg_regress and pg_isolation_regress tests against a running
postgres instance, specify <userinput>--setup running</userinput> as an
argument to <userinput>meson test</userinput>.
</para>
</step> </step>
<step id="meson-install"> <step id="meson-install">

View File

@ -2920,6 +2920,20 @@ endif
# Test Generation # Test Generation
############################################################### ###############################################################
# When using a meson version understanding exclude_suites, define a
# 'tmp_install' test setup (the default) that excludes tests running against a
# pre-existing install and a 'running' setup that conflicts with creation of
# the temporary installation and tap tests (which don't support running
# against a running server).
running_suites = []
install_suites = []
if meson.version().version_compare('>=0.57')
runningcheck = true
else
runningcheck = false
endif
testwrap = files('src/tools/testwrap') testwrap = files('src/tools/testwrap')
foreach test_dir : tests foreach test_dir : tests
@ -2927,7 +2941,6 @@ foreach test_dir : tests
testwrap, testwrap,
'--basedir', meson.build_root(), '--basedir', meson.build_root(),
'--srcdir', test_dir['sd'], '--srcdir', test_dir['sd'],
'--testgroup', test_dir['name'],
] ]
foreach kind, v : test_dir foreach kind, v : test_dir
@ -2940,55 +2953,94 @@ foreach test_dir : tests
if kind in ['regress', 'isolation', 'ecpg'] if kind in ['regress', 'isolation', 'ecpg']
if kind == 'regress' if kind == 'regress'
runner = pg_regress runner = pg_regress
fallback_dbname = 'regression_@0@'
elif kind == 'isolation' elif kind == 'isolation'
runner = pg_isolation_regress runner = pg_isolation_regress
fallback_dbname = 'isolation_regression_@0@'
elif kind == 'ecpg' elif kind == 'ecpg'
runner = pg_regress_ecpg runner = pg_regress_ecpg
fallback_dbname = 'ecpg_regression_@0@'
endif endif
test_output = test_result_dir / test_dir['name'] / kind test_group = test_dir['name']
test_group_running = test_dir['name'] + '-running'
test_command = [ test_output = test_result_dir / test_group / kind
test_output_running = test_result_dir / test_group_running/ kind
# Unless specified by the test, choose a non-conflicting database name,
# to avoid conflicts when running against existing server.
dbname = t.get('dbname',
fallback_dbname.format(test_dir['name']))
test_command_base = [
runner.full_path(), runner.full_path(),
'--inputdir', t.get('inputdir', test_dir['sd']), '--inputdir', t.get('inputdir', test_dir['sd']),
'--expecteddir', t.get('expecteddir', test_dir['sd']), '--expecteddir', t.get('expecteddir', test_dir['sd']),
'--outputdir', test_output,
'--temp-instance', test_output / 'tmp_check',
'--bindir', '', '--bindir', '',
'--dlpath', test_dir['bd'], '--dlpath', test_dir['bd'],
'--max-concurrent-tests=20', '--max-concurrent-tests=20',
'--port', testport.to_string(), '--dbname', dbname,
] + t.get('regress_args', []) ] + t.get('regress_args', [])
test_selection = []
if t.has_key('schedule') if t.has_key('schedule')
test_command += ['--schedule', t['schedule'],] test_selection += ['--schedule', t['schedule'],]
endif endif
if kind == 'isolation' if kind == 'isolation'
test_command += t.get('specs', []) test_selection += t.get('specs', [])
else else
test_command += t.get('sql', []) test_selection += t.get('sql', [])
endif endif
env = test_env env = test_env
env.prepend('PATH', temp_install_bindir, test_dir['bd']) env.prepend('PATH', temp_install_bindir, test_dir['bd'])
test_kwargs = { test_kwargs = {
'suite': [test_dir['name']],
'priority': 10, 'priority': 10,
'timeout': 1000, 'timeout': 1000,
'depends': test_deps + t.get('deps', []), 'depends': test_deps + t.get('deps', []),
'env': env, 'env': env,
} + t.get('test_kwargs', {}) } + t.get('test_kwargs', {})
test(test_dir['name'] / kind, test(test_group / kind,
python, python,
args: testwrap_base + [ args: [
testwrap_base,
'--testgroup', test_group,
'--testname', kind, '--testname', kind,
'--', test_command, '--',
test_command_base,
'--outputdir', test_output,
'--temp-instance', test_output / 'tmp_check',
'--port', testport.to_string(),
test_selection,
], ],
suite: test_group,
kwargs: test_kwargs, kwargs: test_kwargs,
) )
install_suites += test_group
# some tests can't support running against running DB
if runningcheck and t.get('runningcheck', true)
test(test_group_running / kind,
python,
args: [
testwrap_base,
'--testgroup', test_group_running,
'--testname', kind,
'--',
test_command_base,
'--outputdir', test_output_running,
test_selection,
],
is_parallel: t.get('runningcheck-parallel', true),
suite: test_group_running,
kwargs: test_kwargs,
)
running_suites += test_group_running
endif
testport += 1 testport += 1
elif kind == 'tap' elif kind == 'tap'
@ -3011,9 +3063,10 @@ foreach test_dir : tests
env.set(name, value) env.set(name, value)
endforeach endforeach
test_group = test_dir['name']
test_kwargs = { test_kwargs = {
'protocol': 'tap', 'protocol': 'tap',
'suite': [test_dir['name']], 'suite': test_group,
'timeout': 1000, 'timeout': 1000,
'depends': test_deps + t.get('deps', []), 'depends': test_deps + t.get('deps', []),
'env': env, 'env': env,
@ -3033,12 +3086,14 @@ foreach test_dir : tests
python, python,
kwargs: test_kwargs, kwargs: test_kwargs,
args: testwrap_base + [ args: testwrap_base + [
'--testgroup', test_dir['name'],
'--testname', onetap_p, '--testname', onetap_p,
'--', test_command, '--', test_command,
test_dir['sd'] / onetap, test_dir['sd'] / onetap,
], ],
) )
endforeach endforeach
install_suites += test_group
else else
error('unknown kind @0@ of test in @1@'.format(kind, test_dir['sd'])) error('unknown kind @0@ of test in @1@'.format(kind, test_dir['sd']))
endif endif
@ -3047,6 +3102,14 @@ foreach test_dir : tests
endforeach # directories with tests endforeach # directories with tests
# repeat condition so meson realizes version dependency
if meson.version().version_compare('>=0.57')
add_test_setup('tmp_install',
is_default: true,
exclude_suites: running_suites)
add_test_setup('running',
exclude_suites: ['setup'] + install_suites)
endif
############################################################### ###############################################################

View File

@ -84,6 +84,7 @@ tests += {
'test_kwargs': { 'test_kwargs': {
'depends': ecpg_test_dependencies, 'depends': ecpg_test_dependencies,
}, },
'dbname': 'ecpg1_regression,ecpg2_regression',
'regress_args': ecpg_regress_args, 'regress_args': ecpg_regress_args,
}, },
} }

View File

@ -67,5 +67,6 @@ tests += {
'priority': 40, 'priority': 40,
'timeout': 1000, 'timeout': 1000,
}, },
'dbname': 'isolation_regression',
}, },
} }

View File

@ -6,6 +6,9 @@ tests += {
'sql': [ 'sql': [
'commit_timestamp', 'commit_timestamp',
], ],
# Disabled because these tests require "track_commit_timestamp = on",
# which typical runningcheck users do not have (e.g. buildfarm clients).
'runningcheck': false,
}, },
'tap': { 'tap': {
'tests': [ 'tests': [

View File

@ -10,5 +10,8 @@ tests += {
'sto_using_hash_index', 'sto_using_hash_index',
], ],
'regress_args': ['--temp-config', files('sto.conf')], 'regress_args': ['--temp-config', files('sto.conf')],
# Disabled because these tests require "old_snapshot_threshold" >= 0, which
# typical runningcheck users do not have (e.g. buildfarm clients).
'runningcheck': false,
}, },
} }

View File

@ -25,5 +25,6 @@ tests += {
'test_oat_hooks', 'test_oat_hooks',
], ],
'regress_args': ['--no-locale', '--encoding=UTF8'], 'regress_args': ['--no-locale', '--encoding=UTF8'],
'runningcheck': false,
}, },
} }

View File

@ -13,6 +13,8 @@ tests += {
'sql': [ 'sql': [
'test_pg_dump', 'test_pg_dump',
], ],
# doesn't delete its user
'runningcheck': false,
}, },
'tap': { 'tap': {
'tests': [ 'tests': [

View File

@ -31,5 +31,6 @@ tests += {
'test_slru', 'test_slru',
], ],
'regress_args': ['--temp-config', files('test_slru.conf')], 'regress_args': ['--temp-config', files('test_slru.conf')],
'runningcheck': false,
}, },
} }

View File

@ -30,6 +30,8 @@ tests += {
'sql': [ 'sql': [
'worker_spi', 'worker_spi',
], ],
'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'], 'dbname': 'contrib_regression',
'regress_args': ['--temp-config', files('dynamic.conf')],
'runningcheck': false,
}, },
} }

View File

@ -75,5 +75,6 @@ tests += {
'priority': 50, 'priority': 50,
'timeout': 1000, 'timeout': 1000,
}, },
'dbname': 'regression',
}, },
} }