XS-libcares
view release on metacpan or search on metacpan
c-ares-1.34.3/test/ares-test.h view on Meta::CPAN
AddrInfo ai_;
};
std::ostream &operator<<(std::ostream &os, const AddrInfoResult &result);
// Standard implementation of ares callbacks that fill out the corresponding
// structures.
void HostCallback(void *data, int status, int timeouts,
struct hostent *hostent);
void QueryCallback(void *data, ares_status_t status, size_t timeouts,
const ares_dns_record_t *dnsrec);
void SearchCallback(void *data, int status, int timeouts, unsigned char *abuf,
int alen);
void SearchCallbackDnsRec(void *data, ares_status_t status, size_t timeouts,
const ares_dns_record_t *dnsrec);
void NameInfoCallback(void *data, int status, int timeouts, char *node,
char *service);
void AddrInfoCallback(void *data, int status, int timeouts,
struct ares_addrinfo *res);
// Retrieve the name servers used by a channel.
std::string GetNameServers(ares_channel_t *channel);
// RAII class to temporarily create a directory of a given name.
class TransientDir {
public:
TransientDir(const std::string &dirname);
~TransientDir();
private:
std::string dirname_;
};
// C++ wrapper around tempnam()
std::string TempNam(const char *dir, const char *prefix);
// RAII class to temporarily create file of a given name and contents.
class TransientFile {
public:
TransientFile(const std::string &filename, const std::string &contents);
~TransientFile();
protected:
std::string filename_;
};
// RAII class for a temporary file with the given contents.
class TempFile : public TransientFile {
public:
TempFile(const std::string &contents);
const char *filename() const
{
return filename_.c_str();
}
};
#ifdef _WIN32
extern "C" {
static int setenv(const char *name, const char *value, int overwrite)
{
char *buffer;
size_t buf_size;
if (name == NULL) {
return -1;
}
if (value == NULL) {
value = ""; /* For unset */
}
if (!overwrite && getenv(name) != NULL) {
return -1;
}
buf_size = strlen(name) + strlen(value) + 1 /* = */ + 1 /* NULL */;
buffer = (char *)malloc(buf_size);
_snprintf(buffer, buf_size, "%s=%s", name, value);
_putenv(buffer);
free(buffer);
return 0;
}
static int unsetenv(const char *name)
{
return setenv(name, NULL, 1);
}
} /* extern "C" */
#endif
// RAII class for a temporary environment variable value.
class EnvValue {
public:
EnvValue(const char *name, const char *value) : name_(name), restore_(false)
{
char *original = getenv(name);
if (original) {
restore_ = true;
original_ = original;
}
setenv(name_.c_str(), value, 1);
}
~EnvValue()
{
if (restore_) {
setenv(name_.c_str(), original_.c_str(), 1);
} else {
unsetenv(name_.c_str());
}
}
private:
std::string name_;
bool restore_;
std::string original_;
};
#ifdef HAVE_CONTAINER
// Linux-specific functionality for running code in a container, implemented
// in ares-test-ns.cc
typedef std::function<int(void)> VoidToIntFn;
typedef std::vector<std::pair<std::string, std::string>> NameContentList;
class ContainerFilesystem {
public:
ContainerFilesystem(NameContentList files, const std::string &mountpt);
~ContainerFilesystem();
std::string root() const
{
return rootdir_;
}
std::string mountpt() const
{
return mountpt_;
}
private:
void EnsureDirExists(const std::string &dir);
std::string rootdir_;
std::string mountpt_;
std::list<std::string> dirs_;
std::vector<std::unique_ptr<TransientFile>> files_;
};
int RunInContainer(ContainerFilesystem *fs, const std::string &hostname,
const std::string &domainname, VoidToIntFn fn);
# define ICLASS_NAME(casename, testname) Contained##casename##_##testname
# define CONTAINED_TEST_F(casename, testname, hostname, domainname, files) \
class ICLASS_NAME(casename, testname) : public casename { \
public: \
ICLASS_NAME(casename, testname)() \
{ \
} \
static int InnerTestBody(); \
}; \
TEST_F(ICLASS_NAME(casename, testname), _) \
{ \
ContainerFilesystem chroot(files, ".."); \
VoidToIntFn fn(ICLASS_NAME(casename, testname)::InnerTestBody); \
EXPECT_EQ(0, RunInContainer(&chroot, hostname, domainname, fn)); \
} \
int ICLASS_NAME(casename, testname)::InnerTestBody()
( run in 3.112 seconds using v1.01-cache-2.11-cpan-6736b670a1e )