aboutsummaryrefslogtreecommitdiff
path: root/test/unit
diff options
context:
space:
mode:
authortoonn <toonn@toonn.io>2021-11-09 14:44:57 +0100
committertoonn <toonn@toonn.io>2021-11-10 14:27:12 +0100
commite29acba814738dedb3a9a0479371f896f4560c6a (patch)
treef2c959a125e8e94d06265d65816c50bfad603505 /test/unit
parentc20b3f6d1beaa7c5f1325d42e0f244ebaea52455 (diff)
downloadPROJ-e29acba814738dedb3a9a0479371f896f4560c6a.tar.gz
PROJ-e29acba814738dedb3a9a0479371f896f4560c6a.zip
test: Make CApi test cross-platform
The test made an assumption of being able to open 1024 - 50 files. On some platforms, like older Darwin, the default limit is only 256. To avoid the issue entirely we retrieve the current limit for the process. We decrease the OPEN_MAX limit if it's too high. On some platforms fopen returned nullptrs before reaching the limit (-50) and this doesn't happen if we decrease the limit to 1024.
Diffstat (limited to 'test/unit')
-rw-r--r--test/unit/test_c_api.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index d3e81089..3548293d 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -47,6 +47,10 @@
#include <sqlite3.h>
+#if !defined(_WIN32)
+#include <sys/resource.h>
+#endif
+
#ifndef __MINGW32__
#include <thread>
#endif
@@ -6104,9 +6108,18 @@ TEST_F(CApi, open_plenty_of_contexts) {
// database
std::vector<FILE *> dummyFilePointers;
std::vector<PJ_CONTEXT *> ctxts;
- // 1024 is the number of file descriptors that can be opened simultaneously
- // by a Linux process (by default)
- for (int i = 0; i < 1024 - 50; i++) {
+ // The number of file descriptors that can be opened simultaneously by a
+ // process varies across platforms so we make use of getrlimit(2) to
+ // retrieve it.
+ struct rlimit open_max;
+ getrlimit(RLIMIT_NOFILE, &open_max);
+ // On some platforms fopen returned nullptrs before reaching limit - 50, we
+ // can avoid this by capping the limit to 1024.
+ if (open_max.rlim_cur > 1024) {
+ open_max.rlim_cur = 1024;
+ setrlimit(RLIMIT_NOFILE, &open_max);
+ }
+ for (rlim_t i = 0; i < open_max.rlim_cur - 50; i++) {
FILE *f = fopen("/dev/null", "rb");
ASSERT_TRUE(f != nullptr);
dummyFilePointers.push_back(f);