WIP
[m6w6/libmemcached] / test / lib / random.cpp
1 #include "test/lib/random.hpp"
2 #include "test/lib/Connection.hpp"
3
4 #if HAVE_UNISTD_H
5 # include <unistd.h> // getpid()
6 #endif
7 mt19937_64 rnd_eng;
8 mutex rnd_mtx;
9
10 void random_setup() {
11 using namespace chrono;
12
13 auto time = duration_cast<nanoseconds>(system_clock::now().time_since_epoch());
14 rnd_eng.seed(static_cast<mt19937_64::result_type>(time.count()));
15 }
16
17 unsigned random_port() {
18 do {
19 auto port = random_num(5000, 32000);
20 Connection conn(port);
21
22 if (!conn.open()) {
23 return port;
24 }
25 if (!conn.isOpen()) {
26 return port;
27 }
28 } while(true);
29 }
30
31 string random_port_string(const string &) {
32 return to_string(random_port());
33 }
34
35 string random_socket(const string &prefix) {
36 return prefix + to_string(random_num(1U, UINT32_MAX)) + "@" + to_string(getpid()) + ".sock";
37 }
38
39 string random_socket_or_port_string(const string &what) {
40 if (what == "-s") {
41 return random_socket();
42 }
43
44 return to_string(random_port());
45 }
46
47 string random_socket_or_port_flag(const string &binary) {
48 (void) binary;
49 return random_num(0, 1) ? "-p" : "-s";
50 }
51
52 char random_ascii(char min, char max) {
53 return static_cast<char>(random_num(min, max));
54 }
55
56 string random_ascii_string(size_t len, char min, char max) {
57 string s;
58 s.reserve(len + 1);
59
60 for (size_t rem = 0; rem < len; ++rem) {
61 s += random_ascii(min, max);
62 }
63
64 s[len] = '\0';
65 assert(strlen(s.c_str()) == s.size());
66
67 return s;
68 }
69
70 pair<string, string> random_ascii_pair(size_t minlen, size_t maxlen) {
71 return {
72 random_ascii_string(random_num(minlen, maxlen)),
73 random_ascii_string(random_num(minlen, maxlen))
74 };
75 }
76
77 #include <climits>
78
79 char random_binary() {
80 return random_num(CHAR_MIN, CHAR_MAX);
81 }
82
83 string random_binary_string(size_t len) {
84 string s;
85 s.reserve(len + 1);
86
87 for (size_t rem = 0; rem < len; ++rem) {
88 s += random_binary();
89 }
90 s[len] = 0;
91
92 return s;
93 }