blob: 9ad11b70cc8dca25a1dc1639c325fc1a4f9b21ab [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TESTS_CONFIGURATION_H_
#define TESTS_CONFIGURATION_H_
#include "hdfspp/config_parser.h"
#include "common/configuration.h"
#include "common/configuration_loader.h"
#include <cstdio>
#include <fstream>
#include <istream>
#include <ftw.h>
#include <gmock/gmock.h>
namespace hdfs {
template <typename T, typename U>
void simpleConfigStreamProperty(std::stringstream& out, T key, U value) {
out << "<property>"
<< "<name>" << key << "</name>"
<< "<value>" << value << "</value>"
<< "</property>";
}
template <typename T, typename U, typename... Args>
void simpleConfigStreamProperty(std::stringstream& out, T key, U value,
Args... args) {
simpleConfigStreamProperty(out, key, value);
simpleConfigStreamProperty(out, args...);
}
template <typename... Args>
void simpleConfigStream(std::stringstream& out, Args... args) {
out << "<configuration>";
simpleConfigStreamProperty(out, args...);
out << "</configuration>";
}
template <typename T, typename U>
void damagedConfigStreamProperty(std::stringstream& out, T key, U value) {
out << "<propertyy>"
<< "<name>" << key << "</name>"
<< "<value>" << value << "</value>"
<< "</property>";
}
template <typename T, typename U, typename... Args>
void damagedConfigStreamProperty(std::stringstream& out, T key, U value,
Args... args) {
damagedConfigStreamProperty(out, key, value);
damagedConfigStreamProperty(out, args...);
}
template <typename... Args>
void damagedConfigStream(std::stringstream& out, Args... args) {
out << "<configuration>";
damagedConfigStreamProperty(out, args...);
out << "</configuration>";
}
template <typename... Args>
optional<Configuration> simpleConfig(Args... args) {
std::stringstream stream;
simpleConfigStream(stream, args...);
ConfigurationLoader config_loader;
config_loader.ClearSearchPath();
optional<Configuration> parse = config_loader.Load<Configuration>(stream.str());
EXPECT_TRUE((bool)parse);
return parse;
}
template <typename... Args>
void writeSimpleConfig(const std::string& filename, Args... args) {
std::stringstream stream;
simpleConfigStream(stream, args...);
std::ofstream out;
out.open(filename);
out << stream.rdbuf();
}
template <typename... Args>
void writeDamagedConfig(const std::string& filename, Args... args) {
std::stringstream stream;
damagedConfigStream(stream, args...);
std::ofstream out;
out.open(filename);
out << stream.rdbuf();
}
// TempDir: is deleted on destruction
class TempFile {
public:
std::string filename;
char fn_buffer[128];
int tempFileHandle;
TempFile() : tempFileHandle(-1) {
strncpy(fn_buffer, "/tmp/test_XXXXXXXXXX", sizeof(fn_buffer));
tempFileHandle = mkstemp(fn_buffer);
EXPECT_NE(-1, tempFileHandle);
filename = fn_buffer;
}
TempFile(const std::string & fn) : filename(fn), tempFileHandle(-1) {
strncpy(fn_buffer, fn.c_str(), sizeof(fn_buffer));
fn_buffer[sizeof(fn_buffer)-1] = 0;
}
~TempFile() { if(-1 != tempFileHandle) close(tempFileHandle); unlink(fn_buffer); }
};
// Callback to remove a directory in the nftw visitor
int nftw_remove(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf)
{
(void)sb; (void)typeflag; (void)ftwbuf;
int rv = remove(fpath);
EXPECT_EQ(0, rv);
return rv;
}
// TempDir: is created in ctor and recursively deletes in dtor
class TempDir {
public:
std::string path;
TempDir() {
char fn_buffer[128];
strncpy(fn_buffer, "/tmp/test_dir_XXXXXXXXXX", sizeof(fn_buffer));
const char * returned_path = mkdtemp(fn_buffer);
EXPECT_NE(nullptr, returned_path);
path = returned_path;
}
~TempDir() {
if(!path.empty())
nftw(path.c_str(), nftw_remove, 64, FTW_DEPTH | FTW_PHYS);
}
};
}
#endif