On 2019-07-28 20:12, Tom Lane wrote:
> So I wish we could get rid of the Makefile changes, have the test
> scripts be completely responsible for whether to run themselves or
> not, and put them into the schedule files normally.
> 
> It's pretty obvious how we might do this for collate.icu.utf8:
> make it look to see if there are any ICU-supplied collations in
> pg_collation.
> 
> I'm less clear on a reasonable way to detect a glibc platform
> from SQL.  The best I can think of is to see if the string
> "linux" appears in the output of version(), and that's probably
> none too robust.  Can we do anything based on the content of
> pg_collation?  Probably not :-(.
> 
> Still, even if you only fixed collate.icu.utf8 this way, that
> would be a step forward since it would solve the Windows aspect.

Good points.  Updated patch attach.

(The two tests create the same schema name, so they cannot be run in
parallel.  I opted against changing that here, since it would blow up
the patch and increase the diff between the two tests.)

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 0a4abb39d68406313e373aac82faa101bb62b5dd Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 29 Jul 2019 07:10:42 +0200
Subject: [PATCH v3] Run UTF8-requiring collation tests by default

The tests collate.icu.utf8 and collate.linux.utf8 were previously only
run when explicitly selected via EXTRA_TESTS.  They require a UTF8
database, because the error messages in the expected files refer to
that, and they use some non-ASCII characters in the tests.  Since
users can select any locale and encoding for the regression test run,
it was not possible to include these tests automatically.

To fix, use psql's \if facility to check various prerequisites such as
platform and the server encoding and quit the tests at the very
beginning if the configuration is not adequate.  We then need to
maintain alternative expected files for these tests, but they are very
tiny and never need to change after this.

These two tests are now run automatically as part of the regression
tests.

Discussion: 
https://www.postgresql.org/message-id/flat/052295c2-a2e1-9a21-bd36-8fbff8686cf3%402ndquadrant.com
---
 doc/src/sgml/regress.sgml                          |  8 --------
 src/test/regress/expected/collate.icu.utf8.out     |  7 +++++++
 src/test/regress/expected/collate.icu.utf8_1.out   |  9 +++++++++
 src/test/regress/expected/collate.linux.utf8.out   |  7 +++++++
 src/test/regress/expected/collate.linux.utf8_1.out | 11 +++++++++++
 src/test/regress/parallel_schedule                 |  5 +++--
 src/test/regress/serial_schedule                   |  2 ++
 src/test/regress/sql/collate.icu.utf8.sql          |  8 ++++++++
 src/test/regress/sql/collate.linux.utf8.sql        |  8 ++++++++
 9 files changed, 55 insertions(+), 10 deletions(-)
 create mode 100644 src/test/regress/expected/collate.icu.utf8_1.out
 create mode 100644 src/test/regress/expected/collate.linux.utf8_1.out

diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml
index 7b68213266..d98187c970 100644
--- a/doc/src/sgml/regress.sgml
+++ b/doc/src/sgml/regress.sgml
@@ -363,14 +363,6 @@ <title>Extra Tests</title>
 <screen>
 make check EXTRA_TESTS=numeric_big
 </screen>
-    To run the collation tests:
-<screen>
-make check EXTRA_TESTS='collate.linux.utf8 collate.icu.utf8' LANG=en_US.utf8
-</screen>
-    The <literal>collate.linux.utf8</literal> test works only on Linux/glibc
-    platforms.  The <literal>collate.icu.utf8</literal> test only works when
-    support for ICU was built.  Both tests will only succeed when run in a
-    database that uses UTF-8 encoding.
    </para>
   </sect2>
 
diff --git a/src/test/regress/expected/collate.icu.utf8.out 
b/src/test/regress/expected/collate.icu.utf8.out
index 01bd9fb5dd..51262e0bf4 100644
--- a/src/test/regress/expected/collate.icu.utf8.out
+++ b/src/test/regress/expected/collate.icu.utf8.out
@@ -1,6 +1,13 @@
 /*
  * This test is for ICU collations.
  */
+/* skip test if not UTF8 server encoding or no ICU collations installed */
+SELECT getdatabaseencoding() <> 'UTF8' OR
+       (SELECT count(*) FROM pg_collation WHERE collprovider = 'i') = 0
+       AS skip_test \gset
+\if :skip_test
+\quit
+\endif
 SET client_encoding TO UTF8;
 CREATE SCHEMA collate_tests;
 SET search_path = collate_tests;
diff --git a/src/test/regress/expected/collate.icu.utf8_1.out 
b/src/test/regress/expected/collate.icu.utf8_1.out
new file mode 100644
index 0000000000..a6a33b39ab
--- /dev/null
+++ b/src/test/regress/expected/collate.icu.utf8_1.out
@@ -0,0 +1,9 @@
+/*
+ * This test is for ICU collations.
+ */
+/* skip test if not UTF8 server encoding or no ICU collations installed */
+SELECT getdatabaseencoding() <> 'UTF8' OR
+       (SELECT count(*) FROM pg_collation WHERE collprovider = 'i') = 0
+       AS skip_test \gset
+\if :skip_test
+\quit
diff --git a/src/test/regress/expected/collate.linux.utf8.out 
b/src/test/regress/expected/collate.linux.utf8.out
index 619688f851..ad56ff9caa 100644
--- a/src/test/regress/expected/collate.linux.utf8.out
+++ b/src/test/regress/expected/collate.linux.utf8.out
@@ -3,6 +3,13 @@
  * locales is installed.  It must be run in a database with UTF-8 encoding,
  * because other encodings don't support all the characters used.
  */
+SELECT getdatabaseencoding() <> 'UTF8' OR
+       (SELECT count(*) FROM pg_collation WHERE collname IN ('de_DE', 'en_US', 
'sv_SE', 'tr_TR') AND collencoding = pg_char_to_encoding('UTF8')) <> 4 OR
+       version() !~ 'linux-gnu'
+       AS skip_test \gset
+\if :skip_test
+\quit
+\endif
 SET client_encoding TO UTF8;
 CREATE SCHEMA collate_tests;
 SET search_path = collate_tests;
diff --git a/src/test/regress/expected/collate.linux.utf8_1.out 
b/src/test/regress/expected/collate.linux.utf8_1.out
new file mode 100644
index 0000000000..ede5fdb5dc
--- /dev/null
+++ b/src/test/regress/expected/collate.linux.utf8_1.out
@@ -0,0 +1,11 @@
+/*
+ * This test is for Linux/glibc systems and assumes that a full set of
+ * locales is installed.  It must be run in a database with UTF-8 encoding,
+ * because other encodings don't support all the characters used.
+ */
+SELECT getdatabaseencoding() <> 'UTF8' OR
+       (SELECT count(*) FROM pg_collation WHERE collname IN ('de_DE', 'en_US', 
'sv_SE', 'tr_TR') AND collencoding = pg_char_to_encoding('UTF8')) <> 4 OR
+       version() !~ 'linux-gnu'
+       AS skip_test \gset
+\if :skip_test
+\quit
diff --git a/src/test/regress/parallel_schedule 
b/src/test/regress/parallel_schedule
index 8fb55f045e..fc0f14122b 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -78,11 +78,12 @@ test: brin gin gist spgist privileges init_privs 
security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_table_like alter_generic alter_operator misc async dbsize 
misc_functions sysviews tsrf tidscan
+test: create_table_like alter_generic alter_operator misc async dbsize 
misc_functions sysviews tsrf tidscan collate.icu.utf8
 
 # rules cannot run concurrently with any test that creates
 # a view or rule in the public schema
-test: rules psql psql_crosstab amutils stats_ext
+# collate.*.utf8 tests cannot be run in parallel with each other
+test: rules psql psql_crosstab amutils stats_ext collate.linux.utf8
 
 # run by itself so it can run parallel workers
 test: select_parallel
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index a39ca1012a..05b9f9c2b3 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -133,6 +133,8 @@ test: misc_functions
 test: sysviews
 test: tsrf
 test: tidscan
+test: collate.icu.utf8
+test: collate.linux.utf8
 test: rules
 test: psql
 test: psql_crosstab
diff --git a/src/test/regress/sql/collate.icu.utf8.sql 
b/src/test/regress/sql/collate.icu.utf8.sql
index 2be7759c92..46999fb926 100644
--- a/src/test/regress/sql/collate.icu.utf8.sql
+++ b/src/test/regress/sql/collate.icu.utf8.sql
@@ -2,6 +2,14 @@
  * This test is for ICU collations.
  */
 
+/* skip test if not UTF8 server encoding or no ICU collations installed */
+SELECT getdatabaseencoding() <> 'UTF8' OR
+       (SELECT count(*) FROM pg_collation WHERE collprovider = 'i') = 0
+       AS skip_test \gset
+\if :skip_test
+\quit
+\endif
+
 SET client_encoding TO UTF8;
 
 CREATE SCHEMA collate_tests;
diff --git a/src/test/regress/sql/collate.linux.utf8.sql 
b/src/test/regress/sql/collate.linux.utf8.sql
index c009fd2372..eac2f90014 100644
--- a/src/test/regress/sql/collate.linux.utf8.sql
+++ b/src/test/regress/sql/collate.linux.utf8.sql
@@ -4,6 +4,14 @@
  * because other encodings don't support all the characters used.
  */
 
+SELECT getdatabaseencoding() <> 'UTF8' OR
+       (SELECT count(*) FROM pg_collation WHERE collname IN ('de_DE', 'en_US', 
'sv_SE', 'tr_TR') AND collencoding = pg_char_to_encoding('UTF8')) <> 4 OR
+       version() !~ 'linux-gnu'
+       AS skip_test \gset
+\if :skip_test
+\quit
+\endif
+
 SET client_encoding TO UTF8;
 
 CREATE SCHEMA collate_tests;
-- 
2.22.0

Reply via email to