Ticket #781: remote-leak-test.cc

File remote-leak-test.cc, 1.3 KB (added by Olly Betts, 5 years ago)

All-in-one C++ reproducer

Line 
1/*
2c++ -Iinclude -o remote-leak-test -Wl,-rpath ~+/.libs remote-leak-test.cc .libs/libxapian-1.5.so
3./remote-leak-test
4*/
5
6#include <cstdio>
7#include <cstdlib>
8#include <iostream>
9
10#include <unistd.h>
11
12#include <xapian.h>
13
14using namespace std;
15
16#define DB "tmp.db"
17#define PORT 5050
18#define SERVER "localhost"
19
20#define STRINGIZE_(X) #X
21#define STRINGIZE(X) STRINGIZE_(X)
22
23static int get_first_unused_fd() {
24 int fd = dup(1);
25 close(fd);
26 return fd;
27}
28
29static int remote_leak() {
30 try {
31 auto wsdb = Xapian::Remote::open_writable(SERVER, PORT, 1000, 1000, Xapian::DB_CREATE_OR_OPEN);
32 } catch (const Xapian::DatabaseLockError& exc) {
33 // Expected
34 return 0;
35 }
36 cerr << "Didn't get DatabaseLockError" << endl;
37 return 1;
38}
39
40int main() {
41 system("rm -rf " DB);
42 system("bin/xapian-tcpsrv --writable --one-shot --port " STRINGIZE(PORT) " --interface " SERVER " " DB "&");
43 sleep(1);
44 Xapian::WritableDatabase wdb(DB);
45 int first_unused_fd_before = get_first_unused_fd();
46 if (remote_leak() != 0) {
47 return 1;
48 }
49 int first_unused_fd_after = get_first_unused_fd();
50 if (first_unused_fd_before != first_unused_fd_after) {
51 cerr << "First unused fd before= " << first_unused_fd_before
52 << ", after = " << first_unused_fd_after << endl;
53 return 1;
54 }
55 return 0;
56}