1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
#ifndef _TEST_SUPPORT_H_
#define _TEST_SUPPORT_H_
#include <sys/stat.h>
#include <sys/types.h>
#include <iostream>
#include <string>
#include <exception>
#include <cstdio>
#include <cerrno>
#include <cstring>
#include <utime.h>
#include "Exceptions.h"
#include "Utils.h"
namespace Test {
using namespace std;
using namespace Passenger;
/**
* Read all data from the given file descriptor until EOF.
*
* @throws SystemException
*/
string readAll(int fd);
/**
* Look for 'toFind' inside 'str', replace it with 'replaceWith' and return the result.
* Only the first occurence of 'toFind' is replaced.
*/
string replaceString(const string &str, const string &toFind, const string &replaceWith);
/**
* Look for 'toFind' inside the given file, replace it with 'replaceWith' and write
* the result back to the file. Only the first occurence of 'toFind' is replaced.
*
* @throws FileSystemException
*/
void replaceStringInFile(const char *filename, const string &toFind, const string &replaceWith);
/**
* Touch the given file: create the file if it doesn't exist, update its
* timestamp if it does. If the <tt>timestamp</tt> argument is -1, then
* the current system time will be used, otherwise the given timestamp
* will be used.
*
* @throws FileSystemException
*/
void touchFile(const char *filename, time_t timestamp = (time_t) - 1);
/**
* Class which creates a temporary directory of the given name, and deletes
* it upon destruction.
*/
class TempDir {
private:
string name;
public:
TempDir(const string &name) {
this->name = name;
if (mkdir(name.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) {
int e = errno;
string message = "Cannot create directory '";
message.append(name);
message.append("'");
throw FileSystemException(message, e, name);
}
}
~TempDir() {
removeDirTree(name);
}
};
/**
* Creates a temporary copy of the given directory. This copy is deleted
* upon object destruction.
*/
class TempDirCopy {
private:
string dir;
public:
TempDirCopy(const string &source, const string &dest) {
dir = dest;
removeDirTree(dest);
char command[1024];
snprintf(command, sizeof(command), "cp -pR \"%s\" \"%s\"",
source.c_str(), dest.c_str());
system(command);
}
~TempDirCopy() {
removeDirTree(dir);
}
};
/**
* Class which deletes the given file upon destruction.
*/
class DeleteFileEventually {
private:
string filename;
public:
DeleteFileEventually(const string &filename) {
this->filename = filename;
}
~DeleteFileEventually() {
unlink(filename.c_str());
}
};
} // namespace Test
#endif /* _TEST_SUPPORT_H_ */
|