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