mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-22 21:59:59 +00:00
Use pytest to manage background services, paths, and environment variables. Benefits: - Tests are a little easier to write. - Cleanup is more reliable. You can CTRL-C a test and it will still shut down gracefully. If you manually start a conflicting process, the test fixtures will detect this and abort at startup. - Don't need to worry about remembering '--test-threads=1' - Output of sub-processes can be captured to files. - Test fixtures configure everything to operate under a single test output directory, making it easier to capture logs in CI. - Detects all the necessary paths if run from the git root, but can also run from arbitrary paths by setting environment variables. There is also a deliberately broken test (test_broken.py) that can be used to test whether the test fixtures properly clean up after themselves. It won't run by default; the comment at the top explains how to enable it.
62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
import pytest
|
|
from fixtures.utils import mkdir_if_needed
|
|
import getpass
|
|
import os
|
|
import psycopg2
|
|
|
|
pytest_plugins = ("fixtures.zenith_fixtures")
|
|
|
|
# FIXME: put host + port in a fixture
|
|
HOST = 'localhost'
|
|
PORT = 55432
|
|
|
|
|
|
def test_pg_regress(zen_simple, test_output_dir, pg_distrib_dir, base_dir):
|
|
|
|
# Connect to postgres and create a database called "regression".
|
|
username = getpass.getuser()
|
|
conn_str = 'host={} port={} dbname=postgres user={}'.format(
|
|
HOST, PORT, username)
|
|
print('conn_str is', conn_str)
|
|
pg_conn = psycopg2.connect(conn_str)
|
|
pg_conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
|
|
cur = pg_conn.cursor()
|
|
cur.execute('CREATE DATABASE regression')
|
|
pg_conn.close()
|
|
|
|
# Create some local directories for pg_regress to run in.
|
|
runpath = os.path.join(test_output_dir, 'regress')
|
|
mkdir_if_needed(runpath)
|
|
mkdir_if_needed(os.path.join(runpath, 'testtablespace'))
|
|
|
|
# Compute all the file locations that pg_regress will need.
|
|
build_path = os.path.join(
|
|
pg_distrib_dir, 'build/src/test/regress')
|
|
src_path = os.path.join(
|
|
base_dir, 'vendor/postgres/src/test/regress')
|
|
bindir = os.path.join(pg_distrib_dir, 'bin')
|
|
schedule = os.path.join(src_path, 'parallel_schedule')
|
|
pg_regress = os.path.join(build_path, 'pg_regress')
|
|
|
|
pg_regress_command = [
|
|
pg_regress,
|
|
'--bindir=""',
|
|
'--use-existing',
|
|
'--bindir={}'.format(bindir),
|
|
'--dlpath={}'.format(build_path),
|
|
'--schedule={}'.format(schedule),
|
|
'--inputdir={}'.format(src_path),
|
|
]
|
|
|
|
env = {
|
|
'PGPORT': str(PORT),
|
|
'PGUSER': username,
|
|
'PGHOST': HOST,
|
|
}
|
|
|
|
# Run the command.
|
|
# We don't capture the output. It's not too chatty, and it always
|
|
# logs the exact same data to `regression.out` anyway.
|
|
|
|
zen_simple.pg_bin.run(pg_regress_command, env=env, cwd=runpath)
|