1
#include "DavEnvironment.h"
8
#include <sys/socket.h>
10
#include <netinet/in.h>
20
// Get a probably free IPv4 port number. We do this by binding a
21
// socket and then closing it. It is possible that the port will be
22
// reused, but that is less likely than with fixed port numbers.
25
int sock = socket(AF_INET, SOCK_STREAM, 0);
28
throw runtime_error("get_free_port: Could not create socket");
31
struct sockaddr_in addr;
32
socklen_t length = sizeof(addr);
33
memset(&addr, 0, length);
34
if (bind(sock, reinterpret_cast<struct sockaddr*>(&addr), length) < 0)
37
throw runtime_error("get_free_port: Could not bind socket");
40
if (getsockname(sock, reinterpret_cast<struct sockaddr*>(&addr),
41
&length) < 0 || length > sizeof(addr))
44
throw runtime_error("get_free_port: Could not get socket name");
47
return ntohs(addr.sin_port);
50
void wait_for_listen(int port)
52
int sock = socket(AF_INET, SOCK_STREAM, 0);
55
throw runtime_error("wait_for_listen: Could not create socket");
57
struct sockaddr_in addr;
58
addr.sin_family = AF_INET;
59
addr.sin_port = htons(port);
60
inet_aton("127.0.0.1", &addr.sin_addr);
63
for (int i = 0; i < 100; i++)
65
if (connect(sock, reinterpret_cast<struct sockaddr*>(&addr),
71
this_thread::sleep_for(chrono::milliseconds(50));
76
throw runtime_error("wait_for_listen: Could not connect to socket");
82
DavEnvironment::DavEnvironment(QString const& base_dir)
84
int port = get_free_port();
86
server_.setProcessChannelMode(QProcess::ForwardedChannels);
87
server_.setWorkingDirectory(base_dir);
88
server_.start("php", {"-S", QStringLiteral("127.0.0.1:%1").arg(port),
89
TEST_SRC_DIR "/utils/sabredav-server.php"});
90
if (!server_.waitForStarted())
92
throw runtime_error("DavServer::DavServer(): wait for server start failed");
94
wait_for_listen(port);
96
base_url_.setUrl(QStringLiteral("http://127.0.0.1:%1/").arg(port),
100
DavEnvironment::~DavEnvironment()
103
if (!server_.waitForFinished())
105
qCritical() << "Failed to terminate DAV server";
109
QUrl const& DavEnvironment::base_url() const