citus/src/test/regress
Onur Tirtir a9820e96a3 Make single_node_truncate.sql re-runnable
First of all, this commit sets next_shard_id for
single_node_truncate.sql because shard ids in the test output were
changing whenever we modify a prior test file.

Then the flaky test detector started complaining about
single_node_truncate.sql. We fix that by specifying the correct
test dependency for it in run_test.py.
2023-03-02 16:33:18 +03:00
..
bin Make run_test.py and create_test.py importable without errors (#6736) 2023-02-28 00:34:42 +03:00
citus_tests Make single_node_truncate.sql re-runnable 2023-03-02 16:33:18 +03:00
data Columnar: use generate_series for test rather than load. (#5181) 2021-08-16 16:12:06 -07:00
expected Make single_node_truncate.sql re-runnable 2023-03-02 16:33:18 +03:00
mitmscripts Fix issues reported by flake8 2023-02-10 13:05:37 +01:00
spec Fix flaky isolation_non_blocking_shard_split test (#6666) 2023-01-30 13:44:23 +01:00
sql Make single_node_truncate.sql re-runnable 2023-03-02 16:33:18 +03:00
.gitignore Pg vanilla tests can be run with citus created. (#6018) 2022-08-11 12:53:22 +03:00
Makefile Add valgrind support to run_test.py (#6667) 2023-01-27 16:01:59 +01:00
Pipfile Install non-vulnerable cryptography package (#6710) 2023-02-14 18:03:10 +01:00
Pipfile.lock Install non-vulnerable cryptography package (#6710) 2023-02-14 18:03:10 +01:00
README.md Fix link of path to flaky tests docs (#6579) 2022-12-23 12:09:22 +03:00
after_citus_upgrade_coord_schedule Use citus_finish_citus_upgrade() in the tests 2022-06-13 13:15:15 +02:00
after_pg_upgrade_schedule Add pg14->pg15 upgrade test for dist. triggers on part. tables (#6265) 2022-09-01 12:32:44 +03:00
base_isolation_schedule Replace iso tester func only once (#5964) 2022-07-06 11:04:31 +03:00
base_schedule Fix errors in base_schedule (#6247) 2022-08-25 18:06:41 +02:00
before_citus_upgrade_coord_schedule Add a new API for enabling Citus MX for clusters upgrading from earlier versions 2022-03-02 17:02:55 +01:00
before_pg_upgrade_schedule Add pg14->pg15 upgrade test for dist. triggers on part. tables (#6265) 2022-09-01 12:32:44 +03:00
columnar_isolation_schedule Split columnar stripe reservation into two phases (#5188) 2021-09-02 11:49:14 +03:00
columnar_schedule Fix flakyness in columnar_first_row_number test (#6192) 2022-08-18 15:32:57 +03:00
create_schedule Enable PRIMARY KEY generation via ALTER TABLE even if the constraint name is not provided (#6520) 2022-12-16 20:34:00 +03:00
enterprise_failure_schedule 'Deferred Drop' and robust 'Shard Cleanup' for Splits. (#6258) 2022-09-06 12:11:20 -07:00
enterprise_isolation_logicalrep_1_schedule Tests moving a shard with RLS owned by nonbypassrls & nonsuperuser (#6369) 2022-09-27 14:53:23 +03:00
enterprise_isolation_logicalrep_2_schedule Actually skip constraint validation on shards after shard move (#6640) 2023-01-27 13:08:05 +01:00
enterprise_isolation_logicalrep_3_schedule Enable binary logical replication for shard moves (#6017) 2022-08-23 16:38:00 +02:00
enterprise_isolation_schedule Nonblocking tenant isolation is supported by using split api. (#6167) 2022-08-17 11:13:07 +03:00
enterprise_minimal_schedule Remove shardstate leftovers (#6627) 2023-01-19 11:43:58 +03:00
enterprise_schedule Nonblocking tenant isolation is supported by using split api. (#6167) 2022-08-17 11:13:07 +03:00
failure_base_schedule Turn metadata sync on in base/minimal schedules 2021-12-08 13:34:41 +03:00
failure_schedule Add non-blocking variant of create_distributed_table (#6087) 2022-08-30 15:35:40 +03:00
flaky_tests.md Flaky Test Detection CI Workflow (#6495) 2022-12-12 14:36:23 +03:00
isolation_schedule Remove do_repair option from citus_copy_shard_placement (#6299) 2022-09-09 15:44:30 +02:00
log_test_times
minimal_schedule Reduce setup time of check-minimal and check-minimal-mx (#6117) 2022-08-02 17:58:59 +03:00
mixed_after_citus_upgrade_schedule Turn metadata sync on in upgrade schedules 2021-12-08 10:19:02 +03:00
mixed_before_citus_upgrade_schedule
multi_1_schedule Enable adding FOREIGN KEY constraints on Citus tables without a name. (#6616) 2023-01-20 01:43:52 +03:00
multi_follower_schedule Fix metadata sync fails on multi_follower_schedule 2021-12-08 13:07:37 +03:00
multi_mx_schedule Fix flaky tests local_shards_execution and local_shards_execution_replication. 2023-02-15 09:18:10 -08:00
multi_schedule Stop background daemon before dropping the database (#6688) 2023-02-03 15:15:44 +03:00
multi_schedule_hyperscale Cleans up test outputs (#6434) 2022-10-17 15:13:07 +03:00
multi_schedule_hyperscale_superuser Cleans up test outputs (#6434) 2022-10-17 15:13:07 +03:00
mx_base_schedule Fix failures in mx_base_schedule (#6601) 2023-01-06 14:48:18 +01:00
mx_minimal_schedule Reduce setup time of check-minimal and check-minimal-mx (#6117) 2022-08-02 17:58:59 +03:00
operations_schedule Drop SHARD_STATE_TO_DELETE (#6494) 2023-01-03 14:38:16 +03:00
pg_regress_multi.pl Use correct guc value to disable statistics collection (#6641) 2023-01-24 15:32:50 +01:00
postgres_schedule Add an infrastructure to run same tests with arbitrary configs (#5316) 2021-10-12 14:24:19 +03:00
split_schedule Unify dependent test files into one 2022-12-22 13:06:26 +03:00
sql_base_schedule Remove base test as it is not useful anymore 2021-10-18 20:31:18 +03:00
sql_schedule Enable PRIMARY KEY generation via ALTER TABLE even if the constraint name is not provided (#6520) 2022-12-16 20:34:00 +03:00

README.md

How our testing works

We use the test tooling of postgres to run our tests. This tooling is very simple but effective. The basics it runs a series of .sql scripts, gets their output and stores that in results/$sqlfilename.out. It then compares the actual output to the expected output with a simple diff command:

diff results/$sqlfilename.out expected/$sqlfilename.out

Schedules

Which sql scripts to run is defined in a schedule file, e.g. multi_schedule, multi_mx_schedule.

Makefile

In our Makefile we have rules to run the different types of test schedules. You can run them from the root of the repository like so:

# e.g. the multi_schedule
make install -j9 && make -C src/test/regress/ check-multi

Take a look at the makefile for a list of all the testing targets.

Running a specific test

Often you want to run a specific test and don't want to run everything. You can simply use run_test.py [test_name] script like below in that case. It detects the test schedule and make target to run the given test.

src/test/regress/citus_tests/run_test.py multi_utility_warnings

You can pass --repeat or r parameter to run the given test for multiple times.

src/test/regress/citus_tests/run_test.py multi_utility_warnings -r 1000

To force the script to use base schedules rather than minimal ones, you can pass -b or --use-base-schedule.

src/test/regress/citus_tests/run_test.py coordinator_shouldhaveshards -r 1000 --use-base-schedule

If you would like to run a specific test on a certain target you can use one of the following commands to do so:

# If your tests needs almost no setup you can use check-minimal
make install -j9 && make -C src/test/regress/ check-minimal EXTRA_TESTS='multi_utility_warnings'
# Often tests need some testing data, if you get missing table errors using
# check-minimal you should try check-base
make install -j9 && make -C src/test/regress/ check-base EXTRA_TESTS='with_prepare'
# Sometimes this is still not enough and some other test needs to be run before
# the test you want to run. You can do so by adding it to EXTRA_TESTS too.
make install -j9 && make -C src/test/regress/ check-base EXTRA_TESTS='add_coordinator coordinator_shouldhaveshards'

Normalization

The output of tests is sadly not completely predictable. Still we want to compare the output of different runs and error when the important things are different. We do this by not using the regular system diff to compare files. Instead we use src/test/regress/bin/diff which does the following things:

  1. Change the $sqlfilename.out file by running it through sed using the src/test/regress/bin/normalize.sed file. This does stuff like replacing numbers that keep changing across runs with an XXX string, e.g. portnumbers or transaction numbers.
  2. Backup the original output to $sqlfilename.out.unmodified in case it's needed for debugging
  3. Compare the changed results and expected files with the system diff command.

Updating the expected test output

Sometimes you add a test to an existing file, or test output changes in a way that's not bad (possibly even good if support for queries is added). In those cases you want to update the expected test output. The way to do this is very simple, you run the test and copy the new .out file in the results directory to the expected directory, e.g.:

make install -j9 && make -C src/test/regress/ check-minimal EXTRA_TESTS='multi_utility_warnings'
cp src/test/regress/{results,expected}/multi_utility_warnings.out

Adding a new test file

Adding a new test file is quite simple:

  1. Write the SQL file in the sql directory
  2. Add it to a schedule file, to make sure it's run in CI
  3. Run the test
  4. Check that the output is as expected
  5. Copy the .out file from results to expected

Isolation testing

See src/test/regress/spec/README.md

Upgrade testing

See src/test/regress/citus_tests/upgrade/README.md

Failure testing

See src/test/regress/mitmscripts/README.md

Perl test setup script

To automatically setup a citus cluster in tests we use our src/test/regress/pg_regress_multi.pl script. This sets up a citus cluster and then starts the standard postgres test tooling. You almost never have to change this file.

Handling different test outputs

Sometimes the test output changes because we run tests in different configurations. The most common example is an output that changes in different Postgres versions. We highly encourage to find a way to avoid these test outputs. You can try the following, if applicable to the changing output:

  • Change the test such that you still test what you want, but you avoid the different test outputs.
  • Reduce the test verbosity via: \set VERBOSITY terse, SET client_min_messages TO error, etc
  • Drop the specific test lines altogether, if the test is not critical.
  • Use utility functions that modify the output to your preference, like coordinator_plan, which modifies EXPLAIN output
  • Add a normalization rule

Alternative test output files are highly discouraged, so only add one when strictly necessary. In order to maintain a clean test suite, make sure to explain why it has an alternative output in the test header, and when we can drop the alternative output file in the future.

For example:

--
-- MULTI_INSERT_SELECT
--
-- This test file has an alternative output because of the change in the
-- display of SQL-standard function's arguments in INSERT/SELECT in PG15.
-- The alternative output can be deleted when we drop support for PG14
--

Including important keywords, like "PG14", "PG15", "alternative output" will help cleaning up in the future.

Randomly failing tests

In CI sometimes a test fails randomly, we call these tests "flaky". To fix these flaky tests see src/test/regress/flaky_tests.md