Newer
Older
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
Andy Cedilnik
committed
#include "kwsysPrivate.h"
# pragma warning(disable : 4786)
#include KWSYS_HEADER(FStream.hxx)
Andy Cedilnik
committed
#include KWSYS_HEADER(SystemTools.hxx)
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
#if 0
# include "FStream.hxx.in"
# include "SystemTools.hxx.in"
#endif
Brad King
committed
// Include with <> instead of "" to avoid getting any in-source copy
// left on disk.
#include <testSystemTools.h>
#include <iostream>
#include <sstream>
#include <string.h> /* strcmp */
#if defined(_WIN32) && !defined(__CYGWIN__)
# include <io.h> /* _umask (MSVC) / umask (Borland) */
# ifdef _MSC_VER
# define umask _umask // Note this is still umask on Borland
# endif
#endif
#include <sys/stat.h> /* umask (POSIX), _S_I* constants (Windows) */
// Visual C++ does not define mode_t (note that Borland does, however).
typedef unsigned short mode_t;
#endif
static const char* toUnixPaths[][2] = {
{ "/usr/local/bin/passwd", "/usr/local/bin/passwd" },
{ "/usr/lo cal/bin/pa sswd", "/usr/lo cal/bin/pa sswd" },
{ "/usr/lo\\ cal/bin/pa\\ sswd", "/usr/lo/ cal/bin/pa/ sswd" },
{ "c:/usr/local/bin/passwd", "c:/usr/local/bin/passwd" },
{ "c:/usr/lo cal/bin/pa sswd", "c:/usr/lo cal/bin/pa sswd" },
{ "c:/usr/lo\\ cal/bin/pa\\ sswd", "c:/usr/lo/ cal/bin/pa/ sswd" },
{ "\\usr\\local\\bin\\passwd", "/usr/local/bin/passwd" },
{ "\\usr\\lo cal\\bin\\pa sswd", "/usr/lo cal/bin/pa sswd" },
{ "\\usr\\lo\\ cal\\bin\\pa\\ sswd", "/usr/lo/ cal/bin/pa/ sswd" },
{ "c:\\usr\\local\\bin\\passwd", "c:/usr/local/bin/passwd" },
{ "c:\\usr\\lo cal\\bin\\pa sswd", "c:/usr/lo cal/bin/pa sswd" },
{ "c:\\usr\\lo\\ cal\\bin\\pa\\ sswd", "c:/usr/lo/ cal/bin/pa/ sswd" },
{ "\\\\usr\\local\\bin\\passwd", "//usr/local/bin/passwd" },
{ "\\\\usr\\lo cal\\bin\\pa sswd", "//usr/lo cal/bin/pa sswd" },
{ "\\\\usr\\lo\\ cal\\bin\\pa\\ sswd", "//usr/lo/ cal/bin/pa/ sswd" },
{ KWSYS_NULLPTR, KWSYS_NULLPTR }
Andy Cedilnik
committed
};
static bool CheckConvertToUnixSlashes(std::string const& input,
std::string const& output)
Andy Cedilnik
committed
{
Andy Cedilnik
committed
kwsys::SystemTools::ConvertToUnixSlashes(result);
if (result != output) {
std::cerr << "Problem with ConvertToUnixSlashes - input: " << input
<< " output: " << result << " expected: " << output << std::endl;
Andy Cedilnik
committed
return false;
Andy Cedilnik
committed
return true;
}
static const char* checkEscapeChars[][4] = {
{ "1 foo 2 bar 2", "12", "\\", "\\1 foo \\2 bar \\2" },
{ " {} ", "{}", "#", " #{#} " },
{ KWSYS_NULLPTR, KWSYS_NULLPTR, KWSYS_NULLPTR, KWSYS_NULLPTR }
};
Sebastien Barre
committed
static bool CheckEscapeChars(std::string const& input,
const char* chars_to_escape, char escape_char,
std::string const& output)
Sebastien Barre
committed
{
std::string result = kwsys::SystemTools::EscapeChars(
Sebastien Barre
committed
input.c_str(), chars_to_escape, escape_char);
if (result != output) {
std::cerr << "Problem with CheckEscapeChars - input: " << input
<< " output: " << result << " expected: " << output << std::endl;
Sebastien Barre
committed
return false;
Sebastien Barre
committed
return true;
}
const std::string testNonExistingFile(TEST_SYSTEMTOOLS_SOURCE_DIR
"/testSystemToolsNonExistingFile");
const std::string testDotFile(TEST_SYSTEMTOOLS_SOURCE_DIR "/.");
const std::string testBinFile(TEST_SYSTEMTOOLS_SOURCE_DIR
const std::string testTxtFile(TEST_SYSTEMTOOLS_SOURCE_DIR
const std::string testNewDir(TEST_SYSTEMTOOLS_BINARY_DIR
const std::string testNewFile(testNewDir + "/testNewFile.txt");
if (kwsys::SystemTools::DetectFileType(testNonExistingFile.c_str()) !=
kwsys::SystemTools::FileTypeUnknown) {
std::cerr << "Problem with DetectFileType - failed to detect type of: "
<< testNonExistingFile << std::endl;
res = false;
if (kwsys::SystemTools::DetectFileType(testDotFile.c_str()) !=
kwsys::SystemTools::FileTypeUnknown) {
std::cerr << "Problem with DetectFileType - failed to detect type of: "
<< testDotFile << std::endl;
res = false;
if (kwsys::SystemTools::DetectFileType(testBinFile.c_str()) !=
kwsys::SystemTools::FileTypeBinary) {
std::cerr << "Problem with DetectFileType - failed to detect type of: "
<< testBinFile << std::endl;
if (kwsys::SystemTools::DetectFileType(testTxtFile.c_str()) !=
kwsys::SystemTools::FileTypeText) {
std::cerr << "Problem with DetectFileType - failed to detect type of: "
<< testTxtFile << std::endl;
if (kwsys::SystemTools::FileLength(testBinFile) != 766) {
std::cerr << "Problem with FileLength - incorrect length for: "
<< testBinFile << std::endl;
kwsys::SystemTools::Stat_t buf;
if (kwsys::SystemTools::Stat(testTxtFile.c_str(), &buf) != 0) {
std::cerr << "Problem with Stat - unable to stat text file: "
<< testTxtFile << std::endl;
res = false;
}
if (kwsys::SystemTools::Stat(testBinFile, &buf) != 0) {
std::cerr << "Problem with Stat - unable to stat bin file: " << testBinFile
<< std::endl;
res = false;
}
if (!kwsys::SystemTools::MakeDirectory(testNewDir)) {
std::cerr << "Problem with MakeDirectory for: " << testNewDir << std::endl;
// calling it again should just return true
if (!kwsys::SystemTools::MakeDirectory(testNewDir)) {
std::cerr << "Problem with second call to MakeDirectory for: "
<< testNewDir << std::endl;
res = false;
// calling with 0 pointer should return false
if (kwsys::SystemTools::MakeDirectory(KWSYS_NULLPTR)) {
std::cerr << "Problem with MakeDirectory(0)" << std::endl;
res = false;
// calling with an empty string should return false
if (kwsys::SystemTools::MakeDirectory(std::string())) {
std::cerr << "Problem with MakeDirectory(std::string())" << std::endl;
res = false;
// check existence
if (!kwsys::SystemTools::FileExists(testNewDir.c_str(), false)) {
std::cerr << "Problem with FileExists as C string and not file for: "
<< testNewDir << std::endl;
if (!kwsys::SystemTools::PathExists(testNewDir)) {
std::cerr << "Problem with PathExists for: " << testNewDir << std::endl;
// remove it
if (!kwsys::SystemTools::RemoveADirectory(testNewDir)) {
std::cerr << "Problem with RemoveADirectory for: " << testNewDir
<< std::endl;
res = false;
// check existence
if (kwsys::SystemTools::FileExists(testNewDir.c_str(), false)) {
std::cerr << "After RemoveADirectory: "
<< "Problem with FileExists as C string and not file for: "
<< testNewDir << std::endl;
if (kwsys::SystemTools::PathExists(testNewDir)) {
std::cerr << "After RemoveADirectory: "
<< "Problem with PathExists for: " << testNewDir << std::endl;
// create it using the char* version
if (!kwsys::SystemTools::MakeDirectory(testNewDir.c_str())) {
std::cerr << "Problem with second call to MakeDirectory as C string for: "
<< testNewDir << std::endl;
res = false;
if (!kwsys::SystemTools::Touch(testNewFile.c_str(), true)) {
std::cerr << "Problem with Touch for: " << testNewFile << std::endl;
res = false;
// calling MakeDirectory with something that is no file should fail
if (kwsys::SystemTools::MakeDirectory(testNewFile)) {
std::cerr << "Problem with to MakeDirectory for: " << testNewFile
<< std::endl;
// calling with 0 pointer should return false
if (kwsys::SystemTools::FileExists(KWSYS_NULLPTR)) {
std::cerr << "Problem with FileExists(0)" << std::endl;
if (kwsys::SystemTools::FileExists(KWSYS_NULLPTR, true)) {
std::cerr << "Problem with FileExists(0) as file" << std::endl;
// calling with an empty string should return false
if (kwsys::SystemTools::FileExists(std::string())) {
std::cerr << "Problem with FileExists(std::string())" << std::endl;
// FileExists(x, true) should return false on a directory
if (kwsys::SystemTools::FileExists(testNewDir, true)) {
std::cerr << "Problem with FileExists as file for: " << testNewDir
<< std::endl;
}
if (kwsys::SystemTools::FileExists(testNewDir.c_str(), true)) {
std::cerr << "Problem with FileExists as C string and file for: "
<< testNewDir << std::endl;
// FileExists(x, false) should return true even on a directory
if (!kwsys::SystemTools::FileExists(testNewDir, false)) {
std::cerr << "Problem with FileExists as not file for: " << testNewDir
<< std::endl;
}
if (!kwsys::SystemTools::FileExists(testNewDir.c_str(), false)) {
std::cerr << "Problem with FileExists as C string and not file for: "
<< testNewDir << std::endl;
// should work, was created as new file before
if (!kwsys::SystemTools::FileExists(testNewFile)) {
std::cerr << "Problem with FileExists for: " << testNewFile << std::endl;
}
if (!kwsys::SystemTools::FileExists(testNewFile.c_str())) {
std::cerr << "Problem with FileExists as C string for: " << testNewFile
}
if (!kwsys::SystemTools::FileExists(testNewFile, true)) {
std::cerr << "Problem with FileExists as file for: " << testNewFile
}
if (!kwsys::SystemTools::FileExists(testNewFile.c_str(), true)) {
std::cerr << "Problem with FileExists as C string and file for: "
<< testNewFile << std::endl;
// calling with an empty string should return false
if (kwsys::SystemTools::PathExists(std::string())) {
std::cerr << "Problem with PathExists(std::string())" << std::endl;
// PathExists(x) should return true on a directory
if (!kwsys::SystemTools::PathExists(testNewDir)) {
std::cerr << "Problem with PathExists for: " << testNewDir << std::endl;
// should work, was created as new file before
if (!kwsys::SystemTools::PathExists(testNewFile)) {
std::cerr << "Problem with PathExists for: " << testNewFile << std::endl;
#if defined(_WIN32) && !defined(__CYGWIN__)
// NOTE: Windows doesn't support toggling _S_IREAD.
mode_t fullMask = _S_IWRITE;
#else
// On a normal POSIX platform, we can toggle all permissions.
mode_t fullMask = S_IRWXU | S_IRWXG | S_IRWXO;
#endif
mode_t orig_umask = umask(fullMask);
// Test file permissions without umask
mode_t origPerm, thisPerm;
if (!kwsys::SystemTools::GetPermissions(testNewFile, origPerm)) {
std::cerr << "Problem with GetPermissions (1) for: " << testNewFile
<< std::endl;
if (!kwsys::SystemTools::SetPermissions(testNewFile, 0)) {
std::cerr << "Problem with SetPermissions (1) for: " << testNewFile
<< std::endl;
if (!kwsys::SystemTools::GetPermissions(testNewFile, thisPerm)) {
std::cerr << "Problem with GetPermissions (2) for: " << testNewFile
<< std::endl;
if ((thisPerm & fullMask) != 0) {
std::cerr << "SetPermissions failed to set permissions (1) for: "
<< testNewFile << ": actual = " << thisPerm
<< "; expected = " << 0 << std::endl;
// While we're at it, check proper TestFileAccess functionality.
if (kwsys::SystemTools::TestFileAccess(testNewFile,
<< "TestFileAccess incorrectly indicated that this is a writable file:"
<< testNewFile << std::endl;
if (!kwsys::SystemTools::TestFileAccess(testNewFile, kwsys::TEST_FILE_OK)) {
<< "TestFileAccess incorrectly indicated that this file does not exist:"
<< testNewFile << std::endl;
// Test restoring/setting full permissions.
if (!kwsys::SystemTools::SetPermissions(testNewFile, fullMask)) {
std::cerr << "Problem with SetPermissions (2) for: " << testNewFile
<< std::endl;
if (!kwsys::SystemTools::GetPermissions(testNewFile, thisPerm)) {
std::cerr << "Problem with GetPermissions (3) for: " << testNewFile
<< std::endl;
if ((thisPerm & fullMask) != fullMask) {
std::cerr << "SetPermissions failed to set permissions (2) for: "
<< testNewFile << ": actual = " << thisPerm
<< "; expected = " << fullMask << std::endl;
// Test setting file permissions while honoring umask
if (!kwsys::SystemTools::SetPermissions(testNewFile, fullMask, true)) {
std::cerr << "Problem with SetPermissions (3) for: " << testNewFile
<< std::endl;
if (!kwsys::SystemTools::GetPermissions(testNewFile, thisPerm)) {
std::cerr << "Problem with GetPermissions (4) for: " << testNewFile
<< std::endl;
if ((thisPerm & fullMask) != 0) {
std::cerr << "SetPermissions failed to honor umask for: " << testNewFile
<< ": actual = " << thisPerm << "; expected = " << 0
<< std::endl;
// Restore umask
umask(orig_umask);
// Restore file permissions
if (!kwsys::SystemTools::SetPermissions(testNewFile, origPerm)) {
std::cerr << "Problem with SetPermissions (4) for: " << testNewFile
<< std::endl;
// Remove the test file
if (!kwsys::SystemTools::RemoveFile(testNewFile)) {
std::cerr << "Problem with RemoveFile: " << testNewFile << std::endl;
std::string const testFileMissing(testNewDir + "/testMissingFile.txt");
if (!kwsys::SystemTools::RemoveFile(testFileMissing)) {
std::string const& msg = kwsys::SystemTools::GetLastSystemError();
std::cerr << "RemoveFile(\"" << testFileMissing << "\") failed: " << msg
<< "\n";
std::string const testFileMissingDir(testNewDir + "/missing/file.txt");
if (!kwsys::SystemTools::RemoveFile(testFileMissingDir)) {
std::string const& msg = kwsys::SystemTools::GetLastSystemError();
std::cerr << "RemoveFile(\"" << testFileMissingDir << "\") failed: " << msg
<< "\n";
kwsys::SystemTools::Touch(testNewFile.c_str(), true);
if (!kwsys::SystemTools::RemoveADirectory(testNewDir)) {
std::cerr << "Problem with RemoveADirectory for: " << testNewDir
<< std::endl;
#ifdef KWSYS_TEST_SYSTEMTOOLS_LONG_PATHS
// Perform the same file and directory creation and deletion tests but
// with paths > 256 characters in length.
TEST_SYSTEMTOOLS_BINARY_DIR
"/"
"012345678901234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567890123456789"
"01234567890123");
const std::string testNewLongFile(
testNewLongDir +
"/"
"012345678901234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567890123456789"
"0123456789.txt");
if (!kwsys::SystemTools::MakeDirectory(testNewLongDir)) {
std::cerr << "Problem with MakeDirectory for: " << testNewLongDir
<< std::endl;
if (!kwsys::SystemTools::Touch(testNewLongFile.c_str(), true)) {
std::cerr << "Problem with Touch for: " << testNewLongFile << std::endl;
if (!kwsys::SystemTools::RemoveFile(testNewLongFile)) {
std::cerr << "Problem with RemoveFile: " << testNewLongFile << std::endl;
kwsys::SystemTools::Touch(testNewLongFile.c_str(), true);
if (!kwsys::SystemTools::RemoveADirectory(testNewLongDir)) {
std::cerr << "Problem with RemoveADirectory for: " << testNewLongDir
<< std::endl;
{
bool res = true;
std::string test = "mary had a little lamb.";
if (kwsys::SystemTools::CapitalizedWords(test) !=
"Mary Had A Little Lamb.") {
std::cerr << "Problem with CapitalizedWords " << '"' << test << '"'
<< std::endl;
test = "Mary Had A Little Lamb.";
if (kwsys::SystemTools::UnCapitalizedWords(test) !=
"mary had a little lamb.") {
std::cerr << "Problem with UnCapitalizedWords " << '"' << test << '"'
<< std::endl;
test = "MaryHadTheLittleLamb.";
if (kwsys::SystemTools::AddSpaceBetweenCapitalizedWords(test) !=
"Mary Had The Little Lamb.") {
std::cerr << "Problem with AddSpaceBetweenCapitalizedWords " << '"' << test
<< '"' << std::endl;
char* cres =
kwsys::SystemTools::AppendStrings("Mary Had A", " Little Lamb.");
if (strcmp(cres, "Mary Had A Little Lamb.")) {
std::cerr << "Problem with AppendStrings "
<< "\"Mary Had A\" \" Little Lamb.\"" << std::endl;
cres = kwsys::SystemTools::AppendStrings("Mary Had", " A ", "Little Lamb.");
if (strcmp(cres, "Mary Had A Little Lamb.")) {
std::cerr << "Problem with AppendStrings "
<< "\"Mary Had\" \" A \" \"Little Lamb.\"" << std::endl;
if (kwsys::SystemTools::CountChar("Mary Had A Little Lamb.", 'a') != 3) {
std::cerr << "Problem with CountChar "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
cres = kwsys::SystemTools::RemoveChars("Mary Had A Little Lamb.", "aeiou");
if (strcmp(cres, "Mry Hd A Lttl Lmb.")) {
std::cerr << "Problem with RemoveChars "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
cres = kwsys::SystemTools::RemoveCharsButUpperHex("Mary Had A Little Lamb.");
if (strcmp(cres, "A")) {
std::cerr << "Problem with RemoveCharsButUpperHex "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
char* cres2 = strdup("Mary Had A Little Lamb.");
kwsys::SystemTools::ReplaceChars(cres2, "aeiou", 'X');
if (strcmp(cres2, "MXry HXd A LXttlX LXmb.")) {
std::cerr << "Problem with ReplaceChars "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
if (!kwsys::SystemTools::StringStartsWith("Mary Had A Little Lamb.",
"Mary ")) {
std::cerr << "Problem with StringStartsWith "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
if (!kwsys::SystemTools::StringEndsWith("Mary Had A Little Lamb.",
" Lamb.")) {
std::cerr << "Problem with StringEndsWith "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
cres = kwsys::SystemTools::DuplicateString("Mary Had A Little Lamb.");
if (strcmp(cres, "Mary Had A Little Lamb.")) {
std::cerr << "Problem with DuplicateString "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
test = "Mary Had A Little Lamb.";
if (kwsys::SystemTools::CropString(test, 13) != "Mary ...Lamb.") {
std::cerr << "Problem with CropString "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
kwsys::SystemTools::Split("Mary Had A Little Lamb.", lines, ' ');
if (lines[0] != "Mary" || lines[1] != "Had" || lines[2] != "A" ||
lines[3] != "Little" || lines[4] != "Lamb.") {
std::cerr << "Problem with Split "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
if (kwsys::SystemTools::ConvertToWindowsOutputPath(
"L://Local Mojo/Hex Power Pack/Iffy Voodoo") !=
"\"L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo\"") {
std::cerr << "Problem with ConvertToWindowsOutputPath "
<< "\"L://Local Mojo/Hex Power Pack/Iffy Voodoo\"" << std::endl;
if (kwsys::SystemTools::ConvertToWindowsOutputPath(
"//grayson/Local Mojo/Hex Power Pack/Iffy Voodoo") !=
"\"\\\\grayson\\Local Mojo\\Hex Power Pack\\Iffy Voodoo\"") {
std::cerr << "Problem with ConvertToWindowsOutputPath "
<< "\"//grayson/Local Mojo/Hex Power Pack/Iffy Voodoo\""
<< std::endl;
if (kwsys::SystemTools::ConvertToUnixOutputPath(
"//Local Mojo/Hex Power Pack/Iffy Voodoo") !=
"//Local\\ Mojo/Hex\\ Power\\ Pack/Iffy\\ Voodoo") {
std::cerr << "Problem with ConvertToUnixOutputPath "
<< "\"//Local Mojo/Hex Power Pack/Iffy Voodoo\"" << std::endl;
static bool CheckPutEnv(const std::string& env, const char* name,
const char* value)
if (!kwsys::SystemTools::PutEnv(env)) {
std::cerr << "PutEnv(\"" << env << "\") failed!" << std::endl;
std::string v = "(null)";
kwsys::SystemTools::GetEnv(name, v);
if (v != value) {
std::cerr << "GetEnv(\"" << name << "\") returned \"" << v << "\", not \""
<< value << "\"!" << std::endl;
return true;
}
static bool CheckUnPutEnv(const char* env, const char* name)
if (!kwsys::SystemTools::UnPutEnv(env)) {
std::cerr << "UnPutEnv(\"" << env << "\") failed!" << std::endl;
if (kwsys::SystemTools::GetEnv(name, v)) {
std::cerr << "GetEnv(\"" << name << "\") returned \"" << v
<< "\", not (null)!" << std::endl;
return true;
}
{
bool res = true;
res &= CheckPutEnv("A=B", "A", "B");
res &= CheckPutEnv("B=C", "B", "C");
res &= CheckPutEnv("C=D", "C", "D");
res &= CheckPutEnv("D=E", "D", "E");
res &= CheckUnPutEnv("A", "A");
res &= CheckUnPutEnv("B=", "B");
res &= CheckUnPutEnv("C=D", "C");
/* Leave "D=E" in environment so a memory checker can test for leaks. */
return res;
}
static bool CheckRelativePath(const std::string& local,
const std::string& remote,
const std::string& expected)
std::string result = kwsys::SystemTools::RelativePath(local, remote);
if (!kwsys::SystemTools::ComparePath(expected, result)) {
std::cerr << "RelativePath(" << local << ", " << remote << ") yielded "
<< result << " instead of " << expected << std::endl;
return false;
return true;
}
static bool CheckRelativePaths()
{
bool res = true;
res &= CheckRelativePath("/usr/share", "/bin/bash", "../../bin/bash");
res &= CheckRelativePath("/usr/./share/", "/bin/bash", "../../bin/bash");
res &= CheckRelativePath("/usr//share/", "/bin/bash", "../../bin/bash");
res &=
CheckRelativePath("/usr/share/../bin/", "/bin/bash", "../../bin/bash");
res &= CheckRelativePath("/usr/share", "/usr/share//bin", "bin");
return res;
}
static bool CheckCollapsePath(const std::string& path,
const std::string& expected)
std::string result = kwsys::SystemTools::CollapseFullPath(path);
if (!kwsys::SystemTools::ComparePath(expected, result)) {
std::cerr << "CollapseFullPath(" << path << ") yielded " << result
<< " instead of " << expected << std::endl;
return false;
return true;
}
static bool CheckCollapsePath()
{
bool res = true;
res &= CheckCollapsePath("/usr/share/*", "/usr/share/*");
res &= CheckCollapsePath("C:/Windows/*", "C:/Windows/*");
res &= CheckCollapsePath("/usr/share/../lib", "/usr/lib");
res &= CheckCollapsePath("/usr/share/./lib", "/usr/share/lib");
res &= CheckCollapsePath("/usr/share/../../lib", "/lib");
res &= CheckCollapsePath("/usr/share/.././../lib", "/lib");
res &= CheckCollapsePath("/../lib", "/lib");
res &= CheckCollapsePath("/../lib/", "/lib");
res &= CheckCollapsePath("/", "/");
res &= CheckCollapsePath("C:/", "C:/");
res &= CheckCollapsePath("C:/../", "C:/");
res &= CheckCollapsePath("C:/../../", "C:/");
return res;
}
static std::string StringVectorToString(const std::vector<std::string>& vec)
{
std::stringstream ss;
ss << "vector(";
for (std::vector<std::string>::const_iterator i = vec.begin();
i != vec.end(); ++i) {
if (i != vec.begin()) {
ss << ", ";
}
ss << ")";
return ss.str();
}
static bool CheckGetPath()
{
const char* envName = "S";
#ifdef _WIN32
const char* envValue = "C:\\Somewhere\\something;D:\\Temp";
#else
const char* envValue = "/Somewhere/something:/tmp";
#endif
const char* registryPath = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MyApp; MyKey]";
std::vector<std::string> originalPaths;
originalPaths.push_back(registryPath);
std::vector<std::string> expectedPaths;
expectedPaths.push_back(registryPath);
#ifdef _WIN32
expectedPaths.push_back("C:/Somewhere/something");
expectedPaths.push_back("D:/Temp");
#else
expectedPaths.push_back("/Somewhere/something");
expectedPaths.push_back("/tmp");
#endif
bool res = true;
res &= CheckPutEnv(std::string(envName) + "=" + envValue, envName, envValue);
std::vector<std::string> paths = originalPaths;
kwsys::SystemTools::GetPath(paths, envName);
if (paths != expectedPaths) {
std::cerr << "GetPath(" << StringVectorToString(originalPaths) << ", "
<< envName << ") yielded " << StringVectorToString(paths)
<< " instead of " << StringVectorToString(expectedPaths)
res = false;
res &= CheckUnPutEnv(envName, envName);
return res;
}
static bool CheckGetFilenameName()
{
const char* windowsFilepath = "C:\\somewhere\\something";
const char* unixFilepath = "/somewhere/something";
#if defined(_WIN32) || defined(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
std::string expectedWindowsFilename = "something";
#else
std::string expectedWindowsFilename = "C:\\somewhere\\something";
#endif
std::string expectedUnixFilename = "something";
bool res = true;
std::string filename = kwsys::SystemTools::GetFilenameName(windowsFilepath);
if (filename != expectedWindowsFilename) {
std::cerr << "GetFilenameName(" << windowsFilepath << ") yielded "
<< filename << " instead of " << expectedWindowsFilename
<< std::endl;
res = false;
}
filename = kwsys::SystemTools::GetFilenameName(unixFilepath);
if (filename != expectedUnixFilename) {
std::cerr << "GetFilenameName(" << unixFilepath << ") yielded " << filename
<< " instead of " << expectedUnixFilename << std::endl;
res = false;
}
return res;
}
static bool CheckFind()
{
bool res = true;
const std::string testFindFileName("testFindFile.txt");
const std::string testFindFile(TEST_SYSTEMTOOLS_BINARY_DIR "/" +
testFindFileName);
if (!kwsys::SystemTools::Touch(testFindFile.c_str(), true)) {
std::cerr << "Problem with Touch for: " << testFindFile << std::endl;
// abort here as the existence of the file only makes the test meaningful
return false;
std::vector<std::string> searchPaths;
searchPaths.push_back(TEST_SYSTEMTOOLS_BINARY_DIR);
if (kwsys::SystemTools::FindFile(testFindFileName, searchPaths, true)
.empty()) {
std::cerr << "Problem with FindFile without system paths for: "
<< testFindFileName << std::endl;
}
if (kwsys::SystemTools::FindFile(testFindFileName, searchPaths, false)
.empty()) {
std::cerr << "Problem with FindFile with system paths for: "
<< testFindFileName << std::endl;
return res;
}
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
static bool CheckIsSubDirectory()
{
bool res = true;
if (kwsys::SystemTools::IsSubDirectory("/foo", "/") == false) {
std::cerr << "Problem with IsSubDirectory (root - unix): " << std::endl;
res = false;
}
if (kwsys::SystemTools::IsSubDirectory("c:/foo", "c:/") == false) {
std::cerr << "Problem with IsSubDirectory (root - dos): " << std::endl;
res = false;
}
if (kwsys::SystemTools::IsSubDirectory("/foo/bar", "/foo") == false) {
std::cerr << "Problem with IsSubDirectory (deep): " << std::endl;
res = false;
}
if (kwsys::SystemTools::IsSubDirectory("/foo", "/foo") == true) {
std::cerr << "Problem with IsSubDirectory (identity): " << std::endl;
res = false;
}
if (kwsys::SystemTools::IsSubDirectory("/fooo", "/foo") == true) {
std::cerr << "Problem with IsSubDirectory (substring): " << std::endl;
res = false;
}
if (kwsys::SystemTools::IsSubDirectory("/foo/", "/foo") == true) {
std::cerr << "Problem with IsSubDirectory (prepended slash): "
<< std::endl;
res = false;
}
return res;
}
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
static bool CheckGetLineFromStream()
{
const std::string fileWithFiveCharsOnFirstLine(TEST_SYSTEMTOOLS_SOURCE_DIR
"/README.rst");
kwsys::ifstream file(fileWithFiveCharsOnFirstLine.c_str(), std::ios::in);
if (!file) {
std::cerr << "Problem opening: " << fileWithFiveCharsOnFirstLine
<< std::endl;
return false;
}
std::string line;
bool has_newline = false;
bool result;
file.seekg(0, std::ios::beg);
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || line.size() != 5) {
std::cerr << "First line does not have five characters: " << line.size()
<< std::endl;
return false;
}
file.seekg(0, std::ios::beg);
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || line.size() != 5) {
std::cerr << "First line does not have five characters after rewind: "
<< line.size() << std::endl;
return false;
}
bool ret = true;
for (size_t size = 1; size <= 5; ++size) {
file.seekg(0, std::ios::beg);
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline,
static_cast<long>(size));
if (!result || line.size() != size) {
std::cerr << "Should have read " << size << " characters but got "
<< line.size() << std::endl;
ret = false;
}
}
return ret;
}
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
static bool CheckGetLineFromStreamLongLine()
{
const std::string fileWithLongLine("longlines.txt");
std::string firstLine, secondLine;
// First line: large buffer, containing a carriage return for some reason.
firstLine.assign(2050, ' ');
firstLine += "\rfirst";
secondLine.assign(2050, 'y');
secondLine += "second";
// Create file with long lines.
{
kwsys::ofstream out(fileWithLongLine.c_str(), std::ios::binary);
if (!out) {
std::cerr << "Problem opening for write: " << fileWithLongLine
<< std::endl;
return false;
}
out << firstLine << "\r\n\n" << secondLine << "\n";
}
kwsys::ifstream file(fileWithLongLine.c_str(), std::ios::binary);
if (!file) {
std::cerr << "Problem opening: " << fileWithLongLine << std::endl;
return false;
}
std::string line;
bool has_newline = false;
bool result;
// Read first line.
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || line != firstLine) {
std::cerr << "First line does not match, expected " << firstLine.size()
<< " characters, got " << line.size() << std::endl;
return false;
}
if (!has_newline) {
std::cerr << "Expected new line to be read from first line" << std::endl;
return false;
}
// Read empty line.
has_newline = false;
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || !line.empty()) {
std::cerr << "Expected successful read with an empty line, got "
<< line.size() << " characters" << std::endl;
return false;
}
if (!has_newline) {
std::cerr << "Expected new line to be read for an empty line" << std::endl;
return false;
}
// Read second line.
has_newline = false;
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || line != secondLine) {
std::cerr << "Second line does not match, expected " << secondLine.size()
<< " characters, got " << line.size() << std::endl;
return false;
}
if (!has_newline) {
std::cerr << "Expected new line to be read from second line" << std::endl;
return false;
}
return true;
}
int testSystemTools(int, char* [])
Andy Cedilnik
committed
{
Sebastien Barre
committed
bool res = true;
Andy Cedilnik
committed
int cc;
for (cc = 0; toUnixPaths[cc][0]; cc++) {
Sebastien Barre
committed
res &= CheckConvertToUnixSlashes(toUnixPaths[cc][0], toUnixPaths[cc][1]);
if (kwsys::SystemTools::GetEnv("HOME", output)) {
Andy Cedilnik
committed
output += "/foo bar/lala";
Sebastien Barre
committed
res &= CheckConvertToUnixSlashes("~/foo bar/lala", output);