aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/ProjTest.cmake8
-rw-r--r--docs/source/resource_files.rst13
-rw-r--r--scripts/reference_exported_symbols.txt1
-rw-r--r--src/4D_api.cpp11
-rw-r--r--src/filemanager.cpp77
-rw-r--r--src/filemanager.hpp8
-rw-r--r--src/open_lib.cpp21
-rw-r--r--src/proj_internal.h4
-rw-r--r--test/cli/Makefile.am12
-rw-r--r--test/gie/Makefile.am20
-rw-r--r--test/gigs/Makefile.am34
-rw-r--r--test/unit/CMakeLists.txt18
-rw-r--r--test/unit/Makefile.am10
-rw-r--r--test/unit/gie_self_tests.cpp4
-rw-r--r--test/unit/proj_context_test.cpp62
15 files changed, 201 insertions, 102 deletions
diff --git a/cmake/ProjTest.cmake b/cmake/ProjTest.cmake
index 6abfbcd7..a016cd9a 100644
--- a/cmake/ProjTest.cmake
+++ b/cmake/ProjTest.cmake
@@ -28,10 +28,10 @@ function(proj_add_test_script_sh SH_NAME BIN_USE)
)
if(MSVC)
set_tests_properties( ${testname}
- PROPERTIES ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data\\;${PROJECT_SOURCE_DIR}/data")
+ PROPERTIES ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data\\;${PROJECT_SOURCE_DIR}/data")
else()
set_tests_properties( ${testname}
- PROPERTIES ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data:${PROJECT_SOURCE_DIR}/data")
+ PROPERTIES ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data:${PROJECT_SOURCE_DIR}/data")
endif()
endif()
@@ -51,10 +51,10 @@ function(proj_add_gie_test TESTNAME TESTCASE)
if(MSVC)
set_tests_properties( ${TESTNAME}
- PROPERTIES ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data\\;${PROJECT_SOURCE_DIR}/data")
+ PROPERTIES ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data\\;${PROJECT_SOURCE_DIR}/data")
else()
set_tests_properties( ${TESTNAME}
- PROPERTIES ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data:${PROJECT_SOURCE_DIR}/data")
+ PROPERTIES ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data:${PROJECT_SOURCE_DIR}/data")
endif()
diff --git a/docs/source/resource_files.rst b/docs/source/resource_files.rst
index 51db94fb..3684a948 100644
--- a/docs/source/resource_files.rst
+++ b/docs/source/resource_files.rst
@@ -23,21 +23,34 @@ The following paths are checked in order:
- For transformation grids that have an explict relative or absolute path,
the directory specified in the grid filename.
+
- Path resolved by the callback function set with
the :c:func:`proj_context_set_file_finder`. If it is set, the next tests
will not be run.
+
- Path(s) set with the :c:func:`proj_context_set_search_paths`. If set, the
next tests will not be run.
+
+- The PROJ user writable directory, which is :
+
+ * on Windows, ${LOCALAPPDATA}/proj
+ * on MacOSX, ${HOME}/Library/Logs/proj
+ * on other platforms (Linux), ${XDG_DATA_HOME}/proj if :envvar:`XDG_DATA_HOME`
+ is defined. Else ${HOME}/.local/share/proj
+
- Path(s) set with by the environment variable :envvar:`PROJ_LIB`.
On Linux/MacOSX/Unix, use ``:`` to separate paths. On Windows, ``;``
+
- On Windows, the *..\\share\\proj\\* and its contents are found automatically
at run-time if the installation respects the build structure. That is, the
binaries and proj.dll are installed under *..\\bin\\*, and resource files
are in *..\\share\\proj\\*.
+
- A path built into PROJ as its resource installation directory (whose value is
$(pkgdatadir)), for builds using the Makefile build system. Note, however,
that since this is a hard-wired path setting, it only works if the whole
PROJ installation is not moved somewhere else.
+
- The current directory
When networking capabilities are enabled, either by API with the
diff --git a/scripts/reference_exported_symbols.txt b/scripts/reference_exported_symbols.txt
index 90a1d3cf..a1c03e99 100644
--- a/scripts/reference_exported_symbols.txt
+++ b/scripts/reference_exported_symbols.txt
@@ -708,6 +708,7 @@ pj_cleanup_lock
pj_clear_initcache
pj_compare_datums
pj_context_get_grid_cache_filename(projCtx_t*)
+pj_context_get_user_writable_directory(projCtx_t*, bool)
pj_context_is_network_enabled(projCtx_t*)
pj_ctx_alloc
pj_ctx_fclose
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index cee8262e..9107723d 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -48,6 +48,7 @@
#include <math.h>
#include "geodesic.h"
#include "grids.hpp"
+#include "filemanager.hpp"
#include "proj/common.hpp"
#include "proj/coordinateoperation.hpp"
@@ -1450,6 +1451,16 @@ PJ_INFO proj_info (void) {
/* build search path string */
auto ctx = pj_get_default_ctx();
if (!ctx || ctx->search_paths.empty()) {
+ // Env var mostly for testing purposes and being independent from
+ // an existing installation
+ const char* ignoreUserWritableDirectory =
+ getenv("PROJ_IGNORE_USER_WRITABLE_DIRECTORY");
+ if( ignoreUserWritableDirectory == nullptr ||
+ ignoreUserWritableDirectory[0] == '\0' ) {
+ buf = path_append(buf,
+ pj_context_get_user_writable_directory(ctx, false).c_str(),
+ &buf_size);
+ }
const char *envPROJ_LIB = getenv("PROJ_LIB");
buf = path_append(buf, envPROJ_LIB, &buf_size);
#ifdef PROJ_LIB
diff --git a/src/filemanager.cpp b/src/filemanager.cpp
index 1a94216d..1c49a16b 100644
--- a/src/filemanager.cpp
+++ b/src/filemanager.cpp
@@ -2294,48 +2294,61 @@ static void CreateDirectory(const std::string &path) {
// ---------------------------------------------------------------------------
-std::string pj_context_get_grid_cache_filename(PJ_CONTEXT *ctx) {
- pj_load_ini(ctx);
- if (!ctx->gridChunkCache.filename.empty()) {
- return ctx->gridChunkCache.filename;
- }
- std::string path;
+std::string pj_context_get_user_writable_directory(PJ_CONTEXT *ctx,
+ bool create) {
+ if (ctx->user_writable_directory.empty()) {
+ std::string path;
#ifdef _WIN32
- std::wstring wPath;
- wPath.resize(MAX_PATH);
- if (SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0, &wPath[0]) ==
- S_OK) {
- wPath.resize(wcslen(wPath.data()));
- path = WStringToUTF8(wPath);
- } else {
- const char *local_app_data = getenv("LOCALAPPDATA");
- if (!local_app_data) {
- local_app_data = getenv("TEMP");
+ std::wstring wPath;
+ wPath.resize(MAX_PATH);
+ if (SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0,
+ &wPath[0]) == S_OK) {
+ wPath.resize(wcslen(wPath.data()));
+ path = WStringToUTF8(wPath);
+ } else {
+ const char *local_app_data = getenv("LOCALAPPDATA");
if (!local_app_data) {
- local_app_data = "c:/users";
+ local_app_data = getenv("TEMP");
+ if (!local_app_data) {
+ local_app_data = "c:/users";
+ }
}
+ path = local_app_data;
}
- path = local_app_data;
- }
#else
- const char *xdg_data_home = getenv("XDG_DATA_HOME");
- if (xdg_data_home != nullptr) {
- path = xdg_data_home;
- } else {
- const char *home = getenv("HOME");
- if (home) {
+ const char *xdg_data_home = getenv("XDG_DATA_HOME");
+ if (xdg_data_home != nullptr) {
+ path = xdg_data_home;
+ } else {
+ const char *home = getenv("HOME");
+ if (home) {
#if defined(__MACH__) && defined(__APPLE__)
- path = std::string(home) + "/Library/Logs";
+ path = std::string(home) + "/Library/Logs";
#else
- path = std::string(home) + "/.local/share";
+ path = std::string(home) + "/.local/share";
#endif
- } else {
- path = "/tmp";
+ } else {
+ path = "/tmp";
+ }
}
- }
#endif
- path += "/proj";
- CreateDirectory(path);
+ path += "/proj";
+ ctx->user_writable_directory = path;
+ }
+ if (create) {
+ CreateDirectory(ctx->user_writable_directory);
+ }
+ return ctx->user_writable_directory;
+}
+
+// ---------------------------------------------------------------------------
+
+std::string pj_context_get_grid_cache_filename(PJ_CONTEXT *ctx) {
+ pj_load_ini(ctx);
+ if (!ctx->gridChunkCache.filename.empty()) {
+ return ctx->gridChunkCache.filename;
+ }
+ const std::string path(pj_context_get_user_writable_directory(ctx, true));
ctx->gridChunkCache.filename = path + "/cache.db";
return ctx->gridChunkCache.filename;
}
diff --git a/src/filemanager.hpp b/src/filemanager.hpp
index 11fb6356..9793267c 100644
--- a/src/filemanager.hpp
+++ b/src/filemanager.hpp
@@ -33,10 +33,10 @@
#include "proj.h"
#include "proj/util.hpp"
-NS_PROJ_START
-
//! @cond Doxygen_Suppress
+NS_PROJ_START
+
class File;
class FileManager {
@@ -74,8 +74,8 @@ class File {
const std::string &name() const { return name_; }
};
-//! @endcond Doxygen_Suppress
-
NS_PROJ_END
+//! @endcond Doxygen_Suppress
+
#endif // FILEMANAGER_HPP_INCLUDED \ No newline at end of file
diff --git a/src/open_lib.cpp b/src/open_lib.cpp
index 222dd757..ae387281 100644
--- a/src/open_lib.cpp
+++ b/src/open_lib.cpp
@@ -224,6 +224,16 @@ static bool is_rel_or_absolute_filename(const char *name)
|| (name[0] != '\0' && name[1] == ':' && strchr(dir_chars,name[2]));
}
+static bool ignoreUserWritableDirectory()
+{
+ // Env var mostly for testing purposes and being independent from
+ // an existing installation
+ const char* envVarIgnoreUserWritableDirectory =
+ getenv("PROJ_IGNORE_USER_WRITABLE_DIRECTORY");
+ return envVarIgnoreUserWritableDirectory != nullptr &&
+ envVarIgnoreUserWritableDirectory[0] != '\0';
+}
+
static void*
pj_open_lib_internal(projCtx ctx, const char *name, const char *mode,
void* (*open_file)(projCtx, const char*, const char*),
@@ -279,6 +289,17 @@ pj_open_lib_internal(projCtx ctx, const char *name, const char *mode,
break;
}
}
+
+ else if( !ignoreUserWritableDirectory() &&
+ (fid = open_file(ctx,
+ (pj_context_get_user_writable_directory(ctx, false) +
+ DIR_CHAR + name).c_str(), mode)) != nullptr ) {
+ fname = pj_context_get_user_writable_directory(ctx, false);
+ fname += DIR_CHAR;
+ fname += name;
+ sysname = fname.c_str();
+ }
+
/* if is environment PROJ_LIB defined */
else if ((sysname = getenv("PROJ_LIB")) != nullptr) {
auto paths = NS_PROJ::internal::split(std::string(sysname), dirSeparator);
diff --git a/src/proj_internal.h b/src/proj_internal.h
index 63c53551..ce7b9d74 100644
--- a/src/proj_internal.h
+++ b/src/proj_internal.h
@@ -709,6 +709,7 @@ struct projCtx_t {
bool iniFileLoaded = false;
std::string endpoint{};
+ std::string user_writable_directory{};
projGridChunkCache gridChunkCache{};
int projStringParserCreateFromPROJStringRecursionCounter = 0; // to avoid potential infinite recursion in PROJStringParser::createFromPROJString()
@@ -844,8 +845,9 @@ std::string pj_context_get_url_endpoint(PJ_CONTEXT* ctx);
void pj_load_ini(PJ_CONTEXT* ctx);
-// For testing purposes
+// Exported for testing purposes only
std::string PROJ_DLL pj_context_get_grid_cache_filename(PJ_CONTEXT *ctx);
+std::string PROJ_DLL pj_context_get_user_writable_directory(PJ_CONTEXT *ctx, bool create);
/* classic public API */
#include "proj_api.h"
diff --git a/test/cli/Makefile.am b/test/cli/Makefile.am
index 758352c6..253b85d8 100644
--- a/test/cli/Makefile.am
+++ b/test/cli/Makefile.am
@@ -27,7 +27,7 @@ EXTRA_DIST = pj_out27.dist pj_out83.dist td_out.dist \
CMakeLists.txt
testprojinfo-check:
- PROJ_LIB=$(PROJ_LIB) $(TESTPROJINFO) $(PROJINFOEXE)
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(TESTPROJINFO) $(PROJINFOEXE)
test27-check:
$(TEST27) $(PROJEXE)
@@ -36,24 +36,24 @@ test83-check:
$(TEST83) $(PROJEXE)
testvarious-check:
- PROJ_LIB=$(PROJ_LIB) $(TESTVARIOUS) $(CS2CSEXE)
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(TESTVARIOUS) $(CS2CSEXE)
testdatumfile-check:
@if [ -f $(PROJ_LIB)/conus -a -f $(PROJ_LIB)/ntv1_can.dat -a -f $(PROJ_LIB)/MD -a -f $(PROJ_LIB)/ntf_r93.gsb -a -f $(PROJ_LIB)/egm96_15.gtx ]; then \
- PROJ_LIB=$(PROJ_LIB) $(TESTDATUMFILE) $(CS2CSEXE) ; \
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(TESTDATUMFILE) $(CS2CSEXE) ; \
fi
testign-check:
@if [ -f $(PROJ_LIB)/ntf_r93.gsb ] ; then \
- PROJ_LIB=$(PROJ_LIB) $(TESTIGN) $(CS2CSEXE) ; \
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(TESTIGN) $(CS2CSEXE) ; \
fi
testntv2-check:
@if [ -f $(PROJ_LIB)/ntv2_0.gsb -a -f $(PROJ_LIB)/conus -a -f $(PROJ_LIB)/ntv1_can.dat ] ; then \
- PROJ_LIB=$(PROJ_LIB) $(TESTNTV2) $(CS2CSEXE) ; \
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(TESTNTV2) $(CS2CSEXE) ; \
fi
testcct-check:
- PROJ_LIB=$(PROJ_LIB) $(TESTCCT) $(CCTEXE)
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(TESTCCT) $(CCTEXE)
check-local: testprojinfo-check test27-check test83-check testvarious-check testdatumfile-check testign-check testntv2-check testcct-check
diff --git a/test/gie/Makefile.am b/test/gie/Makefile.am
index ff333a14..1539cb2e 100644
--- a/test/gie/Makefile.am
+++ b/test/gie/Makefile.am
@@ -15,33 +15,33 @@ EXTRA_DIST = 4D-API_cs2cs-style.gie \
PROJ_LIB ?= ../../data
4D-API-cs2cs-style: 4D-API_cs2cs-style.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
GDA: GDA.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
axisswap: axisswap.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
builtins: builtins.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
deformation: deformation.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
ellipsoid: ellipsoid.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
more_builtins: more_builtins.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
unitconvert: unitconvert.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
DHDN_ETRS89: DHDN_ETRS89.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
geotiff_grids: geotiff_grids.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
check-local: 4D-API-cs2cs-style GDA axisswap builtins deformation ellipsoid more_builtins unitconvert DHDN_ETRS89 geotiff_grids
diff --git a/test/gigs/Makefile.am b/test/gigs/Makefile.am
index bea3be59..56493550 100644
--- a/test/gigs/Makefile.am
+++ b/test/gigs/Makefile.am
@@ -23,54 +23,54 @@ EXTRA_DIST = \
PROJ_LIB ?= ../../data
5101.1: 5101.1-jhs.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5101.2: 5101.2-jhs.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5101.3: 5101.3-jhs.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5101.4: 5101.4-jhs-etmerc.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5102.1: 5102.1.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5103.1: 5103.1.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5103.2: 5103.2.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5103.3: 5103.3.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5105.2: 5105.2.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5106: 5106.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5107: 5107.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5109: 5109.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5111.1: 5111.1.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5112: 5112.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5113: 5113.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5201: 5201.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
5208: 5208.gie
- PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $<
check-local: 5101.1 5101.2 5101.3 5101.4 5102.1 5103.1 5103.2 5103.3 5105.2 5106 5107 5109 5111.1 5112 5113 5201 5208
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index 35a6e4c1..e1eefcf0 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -71,7 +71,7 @@ target_link_libraries(proj_pj_transform_test
${PROJ_LIBRARIES})
add_test(NAME proj_pj_transform_test COMMAND proj_pj_transform_test)
set_property(TEST proj_pj_transform_test
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
add_executable(proj_errno_string_test
@@ -82,7 +82,7 @@ target_link_libraries(proj_errno_string_test
${PROJ_LIBRARIES})
add_test(NAME proj_errno_string_test COMMAND proj_errno_string_test)
set_property(TEST proj_errno_string_test
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
add_executable(proj_angular_io_test
main.cpp
@@ -92,7 +92,7 @@ target_link_libraries(proj_angular_io_test
${PROJ_LIBRARIES})
add_test(NAME proj_angular_io_test COMMAND proj_angular_io_test)
set_property(TEST proj_angular_io_test
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
add_executable(proj_context_test
main.cpp
@@ -102,7 +102,7 @@ target_link_libraries(proj_context_test
${PROJ_LIBRARIES})
add_test(NAME proj_context_test COMMAND proj_context_test)
set_property(TEST proj_context_test
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
if(MSVC AND BUILD_LIBPROJ_SHARED)
# ph_phi2_test not compatible of a .dll build
@@ -115,7 +115,7 @@ else()
${PROJ_LIBRARIES})
add_test(NAME pj_phi2_test COMMAND pj_phi2_test)
set_property(TEST pj_phi2_test
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
endif()
add_executable(proj_test_cpp_api
@@ -135,7 +135,7 @@ target_link_libraries(proj_test_cpp_api
${SQLITE3_LIBRARY})
add_test(NAME proj_test_cpp_api COMMAND proj_test_cpp_api)
set_property(TEST proj_test_cpp_api
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
add_executable(gie_self_tests
@@ -146,7 +146,7 @@ target_link_libraries(gie_self_tests
${PROJ_LIBRARIES})
add_test(NAME gie_self_tests COMMAND gie_self_tests)
set_property(TEST gie_self_tests
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data")
add_executable(test_network
@@ -163,8 +163,8 @@ target_link_libraries(test_network
add_test(NAME test_network COMMAND test_network)
if(MSVC)
set_property(TEST test_network
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data\\;${PROJECT_SOURCE_DIR}/data;PROJ_SOURCE_DATA=${PROJECT_SOURCE_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data\\;${PROJECT_SOURCE_DIR}/data;PROJ_SOURCE_DATA=${PROJECT_SOURCE_DIR}/data")
else()
set_property(TEST test_network
- PROPERTY ENVIRONMENT "PROJ_LIB=${PROJECT_BINARY_DIR}/data:${PROJECT_SOURCE_DIR}/data;PROJ_SOURCE_DATA=${PROJECT_SOURCE_DIR}/data")
+ PROPERTY ENVIRONMENT "PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES;PROJ_LIB=${PROJECT_BINARY_DIR}/data:${PROJECT_SOURCE_DIR}/data;PROJ_SOURCE_DATA=${PROJECT_SOURCE_DIR}/data")
endif()
diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am
index 422fe687..7ffb06ae 100644
--- a/test/unit/Makefile.am
+++ b/test/unit/Makefile.am
@@ -23,7 +23,7 @@ pj_transform_test_SOURCES = pj_transform_test.cpp main.cpp
pj_transform_test_LDADD = ../../src/libproj.la @GTEST_LIBS@
pj_transform_test-check: pj_transform_test
- PROJ_LIB=$(PROJ_LIB) ./pj_transform_test
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) ./pj_transform_test
pj_phi2_test_SOURCES = pj_phi2_test.cpp main.cpp
pj_phi2_test_LDADD = ../../src/libproj.la @GTEST_LIBS@
@@ -47,19 +47,19 @@ proj_context_test_SOURCES = proj_context_test.cpp main.cpp
proj_context_test_LDADD = ../../src/libproj.la @GTEST_LIBS@
proj_context_test-check: proj_context_test
- ./proj_context_test
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES ./proj_context_test
test_cpp_api_SOURCES = test_util.cpp test_common.cpp test_crs.cpp test_metadata.cpp test_io.cpp test_operation.cpp test_datum.cpp test_factory.cpp test_c_api.cpp main.cpp
test_cpp_api_LDADD = ../../src/libproj.la @GTEST_LIBS@ @SQLITE3_LIBS@
test_cpp_api-check: test_cpp_api
- PROJ_LIB=$(PROJ_LIB) ./test_cpp_api
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) ./test_cpp_api
gie_self_tests_SOURCES = gie_self_tests.cpp main.cpp
gie_self_tests_LDADD = ../../src/libproj.la @GTEST_LIBS@ @SQLITE3_LIBS@
gie_self_tests-check: gie_self_tests
- PROJ_LIB=$(PROJ_LIB) ./gie_self_tests
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) ./gie_self_tests
include_proj_h_from_c_SOURCES = include_proj_h_from_c.c
@@ -68,6 +68,6 @@ test_network_CXXFLAGS = @CURL_CFLAGS@ @CURL_ENABLED_FLAGS@
test_network_LDADD = ../../src/libproj.la @GTEST_LIBS@ @SQLITE3_LIBS@ @CURL_LIBS@
test_network-check: test_network
- PROJ_LIB=$(PROJ_LIB) PROJ_SOURCE_DATA=$(PROJ_LIB) ./test_network
+ PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES PROJ_LIB=$(PROJ_LIB) PROJ_SOURCE_DATA=$(PROJ_LIB) ./test_network
check-local: pj_transform_test-check pj_phi2_test-check proj_errno_string_test-check proj_angular_io_test-check proj_context_test-check test_cpp_api-check gie_self_tests-check test_network-check
diff --git a/test/unit/gie_self_tests.cpp b/test/unit/gie_self_tests.cpp
index a738db75..a3b41fb0 100644
--- a/test/unit/gie_self_tests.cpp
+++ b/test/unit/gie_self_tests.cpp
@@ -348,7 +348,9 @@ TEST(gie, info_functions) {
/* proj_info() */
/* this one is difficult to test, since the output changes with the setup */
+ putenv(const_cast<char *>("PROJ_IGNORE_USER_WRITABLE_DIRECTORY="));
info = proj_info();
+ putenv(const_cast<char *>("PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES"));
if (info.version[0] != '\0') {
char tmpstr[64];
@@ -360,6 +362,8 @@ TEST(gie, info_functions) {
ASSERT_NE(std::string(info.searchpath), std::string());
}
+ ASSERT_TRUE(std::string(info.searchpath).find("/proj") != std::string::npos);
+
/* proj_pj_info() */
{
P = proj_create(PJ_DEFAULT_CTX,
diff --git a/test/unit/proj_context_test.cpp b/test/unit/proj_context_test.cpp
index 23c46f29..ec59590d 100644
--- a/test/unit/proj_context_test.cpp
+++ b/test/unit/proj_context_test.cpp
@@ -40,7 +40,20 @@
namespace {
-static std::string createTempDict(std::string &dirname) {
+static bool createTmpFile(const std::string &filename) {
+ FILE *f = fopen(filename.c_str(), "wt");
+ if (!f)
+ return false;
+ fprintf(
+ f,
+ "<MY_PIPELINE> +proj=pipeline +step +proj=utm +zone=31 +ellps=GRS80\n");
+ fclose(f);
+ return true;
+}
+
+// ---------------------------------------------------------------------------
+
+static std::string createTempDict(std::string &dirname, const char *filename) {
const char *temp_dir = getenv("TEMP");
if (!temp_dir) {
temp_dir = getenv("TMP");
@@ -58,16 +71,9 @@ static std::string createTempDict(std::string &dirname) {
std::string tmpFilename;
tmpFilename = temp_dir;
tmpFilename += DIR_CHAR;
- tmpFilename += "temp_proj_dic";
+ tmpFilename += filename;
- FILE *f = fopen(tmpFilename.c_str(), "wt");
- if (!f)
- return std::string();
- fprintf(
- f,
- "<MY_PIPELINE> +proj=pipeline +step +proj=utm +zone=31 +ellps=GRS80\n");
- fclose(f);
- return tmpFilename;
+ return createTmpFile(tmpFilename) ? tmpFilename : std::string();
}
// ---------------------------------------------------------------------------
@@ -85,7 +91,7 @@ static int MyUnlink(const std::string &filename) {
TEST(proj_context, proj_context_set_file_finder) {
std::string dirname;
- auto filename = createTempDict(dirname);
+ auto filename = createTempDict(dirname, "temp_proj_dic1");
if (filename.empty())
return;
@@ -111,7 +117,7 @@ TEST(proj_context, proj_context_set_file_finder) {
finderData.dirname = dirname;
proj_context_set_file_finder(ctx, finder, &finderData);
- auto P = proj_create(ctx, "+init=temp_proj_dic:MY_PIPELINE");
+ auto P = proj_create(ctx, "+init=temp_proj_dic1:MY_PIPELINE");
EXPECT_NE(P, nullptr);
proj_destroy(P);
@@ -125,7 +131,7 @@ TEST(proj_context, proj_context_set_file_finder) {
TEST(proj_context, proj_context_set_search_paths) {
std::string dirname;
- auto filename = createTempDict(dirname);
+ auto filename = createTempDict(dirname, "temp_proj_dic2");
if (filename.empty())
return;
@@ -134,7 +140,7 @@ TEST(proj_context, proj_context_set_search_paths) {
const char *path = dirname.c_str();
proj_context_set_search_paths(ctx, 1, &path);
- auto P = proj_create(ctx, "+init=temp_proj_dic:MY_PIPELINE");
+ auto P = proj_create(ctx, "+init=temp_proj_dic2:MY_PIPELINE");
EXPECT_NE(P, nullptr);
proj_destroy(P);
@@ -143,4 +149,32 @@ TEST(proj_context, proj_context_set_search_paths) {
MyUnlink(filename);
}
+// ---------------------------------------------------------------------------
+
+TEST(proj_context, read_grid_from_user_writable_directory) {
+
+ auto ctx = proj_context_create();
+ auto path = pj_context_get_user_writable_directory(ctx, true);
+ EXPECT_TRUE(!path.empty());
+ auto filename = path + DIR_CHAR + "temp_proj_dic3";
+ EXPECT_TRUE(createTmpFile(filename));
+ {
+ // Check that with PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES (set by
+ // calling script), we cannot find the file
+ auto P = proj_create(ctx, "+init=temp_proj_dic3:MY_PIPELINE");
+ EXPECT_EQ(P, nullptr);
+ proj_destroy(P);
+ }
+ {
+ // Cancel the effect of PROJ_IGNORE_USER_WRITABLE_DIRECTORY
+ putenv(const_cast<char *>("PROJ_IGNORE_USER_WRITABLE_DIRECTORY="));
+ auto P = proj_create(ctx, "+init=temp_proj_dic3:MY_PIPELINE");
+ EXPECT_NE(P, nullptr);
+ putenv(const_cast<char *>("PROJ_IGNORE_USER_WRITABLE_DIRECTORY=YES"));
+ proj_destroy(P);
+ }
+ proj_context_destroy(ctx);
+ MyUnlink(filename);
+}
+
} // namespace