cmake/Source/kwsys/testDirectory.cxx

143 lines
4.4 KiB
C++
Raw Normal View History

2018-01-26 17:06:56 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
#include "kwsysPrivate.h"
#include KWSYS_HEADER(Directory.hxx)
#include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(SystemTools.hxx)
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
#if 0
2018-08-09 18:06:22 +02:00
# include "Directory.hxx.in"
# include "Encoding.hxx.in"
# include "SystemTools.hxx.in"
2018-01-26 17:06:56 +01:00
#endif
#include <fstream>
#include <iostream>
#include <sstream>
#include <testSystemTools.h>
2023-05-23 16:38:00 +02:00
static int doLongPathTest()
2018-01-26 17:06:56 +01:00
{
using namespace kwsys;
static const int LONG_PATH_THRESHOLD = 512;
int res = 0;
std::string topdir(TEST_SYSTEMTOOLS_BINARY_DIR "/directory_testing/");
std::stringstream testpathstrm;
std::string testdirpath;
std::string extendedtestdirpath;
testpathstrm << topdir;
size_t pathlen = testpathstrm.str().length();
testpathstrm.seekp(0, std::ios_base::end);
while (pathlen < LONG_PATH_THRESHOLD) {
testpathstrm << "0123456789/";
pathlen = testpathstrm.str().length();
}
testdirpath = testpathstrm.str();
#ifdef _WIN32
extendedtestdirpath =
Encoding::ToNarrow(SystemTools::ConvertToWindowsExtendedPath(testdirpath));
#else
extendedtestdirpath = testdirpath;
#endif
if (SystemTools::MakeDirectory(extendedtestdirpath)) {
std::ofstream testfile1(
(extendedtestdirpath + "longfilepathtest1.txt").c_str());
std::ofstream testfile2(
(extendedtestdirpath + "longfilepathtest2.txt").c_str());
testfile1 << "foo";
testfile2 << "bar";
testfile1.close();
testfile2.close();
Directory testdir;
// Set res to failure if the directory doesn't load
2020-08-30 11:54:41 +02:00
std::string errorMessage = "";
res += !testdir.Load(testdirpath, &errorMessage);
if (errorMessage != "") {
std::cerr << "Failed to list directory: " << errorMessage << std::endl;
}
2018-01-26 17:06:56 +01:00
// Increment res failure if the directory appears empty
res += testdir.GetNumberOfFiles() == 0;
// Increment res failures if the path has changed from
// what was provided.
res += testdirpath != testdir.GetPath();
SystemTools::RemoveADirectory(topdir);
} else {
std::cerr << "Failed to create directory with long path: "
<< extendedtestdirpath << std::endl;
res += 1;
}
return res;
}
2023-05-23 16:38:00 +02:00
static int nonExistentDirectoryTest()
2020-08-30 11:54:41 +02:00
{
using namespace kwsys;
int res = 0;
std::string testdirpath(TEST_SYSTEMTOOLS_BINARY_DIR
"/directory_testing/doesnt_exist/");
std::string errorMessage;
Directory testdir;
errorMessage = "foo";
// Increment res failure if directory lists
2021-09-14 00:13:48 +02:00
res += testdir.Load(testdirpath, &errorMessage) ? 1 : 0;
2020-08-30 11:54:41 +02:00
#if !defined(_WIN32) || defined(__CYGWIN__)
// Increment res failure if errorMessage is unmodified
res += (errorMessage == "foo");
#endif
errorMessage = "foo";
// Increment res failure if directory has files
res += (testdir.GetNumberOfFilesInDirectory(testdirpath, &errorMessage) > 0);
#if !defined(_WIN32) || defined(__CYGWIN__)
// Increment res failure if errorMessage is unmodified
res += (errorMessage == "foo");
#endif
return res;
}
2023-05-23 16:38:00 +02:00
static int copyDirectoryTest()
2018-08-09 18:06:22 +02:00
{
using namespace kwsys;
const std::string source(TEST_SYSTEMTOOLS_BINARY_DIR
"/directory_testing/copyDirectoryTestSrc");
if (SystemTools::PathExists(source)) {
std::cerr << source << " shouldn't exist before test" << std::endl;
return 1;
}
const std::string destination(TEST_SYSTEMTOOLS_BINARY_DIR
"/directory_testing/copyDirectoryTestDst");
if (SystemTools::PathExists(destination)) {
std::cerr << destination << " shouldn't exist before test" << std::endl;
return 2;
}
2021-09-14 00:13:48 +02:00
const Status copysuccess = SystemTools::CopyADirectory(source, destination);
2018-08-09 18:06:22 +02:00
const bool destinationexists = SystemTools::PathExists(destination);
2021-11-20 13:41:27 +01:00
if (copysuccess.IsSuccess()) {
2018-08-09 18:06:22 +02:00
std::cerr << "CopyADirectory should have returned false" << std::endl;
SystemTools::RemoveADirectory(destination);
return 3;
}
if (destinationexists) {
std::cerr << "CopyADirectory returned false, but destination directory"
<< " has been created" << std::endl;
SystemTools::RemoveADirectory(destination);
return 4;
}
return 0;
}
2023-05-23 16:38:00 +02:00
int testDirectory(int, char*[])
2018-01-26 17:06:56 +01:00
{
2023-05-23 16:38:00 +02:00
return doLongPathTest() + nonExistentDirectoryTest() + copyDirectoryTest();
2018-01-26 17:06:56 +01:00
}