summaryrefslogtreecommitdiff
path: root/tests/tools.at
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2020-12-21 15:29:32 -0500
committerZack Weinberg <zackw@panix.com>2020-12-23 13:12:51 -0500
commitea9d7d9f1fc8a2ed91a8017683acf424ac7886ed (patch)
treecf9cc579f419844310a765cf7ae4b4bfa0d818b4 /tests/tools.at
parent237519e6e759d176651be226e39522ca3dcbf289 (diff)
downloadautoconf-ea9d7d9f1fc8a2ed91a8017683acf424ac7886ed.tar.gz
autom4te: correct error message when we can’t create autom4te.cache.
While testing something else, I noticed that autom4te may print a nonsensical error message when it fails to create autom4te.cache, because it checks again whether the directory already exists before giving up, and this clobbers errno. Instead of doing (the perl equivalent of) test -d $cache || mkdir $cache || test -d $cache call mkdir unconditionally. If it fails with an errno code other than EEXIST, consider that a hard failure; if it fails with EEXIST, check whether the thing that exists is in fact a directory. (A symlink to a directory qualifies; I wouldn’t be surprised if people are moving autom4te.cache around with symlinks.) Either way, if we fail, report strerror(errno) from the original mkdir failure. Also, print the current working directory as part of the error message; this aids debugging when you’re working with a big hairy nested tree. * bin/autom4te.in: Don’t check whether autom4te.cache exists before attempting to create it. Only stat autom4te.cache if mkdir fails with EEXIST, otherwise fail immediately. Make sure to report the errno code from mkdir, not the subsequent stat (if any). Report the current working directory as part of the error message. * tests/tools.at: Verify that autom4te reports the actual reason when it fails to create autom4te.cache. Verify that failure to create autom4te.cache because that name exists, but isn’t a directory, is detected.
Diffstat (limited to 'tests/tools.at')
-rw-r--r--tests/tools.at20
1 files changed, 18 insertions, 2 deletions
diff --git a/tests/tools.at b/tests/tools.at
index d32ad362..49710202 100644
--- a/tests/tools.at
+++ b/tests/tools.at
@@ -1534,20 +1534,36 @@ end-language: "Autoconf-without-aclocal-m4"
# A failed redirection may cause a status of 2 with FreeBSD sh.
AT_CHECK([(: > sub/some-file) || exit 1 && exit 77], 1, [ignore], [ignore])
-# Failure to create cache directory.
+# Failure to create cache directory due to access permissions.
AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
AT_CHECK([grep 'cannot create .*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([grep ': Permission denied' stderr], [0], [ignore])
AT_CHECK([test -f configure], [1])
+# Failure to create cache directory due to something else in the way.
chmod u+w sub
+: > sub/autom4te.cache
+AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
+AT_CHECK([grep 'cannot create .*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([grep ': File exists' stderr], [0], [ignore])
+AT_CHECK([test -f configure], [1])
+
+# This time, creation should succeed.
+rm -f sub/autom4te.cache
AT_CHECK_AUTOCONF
+AT_CHECK([test -d sub/autom4te.cache])
rm -f configure sub/autom4te.cache/*
chmod a-w sub/autom4te.cache
# Failure to create a file in the cache directory.
AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
-AT_CHECK([grep 'cannot open.*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([grep 'cannot open .*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([test -f configure], [1])
+
+# If the directory already exists, that should be fine.
+chmod u+w sub/autom4te.cache
+AT_CHECK_AUTOCONF
AT_CLEANUP