testing: replication
[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 unsigned random_port() {
7 retry:
8 auto port = random_num(5000, 32000);
9 Connection conn(port);
10
11 if (!conn.open()) {
12 return port;
13 }
14 if (!conn.isOpen()) {
15 return port;
16 }
17 goto retry;
18 }
19
20 string random_port_string(const string &) {
21 return to_string(random_port());
22 }
23
24 string random_socket(const string &prefix) {
25 return prefix + to_string(random_num(1U, UINT32_MAX)) + "@" + to_string(getpid()) + ".sock";
26 }
27
28 string random_socket_or_port_string(const string &what) {
29 if (what == "-s") {
30 return random_socket();
31 }
32
33 return to_string(random_port());
34 }
35
36 string random_socket_or_port_flag(const string &binary) {
37 (void) binary;
38 return random_num(0, 1) ? "-p" : "-s";
39 }
40
41 char random_ascii(char min, char max) {
42 return static_cast<char>(random_num(min, max));
43 }
44
45 string random_ascii_string(size_t len, char min, char max) {
46 string s;
47 s.reserve(len + 1);
48
49 for (size_t rem = 0; rem < len; ++rem) {
50 s += random_ascii(min, max);
51 }
52
53 s[len] = '\0';
54 assert(strlen(s.c_str()) == s.size());
55
56 return s;
57 }
58
59 pair<string, string> random_ascii_pair(size_t minlen, size_t maxlen) {
60 return {
61 random_ascii_string(random_num(minlen, maxlen)),
62 random_ascii_string(random_num(minlen, maxlen))
63 };
64 }
65
66 #include <climits>
67
68 char random_binary() {
69 return random_num(CHAR_MIN, CHAR_MAX);
70 }
71
72 string random_binary_string(size_t len) {
73 string s;
74 s.reserve(len + 1);
75
76 for (size_t rem = 0; rem < len; ++rem) {
77 s += random_binary();
78 }
79 s[len] = 0;
80
81 return s;
82 }