flush [ci skip]
[awesomized/libmemcached] / testing / lib / common.cpp
1 #include "common.hpp"
2 #include "Connection.hpp"
3
4 #include <cstdlib>
5 #include <sys/random.h>
6 #include <unistd.h>
7
8 unsigned random_num(unsigned min, unsigned max) {
9 unsigned p;
10 getrandom(&p, sizeof(p), 0);
11 return (p % (max - min + 1)) + min;
12 }
13
14 unsigned random_port() {
15 retry:
16 int port = random_num(2<<9, 2<<15);
17 Connection conn(port);
18
19 if (!conn.open()) {
20 return port;
21 }
22 if (!conn.isOpen()) {
23 return port;
24 }
25 goto retry;
26 }
27
28 string random_socket() {
29 return "/tmp/libmc." + to_string(random_num(1, UINT32_MAX)) + "@" + to_string(getpid()) + ".sock";
30 }
31
32 string random_socket_or_port_string(const string &what) {
33 if (what == "-s") {
34 return random_socket();
35 }
36
37 return to_string(random_port());
38 }
39
40 string random_socket_or_port_flag(const string &binary) {
41 (void) binary;
42 return random_num(0, 1) ? "-p" : "-s";
43 }
44
45 const char *getenv_else(const char *var, const char *defval) {
46 auto val = getenv(var);
47 if (val && *val) {
48 return val;
49 }
50 return defval;
51 }
52