From 7f11c20f0d5197bf329aa37eaccd2654312c49f8 Mon Sep 17 00:00:00 2001
From: Per Cederqvist <ceder@lysator.liu.se>
Date: Sat, 19 Jun 2010 23:00:49 +0200
Subject: [PATCH] Refuse to run the test suite if expect is broken.

This causes "make check" to fail quickly if running on an expect that
has broken handling of zero-lenght writes, or if expect is really,
really slow due to broken glob gate.

* src/server/testsuite/Makefile.am (check-l2g): Depend on
working-dejagnu.
(check-lyskomd): Ditto.
(check-leaks): Ditto.
(working-dejagnu): New target.
(EXTRA_DIST): Added dejagnu.0/00-zero-length-write.exp and
dejagnu.0/90-slow-glob-gate.exp.

* src/server/testsuite/dejagnu.0/00-zero-length-write.exp: New
test, that fails on known bad versions of expect.

* src/server/testsuite/dejagnu.0/90-slow-glob-gate.exp: New test,
that fails if a simple regexp pattern causes expect to run too
slow, indicating that it is converted to a glob pattern that
causes a lot of backtracking.

* src/server/testsuite/.gitignore: Ignore dejagnu.log and
dejagnu.sum.
---
 ChangeLog                                     | 20 ++++++++++++++++
 src/server/testsuite/.gitignore               |  2 ++
 src/server/testsuite/Makefile.am              | 11 ++++++---
 .../dejagnu.0/00-zero-length-write.exp        | 11 +++++++++
 .../testsuite/dejagnu.0/90-slow-glob-gate.exp | 24 +++++++++++++++++++
 5 files changed, 65 insertions(+), 3 deletions(-)
 create mode 100644 src/server/testsuite/dejagnu.0/00-zero-length-write.exp
 create mode 100644 src/server/testsuite/dejagnu.0/90-slow-glob-gate.exp

diff --git a/ChangeLog b/ChangeLog
index d9e7e440f..79fbf9dee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2010-06-19  Per Cederqvist  <ceder@lysator.liu.se>
+
+	Refuse to run the test suite if expect is known to be so broken
+	that it cannot be run.
+	* src/server/testsuite/Makefile.am (check-l2g): Depend on
+	working-dejagnu.
+	(check-lyskomd): Ditto.
+	(check-leaks): Ditto.
+	(working-dejagnu): New target.
+	(EXTRA_DIST): Added dejagnu.0/00-zero-length-write.exp and
+	dejagnu.0/90-slow-glob-gate.exp.
+	* src/server/testsuite/dejagnu.0/00-zero-length-write.exp: New
+	test, that fails on known bad versions of expect.
+	* src/server/testsuite/dejagnu.0/90-slow-glob-gate.exp: New test,
+	that fails if a simple regexp pattern causes expect to run too
+	slow, indicating that it is converted to a glob pattern that
+	causes a lot of backtracking.
+	* src/server/testsuite/.gitignore: Ignore dejagnu.log and
+	dejagnu.sum.
+
 2010-05-23  Per Cederqvist  <ceder@lysator.liu.se>
 
 	Don't attempt to use DNS when no nameserver is available.
diff --git a/src/server/testsuite/.gitignore b/src/server/testsuite/.gitignore
index 4d063d154..f3c1e5072 100644
--- a/src/server/testsuite/.gitignore
+++ b/src/server/testsuite/.gitignore
@@ -13,6 +13,8 @@ bignum
 core
 db
 dbg.log
+dejagnu.log
+dejagnu.sum
 etc
 get-time-often
 gmon.out
diff --git a/src/server/testsuite/Makefile.am b/src/server/testsuite/Makefile.am
index bff254d75..cb0b1ba9c 100644
--- a/src/server/testsuite/Makefile.am
+++ b/src/server/testsuite/Makefile.am
@@ -52,6 +52,8 @@ EXTRA_DIST = \
 	leaks.0/leaks10.exp \
 	leaks.0/lots-aux-items.conf \
 	leaks.0/no-aux-items.conf \
+	dejagnu.0/00-zero-length-write.exp \
+	dejagnu.0/90-slow-glob-gate.exp \
 	locksuite.py \
 	lyskomd.supp \
 	renumber.el \
@@ -130,10 +132,10 @@ check-nondejagnu: check-testfd check-test-select check-test-sigjmp
 
 check-dejagnu: check-l2g check-lyskomd check-leaks
 
-check-l2g: test-l2g site.exp valgrind.wrap
+check-l2g: test-l2g site.exp valgrind.wrap working-dejagnu
 	runtest --tool l2g --srcdir $(srcdir)
 
-check-lyskomd: site.exp ../lyskomd valgrind.wrap bignum timeval-overflow
+check-lyskomd: site.exp ../lyskomd valgrind.wrap bignum timeval-overflow working-dejagnu
 if HAVE_PYTHON
 	runtest --tool lyskomd --srcdir $(srcdir) \
 		3<&- 4<&- 5<&- 6<&- 7<&- 8<&- 9<&-
@@ -149,7 +151,7 @@ endif
 # "make check" in lyskomd.0.
 check-lyskomd: check-recursive
 
-check-leaks: site.exp ../lyskomd valgrind.wrap
+check-leaks: site.exp ../lyskomd valgrind.wrap working-dejagnu
 if HAVE_PYTHON
 	runtest --tool leaks --srcdir $(srcdir) \
 		3<&- 4<&- 5<&- 6<&- 7<&- 8<&- 9<&-
@@ -160,6 +162,9 @@ else
 	@echo >&2
 endif
 
+working-dejagnu:
+	runtest --tool dejagnu --srcdir $(srcdir)
+
 check-testfd: testfd
 	./testfd
 
diff --git a/src/server/testsuite/dejagnu.0/00-zero-length-write.exp b/src/server/testsuite/dejagnu.0/00-zero-length-write.exp
new file mode 100644
index 000000000..d16eddccd
--- /dev/null
+++ b/src/server/testsuite/dejagnu.0/00-zero-length-write.exp
@@ -0,0 +1,11 @@
+# expect 5.43.0 contains a bug that causes the LysKOM test suite to
+# hang.  Unfortunately, I have not been able to create a short example
+# that reproduces the problem.  The official fix is visible here:
+#
+# http://expect.cvs.sourceforge.net/viewvc/expect/expect/exp_chan.c?r1=5.12&r2=5.13
+
+if {[exp_version] == "5.43.0"} {
+    fail "expect 5.43.0 is broken and causes the test suite to hang"
+} else {
+    pass "zero-length write bug probably not present"
+}
diff --git a/src/server/testsuite/dejagnu.0/90-slow-glob-gate.exp b/src/server/testsuite/dejagnu.0/90-slow-glob-gate.exp
new file mode 100644
index 000000000..fa142916c
--- /dev/null
+++ b/src/server/testsuite/dejagnu.0/90-slow-glob-gate.exp
@@ -0,0 +1,24 @@
+# expect 5.44.1.1 introduced a "gate keeper glob pattern", to avoid
+# using "slow" regexp matching.  Unfortunately, the glob pattern
+# constructed for many of our fast regular expressions are very, very
+# slow.  So slow that the test suite cannot continue.
+#
+# This test reproduces the problem to a small extent.  In expect
+# 5.43.0 and earlier this runs in less than 1 ms, but in 5.44.1.14 it
+# takes 1.3 seconds (on a particular computer).
+#
+# The bug is reported here:
+# http://sourceforge.net/tracker/?func=detail&atid=113179&aid=3010684&group_id=13179
+
+spawn echo "MRK:client1: :18 14 6 6 3 22 1 5 110 2 151 1 5 0 8 0 2 { 0 1 6 5 } 0 *\nMRK:client1: :18 14 7 6 3 22 1\n"
+set t0 [clock clicks -milliseconds]
+expect {
+    -re "^MRK:client1: :18 14 6 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 5 0 8 0 2 { 0 1 6 5 } 0 \\\\*\r?\n" {
+    }
+}
+set t1 [clock clicks -milliseconds]
+if {$t1 - $t0 > 20} {
+    fail "regexp matchint too slow ([expr $t1 - $t0] ms)"
+} else {
+    pass "regexp matching seems to be fast"
+}
-- 
GitLab