mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-08-14 10:37:33 -07:00
RethinkDB native connector work, minor fixes.
This commit is contained in:
parent
a6203ed038
commit
4e88c80a22
219 changed files with 33295 additions and 0 deletions
231
ext/librethinkdbxx/test/testlib.h
Normal file
231
ext/librethinkdbxx/test/testlib.h
Normal file
|
@ -0,0 +1,231 @@
|
|||
#pragma once
|
||||
|
||||
#include <sstream>
|
||||
#include <cstdio>
|
||||
#include <stack>
|
||||
#include <cmath>
|
||||
#include <regex>
|
||||
|
||||
#include <rethinkdb.h>
|
||||
|
||||
namespace R = RethinkDB;
|
||||
|
||||
extern std::vector<std::pair<const char*, bool>> section;
|
||||
extern int failed;
|
||||
extern int count;
|
||||
extern std::unique_ptr<R::Connection> conn;
|
||||
extern int verbosity;
|
||||
|
||||
const char* indent();
|
||||
|
||||
void enter_section(const char* name);
|
||||
void section_cleanup();
|
||||
void exit_section();
|
||||
|
||||
#define TEST_DO(code) \
|
||||
if (verbosity > 1) fprintf(stderr, "%sTEST: %s\n", indent(), #code); \
|
||||
code
|
||||
|
||||
#define TEST_EQ(code, expected) \
|
||||
do { \
|
||||
if (verbosity > 1) fprintf(stderr, "%sTEST: %s\n", indent(), #code); \
|
||||
try { test_eq(#code, (code), (expected)); } \
|
||||
catch (const R::Error& error) { test_eq(#code, error, (expected)); } \
|
||||
} while (0)
|
||||
|
||||
struct err {
|
||||
err(const char* type_, std::string message_, R::Array&& backtrace_ = {}) :
|
||||
type(type_), message(message_), backtrace(std::move(backtrace_)) { }
|
||||
|
||||
std::string convert_type() const {
|
||||
return type;
|
||||
}
|
||||
|
||||
static std::string trim_message(std::string msg) {
|
||||
size_t i = msg.find(":\n");
|
||||
if (i != std::string::npos) {
|
||||
return msg.substr(0, i + 1);
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
std::string type;
|
||||
std::string message;
|
||||
R::Array backtrace;
|
||||
};
|
||||
|
||||
struct err_regex {
|
||||
err_regex(const char* type_, const char* message_, R::Array&& backtrace_ = {}) :
|
||||
type(type_), message(message_), backtrace(std::move(backtrace_)) { }
|
||||
std::string type;
|
||||
std::string message;
|
||||
R::Array backtrace;
|
||||
std::string regex() const {
|
||||
return type + ": " + message;
|
||||
}
|
||||
};
|
||||
|
||||
R::Object regex(const char* pattern);
|
||||
|
||||
bool match(const char* pattern, const char* string);
|
||||
|
||||
R::Object partial(R::Object&& object);
|
||||
R::Object partial(R::Array&& array);
|
||||
R::Datum uuid();
|
||||
R::Object arrlen(int n, R::Datum&& datum);
|
||||
R::Object arrlen(int n);
|
||||
R::Term new_table();
|
||||
std::string repeat(std::string&& s, int n);
|
||||
R::Term fetch(R::Cursor& cursor, int count = -1, double timeout = 1);
|
||||
R::Object bag(R::Array&& array);
|
||||
R::Object bag(R::Datum&& d);
|
||||
|
||||
struct temp_table {
|
||||
temp_table() {
|
||||
char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
char name_[15] = "temp_";
|
||||
for (unsigned int i = 5; i + 1 < sizeof name_; ++i) {
|
||||
name_[i] = chars[random() % (sizeof chars - 1)];
|
||||
}
|
||||
name_[14] = 0;
|
||||
R::table_create(name_).run(*conn);
|
||||
name = name_;
|
||||
}
|
||||
|
||||
~temp_table() {
|
||||
try {
|
||||
R::table_drop(name).run(*conn);
|
||||
} catch (const R::Error &e) {
|
||||
if(!strstr(e.message.c_str(), "does not exist")){
|
||||
printf("error dropping temp_table: %s\n", e.message.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
R::Term table() { return R::table(name); }
|
||||
std::string name;
|
||||
};
|
||||
|
||||
void clean_slate();
|
||||
|
||||
// std::string to_string(const R::Cursor&);
|
||||
std::string to_string(const R::Term&);
|
||||
std::string to_string(const R::Datum&);
|
||||
std::string to_string(const R::Error&);
|
||||
std::string to_string(const err_regex&);
|
||||
std::string to_string(const err&);
|
||||
|
||||
bool equal(const R::Datum&, const R::Datum&);
|
||||
bool equal(const R::Error&, const err_regex&);
|
||||
bool equal(const R::Error&, const err&);
|
||||
|
||||
template <class T>
|
||||
bool equal(const T& a, const err& b) {
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
bool equal(const T& a, const err_regex& b) {
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
bool equal(const R::Error& a, const T& b) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string truncate(std::string&&);
|
||||
|
||||
template <class T, class U>
|
||||
void test_eq(const char* code, const T val, const U expected) {
|
||||
|
||||
try {
|
||||
count ++;
|
||||
if (!equal(val, expected)) {
|
||||
failed++;
|
||||
for (auto& it : section) {
|
||||
if (it.second) {
|
||||
printf("%sSection: %s\n", indent(), it.first);
|
||||
it.second = false;
|
||||
}
|
||||
}
|
||||
try {
|
||||
printf("%sFAILURE in ‘%s’:\n%s Expected: ‘%s’\n%s but got: ‘%s’\n",
|
||||
indent(), code,
|
||||
indent(), truncate(to_string(expected)).c_str(),
|
||||
indent(), truncate(to_string(val)).c_str());
|
||||
} catch (const R::Error& e) {
|
||||
printf("%sFAILURE: Failed to print failure description: %s\n", indent(), e.message.c_str());
|
||||
} catch (...) {
|
||||
printf("%sFAILURE: Failed to print failure description\n", indent());
|
||||
}
|
||||
}
|
||||
} catch (const std::regex_error& rx_err) {
|
||||
printf("%sSKIP: error with regex (likely a buggy regex implementation): %s\n", indent(), rx_err.what());
|
||||
}
|
||||
}
|
||||
|
||||
template <class U>
|
||||
void test_eq(const char* code, const R::Cursor& val, const U expected) {
|
||||
try {
|
||||
R::Datum result = val.to_datum();
|
||||
test_eq(code, result, expected);
|
||||
} catch (R::Error& error) {
|
||||
test_eq(code, error, expected);
|
||||
}
|
||||
}
|
||||
|
||||
int len(const R::Datum&);
|
||||
|
||||
R::Term wait(int n);
|
||||
|
||||
#define PacificTimeZone() (-7 * 3600)
|
||||
#define UTCTimeZone() (0)
|
||||
|
||||
extern R::Datum nil;
|
||||
|
||||
inline R::Cursor maybe_run(R::Cursor& c, R::Connection&, R::OptArgs&& o = {}) {
|
||||
return std::move(c);
|
||||
}
|
||||
|
||||
inline R::Cursor maybe_run(R::Term q, R::Connection& c, R::OptArgs&& o = {}) {
|
||||
return q.run(c, std::move(o));
|
||||
}
|
||||
|
||||
inline int operator+(R::Datum a, int b) {
|
||||
return a.extract_number() + b;
|
||||
}
|
||||
|
||||
inline R::Array operator*(R::Array arr, int n) {
|
||||
R::Array ret;
|
||||
for(int i = 0; i < n; i++) {
|
||||
for(const auto& it: arr) {
|
||||
ret.push_back(it);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline R::Array array_range(int x, int y) {
|
||||
R::Array ret;
|
||||
for(int i = x; i < y; ++i) {
|
||||
ret.push_back(i);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <class F>
|
||||
inline R::Array array_map(F f, R::Array a){
|
||||
R::Array ret;
|
||||
for(R::Datum& d: a) {
|
||||
ret.push_back(f(d.extract_number()));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
R::Array append(R::Array lhs, R::Array rhs);
|
||||
|
||||
template <class T>
|
||||
std::string str(T x){
|
||||
return to_string(x);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue