diff options
| author | toonn <toonn@toonn.io> | 2021-11-09 14:44:57 +0100 |
|---|---|---|
| committer | toonn <toonn@toonn.io> | 2021-11-10 14:27:12 +0100 |
| commit | e29acba814738dedb3a9a0479371f896f4560c6a (patch) | |
| tree | f2c959a125e8e94d06265d65816c50bfad603505 /test/unit | |
| parent | c20b3f6d1beaa7c5f1325d42e0f244ebaea52455 (diff) | |
| download | PROJ-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.cpp | 19 |
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); |
