/* * This file is part of the ZoneMinder Project. See AUTHORS file for Copyright information * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "zm_catch2.h" #include "zm_config.h" #include #include #include #include #include namespace { // Writes `body` to a fresh /tmp file and returns its path; caller unlinks. std::string WriteTempConf(const std::string &body) { char path[] = "/tmp/zm_conf_test_XXXXXX"; int fd = mkstemp(path); REQUIRE(fd >= 0); ssize_t n = write(fd, body.data(), body.size()); REQUIRE(n == static_cast(body.size())); close(fd); return std::string(path); } } // namespace TEST_CASE("process_configfile: backslash continuation joins lines") { const std::string body = "ZM_SERVER_NAME = first\\\n" " second\\\n" " third\n"; std::string path = WriteTempConf(body); staticConfig.SERVER_NAME.clear(); process_configfile(path.c_str()); unlink(path.c_str()); // Leading whitespace on continuation lines is trimmed. REQUIRE(staticConfig.SERVER_NAME == "firstsecondthird"); } TEST_CASE("process_configfile: bare backslash inside value is preserved") { // No newline after the backslash, so it is not a continuation marker. const std::string body = "ZM_DIR_EXPORTS = C:\\Users\\zm\n"; std::string path = WriteTempConf(body); staticConfig.DIR_EXPORTS.clear(); process_configfile(path.c_str()); unlink(path.c_str()); REQUIRE(staticConfig.DIR_EXPORTS == "C:\\Users\\zm"); } TEST_CASE("process_configfile: lines longer than the legacy 512-byte cap survive") { // A 1500-byte value would have been truncated by the old fgets() buffer. std::string long_value(1500, 'a'); const std::string body = "ZM_DB_HOST = " + long_value + "\n"; std::string path = WriteTempConf(body); staticConfig.DB_HOST.clear(); process_configfile(path.c_str()); unlink(path.c_str()); REQUIRE(staticConfig.DB_HOST == long_value); }