improve the tests
[beanstalkd.git] / integ-test.c
blob4237b84b3cfdeba33610577a80d6e579e6571480
1 #include <stdint.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdio.h>
5 #include <unistd.h>
6 #include <signal.h>
7 #include <sys/stat.h>
8 #include <sys/socket.h>
9 #include <sys/select.h>
10 #include <netdb.h>
11 #include <netinet/ip.h>
12 #include <arpa/inet.h>
13 #include <fcntl.h>
14 #include <sys/wait.h>
15 #include <errno.h>
16 #include "ct/ct.h"
17 #include "dat.h"
19 static int srvpid, port, fd, size;
20 static int64 timeout = 5000000000; // 5s
21 static char dir[] = "/tmp/beanstalkd.test.XXXXXX";
23 static byte fallocpat[3];
26 static int
27 wrapfalloc(int fd, int size)
29 static int c = 0;
31 printf("\nwrapfalloc: fd=%d size=%d\n", fd, size);
32 if (c >= sizeof(fallocpat) || !fallocpat[c++]) {
33 return ENOSPC;
35 return rawfalloc(fd, size);
39 static void
40 muststart(char *a0, char *a1, char *a2, char *a3, char *a4)
42 srvpid = fork();
43 if (srvpid < 0) {
44 twarn("fork");
45 exit(1);
48 if (srvpid > 0) {
49 printf("%s %s %s %s %s\n", a0, a1, a2, a3, a4);
50 printf("start server pid=%d\n", srvpid);
51 usleep(100000); // .1s; time for the child to bind to its port
52 return;
55 /* now in child */
57 execlp(a0, a0, a1, a2, a3, a4, NULL);
61 static int
62 mustdiallocal(int port)
64 int r, fd;
65 struct sockaddr_in addr = {};
67 addr.sin_family = AF_INET;
68 addr.sin_port = htons(port);
69 r = inet_aton("127.0.0.1", &addr.sin_addr);
70 if (!r) {
71 errno = EINVAL;
72 twarn("inet_aton");
73 exit(1);
76 fd = socket(PF_INET, SOCK_STREAM, 0);
77 if (fd == -1) {
78 twarn("socket");
79 exit(1);
82 r = connect(fd, (struct sockaddr*)&addr, sizeof addr);
83 if (r == -1) {
84 twarn("connect");
85 exit(1);
88 return fd;
92 #define SERVER() (progname=__func__, mustforksrv())
94 static int
95 mustforksrv()
97 int r, len, port;
98 struct sockaddr_in addr;
100 srv.sock.fd = make_server_socket("127.0.0.1", "0");
101 if (srv.sock.fd == -1) {
102 puts("mustforksrv failed");
103 exit(1);
106 len = sizeof(addr);
107 r = getsockname(srv.sock.fd, (struct sockaddr*)&addr, (socklen_t*)&len);
108 if (r == -1 || len > sizeof(addr)) {
109 puts("mustforksrv failed");
110 exit(1);
113 port = ntohs(addr.sin_port);
114 srvpid = fork();
115 if (srvpid < 0) {
116 twarn("fork");
117 exit(1);
120 if (srvpid > 0) {
121 printf("start server port=%d pid=%d\n", port, srvpid);
122 return port;
125 /* now in child */
127 prot_init();
129 if (srv.wal.use) {
130 struct job list = {};
131 // We want to make sure that only one beanstalkd tries
132 // to use the wal directory at a time. So acquire a lock
133 // now and never release it.
134 if (!waldirlock(&srv.wal)) {
135 twarnx("failed to lock wal dir %s", srv.wal.dir);
136 exit(10);
139 list.prev = list.next = &list;
140 walinit(&srv.wal, &list);
141 prot_replay(&srv, &list);
144 srvserve(&srv); /* does not return */
145 exit(1); /* satisfy the compiler */
149 static char *
150 readline(int fd)
152 int r, c = 0, p = 0, i = 0;
153 static char buf[1024];
154 fd_set rfd;
155 struct timeval tv;
157 printf("<%d ", fd);
158 fflush(stdout);
159 for (;;) {
160 FD_ZERO(&rfd);
161 FD_SET(fd, &rfd);
162 tv.tv_sec = timeout / 1000000000;
163 tv.tv_usec = (timeout/1000) % 1000000;
164 r = select(fd+1, &rfd, NULL, NULL, &tv);
165 switch (r) {
166 case 1:
167 break;
168 case 0:
169 fputs("timeout", stderr);
170 exit(8);
171 case -1:
172 perror("select");
173 exit(1);
174 default:
175 fputs("unknown error", stderr);
176 exit(3);
179 r = read(fd, &c, 1);
180 if (r == -1) {
181 perror("write");
182 exit(1);
184 if (i >= sizeof(buf)-1) {
185 fputs("response too big", stderr);
186 exit(4);
188 putc(c, stdout);
189 fflush(stdout);
190 buf[i++] = c;
191 if (p == '\r' && c == '\n') {
192 break;
194 p = c;
196 buf[i] = '\0';
197 return buf;
201 static void
202 ckresp(int fd, char *exp)
204 char *line;
206 line = readline(fd);
207 assertf(strcmp(exp, line) == 0, "\"%s\" != \"%s\"", exp, line);
211 static void
212 ckrespsub(int fd, char *sub)
214 char *line;
216 line = readline(fd);
217 assertf(strstr(line, sub), "\"%s\" not in \"%s\"", sub, line);
221 static void
222 writefull(int fd, char *s, int n)
224 int c;
225 for (; n; n -= c) {
226 c = write(fd, s, n);
227 if (c == -1) {
228 perror("write");
229 exit(1);
231 s += c;
236 static void
237 mustsend(int fd, char *s)
239 writefull(fd, s, strlen(s));
240 printf(">%d %s", fd, s);
241 fflush(stdout);
245 static void
246 killsrv(void)
248 if (srvpid > 1) {
249 kill(srvpid, 9);
254 static void
255 sigabrt(int sig)
257 killsrv();
261 static void
262 installabrt()
264 int r;
265 struct sigaction sa = {};
267 sa.sa_handler = sigabrt;
268 r = sigaction(SIGABRT, &sa, 0);
269 if (r == -1) {
270 twarn("sigaction SIGABRT");
271 exit(1);
276 static int
277 filesize(char *path)
279 int r;
280 struct stat s;
282 r = stat(path, &s);
283 if (r == -1) {
284 twarn("stat");
285 exit(1);
287 return s.st_size;
291 static int
292 exist(char *path)
294 int r;
295 struct stat s;
297 r = stat(path, &s);
298 return r != -1;
302 void
303 cttestpause()
305 int64 s;
307 port = SERVER();
308 fd = mustdiallocal(port);
309 mustsend(fd, "put 0 0 0 1\r\n");
310 mustsend(fd, "x\r\n");
311 ckresp(fd, "INSERTED 1\r\n");
312 s = nanoseconds();
313 mustsend(fd, "pause-tube default 1\r\n");
314 ckresp(fd, "PAUSED\r\n");
315 mustsend(fd, "reserve\r\n");
316 ckresp(fd, "RESERVED 1 1\r\n");
317 ckresp(fd, "x\r\n");
318 assert(nanoseconds() - s >= 1000000000); // 1s
320 killsrv();
324 void
325 cttestunderscore()
327 port = SERVER();
328 fd = mustdiallocal(port);
329 mustsend(fd, "use x_y\r\n");
330 ckresp(fd, "USING x_y\r\n");
332 killsrv();
336 void
337 cttesttoobig()
339 job_data_size_limit = 10;
340 port = SERVER();
341 fd = mustdiallocal(port);
342 mustsend(fd, "put 0 0 0 11\r\n");
343 mustsend(fd, "delete 9999\r\n");
344 mustsend(fd, "put 0 0 0 1\r\n");
345 mustsend(fd, "x\r\n");
346 ckresp(fd, "JOB_TOO_BIG\r\n");
347 ckresp(fd, "INSERTED 1\r\n");
349 killsrv();
353 void
354 cttestdeleteready()
356 port = SERVER();
357 fd = mustdiallocal(port);
358 mustsend(fd, "put 0 0 0 0\r\n");
359 mustsend(fd, "\r\n");
360 ckresp(fd, "INSERTED 1\r\n");
361 mustsend(fd, "delete 1\r\n");
362 ckresp(fd, "DELETED\r\n");
364 killsrv();
368 void
369 cttestmultitube()
371 port = SERVER();
372 fd = mustdiallocal(port);
373 mustsend(fd, "use abc\r\n");
374 ckresp(fd, "USING abc\r\n");
375 mustsend(fd, "put 999999 0 0 0\r\n");
376 mustsend(fd, "\r\n");
377 ckresp(fd, "INSERTED 1\r\n");
378 mustsend(fd, "use def\r\n");
379 ckresp(fd, "USING def\r\n");
380 mustsend(fd, "put 99 0 0 0\r\n");
381 mustsend(fd, "\r\n");
382 ckresp(fd, "INSERTED 2\r\n");
383 mustsend(fd, "watch abc\r\n");
384 ckresp(fd, "WATCHING 2\r\n");
385 mustsend(fd, "watch def\r\n");
386 ckresp(fd, "WATCHING 3\r\n");
387 mustsend(fd, "reserve\r\n");
388 ckresp(fd, "RESERVED 2 0\r\n");
390 killsrv();
394 void
395 cttestnonegativedelay()
397 port = SERVER();
398 fd = mustdiallocal(port);
399 mustsend(fd, "put 512 -1 100 0\r\n");
400 ckresp(fd, "BAD_FORMAT\r\n");
402 killsrv();
406 void
407 cttestomittimeleft()
409 port = SERVER();
410 fd = mustdiallocal(port);
411 mustsend(fd, "put 0 0 5 1\r\n");
412 mustsend(fd, "a\r\n");
413 ckresp(fd, "INSERTED 1\r\n");
414 mustsend(fd, "stats-job 1\r\n");
415 ckrespsub(fd, "OK ");
416 ckrespsub(fd, "\ntime-left: 0\n");
418 killsrv();
422 void
423 cttestsmalldelay()
425 port = SERVER();
426 fd = mustdiallocal(port);
427 mustsend(fd, "put 0 1 1 0\r\n");
428 mustsend(fd, "\r\n");
429 ckresp(fd, "INSERTED 1\r\n");
431 killsrv();
435 void
436 ctteststatstube()
438 port = SERVER();
439 fd = mustdiallocal(port);
440 mustsend(fd, "use tubea\r\n");
441 ckresp(fd, "USING tubea\r\n");
442 mustsend(fd, "put 0 0 0 1\r\n");
443 mustsend(fd, "x\r\n");
444 ckresp(fd, "INSERTED 1\r\n");
445 mustsend(fd, "delete 1\r\n");
446 ckresp(fd, "DELETED\r\n");
448 mustsend(fd, "stats-tube tubea\r\n");
449 ckrespsub(fd, "OK ");
450 ckrespsub(fd, "\nname: tubea\n");
451 mustsend(fd, "stats-tube tubea\r\n");
452 ckrespsub(fd, "OK ");
453 ckrespsub(fd, "\ncurrent-jobs-urgent: 0\n");
454 mustsend(fd, "stats-tube tubea\r\n");
455 ckrespsub(fd, "OK ");
456 ckrespsub(fd, "\ncurrent-jobs-ready: 0\n");
457 mustsend(fd, "stats-tube tubea\r\n");
458 ckrespsub(fd, "OK ");
459 ckrespsub(fd, "\ncurrent-jobs-reserved: 0\n");
460 mustsend(fd, "stats-tube tubea\r\n");
461 ckrespsub(fd, "OK ");
462 ckrespsub(fd, "\ncurrent-jobs-delayed: 0\n");
463 mustsend(fd, "stats-tube tubea\r\n");
464 ckrespsub(fd, "OK ");
465 ckrespsub(fd, "\ncurrent-jobs-buried: 0\n");
466 mustsend(fd, "stats-tube tubea\r\n");
467 ckrespsub(fd, "OK ");
468 ckrespsub(fd, "\ntotal-jobs: 1\n");
469 mustsend(fd, "stats-tube tubea\r\n");
470 ckrespsub(fd, "OK ");
471 ckrespsub(fd, "\ncurrent-using: 1\n");
472 mustsend(fd, "stats-tube tubea\r\n");
473 ckrespsub(fd, "OK ");
474 ckrespsub(fd, "\ncurrent-watching: 0\n");
475 mustsend(fd, "stats-tube tubea\r\n");
476 ckrespsub(fd, "OK ");
477 ckrespsub(fd, "\ncurrent-waiting: 0\n");
478 mustsend(fd, "stats-tube tubea\r\n");
479 ckrespsub(fd, "OK ");
480 ckrespsub(fd, "\ncmd-delete: 1\n");
481 mustsend(fd, "stats-tube tubea\r\n");
482 ckrespsub(fd, "OK ");
483 ckrespsub(fd, "\ncmd-pause-tube: 0\n");
484 mustsend(fd, "stats-tube tubea\r\n");
485 ckrespsub(fd, "OK ");
486 ckrespsub(fd, "\npause: 0\n");
487 mustsend(fd, "stats-tube tubea\r\n");
488 ckrespsub(fd, "OK ");
489 ckrespsub(fd, "\npause-time-left: 0\n");
491 mustsend(fd, "stats-tube default\r\n");
492 ckrespsub(fd, "OK ");
493 ckrespsub(fd, "\nname: default\n");
494 mustsend(fd, "stats-tube default\r\n");
495 ckrespsub(fd, "OK ");
496 ckrespsub(fd, "\ncurrent-jobs-urgent: 0\n");
497 mustsend(fd, "stats-tube default\r\n");
498 ckrespsub(fd, "OK ");
499 ckrespsub(fd, "\ncurrent-jobs-ready: 0\n");
500 mustsend(fd, "stats-tube default\r\n");
501 ckrespsub(fd, "OK ");
502 ckrespsub(fd, "\ncurrent-jobs-reserved: 0\n");
503 mustsend(fd, "stats-tube default\r\n");
504 ckrespsub(fd, "OK ");
505 ckrespsub(fd, "\ncurrent-jobs-delayed: 0\n");
506 mustsend(fd, "stats-tube default\r\n");
507 ckrespsub(fd, "OK ");
508 ckrespsub(fd, "\ncurrent-jobs-buried: 0\n");
509 mustsend(fd, "stats-tube default\r\n");
510 ckrespsub(fd, "OK ");
511 ckrespsub(fd, "\ntotal-jobs: 0\n");
512 mustsend(fd, "stats-tube default\r\n");
513 ckrespsub(fd, "OK ");
514 ckrespsub(fd, "\ncurrent-using: 0\n");
515 mustsend(fd, "stats-tube default\r\n");
516 ckrespsub(fd, "OK ");
517 ckrespsub(fd, "\ncurrent-watching: 1\n");
518 mustsend(fd, "stats-tube default\r\n");
519 ckrespsub(fd, "OK ");
520 ckrespsub(fd, "\ncurrent-waiting: 0\n");
521 mustsend(fd, "stats-tube default\r\n");
522 ckrespsub(fd, "OK ");
523 ckrespsub(fd, "\ncmd-delete: 0\n");
524 mustsend(fd, "stats-tube default\r\n");
525 ckrespsub(fd, "OK ");
526 ckrespsub(fd, "\ncmd-pause-tube: 0\n");
527 mustsend(fd, "stats-tube default\r\n");
528 ckrespsub(fd, "OK ");
529 ckrespsub(fd, "\npause: 0\n");
530 mustsend(fd, "stats-tube default\r\n");
531 ckrespsub(fd, "OK ");
532 ckrespsub(fd, "\npause-time-left: 0\n");
534 killsrv();
538 void
539 cttestttrlarge()
541 port = SERVER();
542 fd = mustdiallocal(port);
543 mustsend(fd, "put 0 0 120 1\r\n");
544 mustsend(fd, "a\r\n");
545 ckresp(fd, "INSERTED 1\r\n");
546 mustsend(fd, "put 0 0 4294 1\r\n");
547 mustsend(fd, "a\r\n");
548 ckresp(fd, "INSERTED 2\r\n");
549 mustsend(fd, "put 0 0 4295 1\r\n");
550 mustsend(fd, "a\r\n");
551 ckresp(fd, "INSERTED 3\r\n");
552 mustsend(fd, "put 0 0 4296 1\r\n");
553 mustsend(fd, "a\r\n");
554 ckresp(fd, "INSERTED 4\r\n");
555 mustsend(fd, "put 0 0 4297 1\r\n");
556 mustsend(fd, "a\r\n");
557 ckresp(fd, "INSERTED 5\r\n");
558 mustsend(fd, "put 0 0 5000 1\r\n");
559 mustsend(fd, "a\r\n");
560 ckresp(fd, "INSERTED 6\r\n");
561 mustsend(fd, "put 0 0 21600 1\r\n");
562 mustsend(fd, "a\r\n");
563 ckresp(fd, "INSERTED 7\r\n");
564 mustsend(fd, "stats-job 1\r\n");
565 ckrespsub(fd, "OK ");
566 ckrespsub(fd, "\nttr: 120\n");
567 mustsend(fd, "stats-job 2\r\n");
568 ckrespsub(fd, "OK ");
569 ckrespsub(fd, "\nttr: 4294\n");
570 mustsend(fd, "stats-job 3\r\n");
571 ckrespsub(fd, "OK ");
572 ckrespsub(fd, "\nttr: 4295\n");
573 mustsend(fd, "stats-job 4\r\n");
574 ckrespsub(fd, "OK ");
575 ckrespsub(fd, "\nttr: 4296\n");
576 mustsend(fd, "stats-job 5\r\n");
577 ckrespsub(fd, "OK ");
578 ckrespsub(fd, "\nttr: 4297\n");
579 mustsend(fd, "stats-job 6\r\n");
580 ckrespsub(fd, "OK ");
581 ckrespsub(fd, "\nttr: 5000\n");
582 mustsend(fd, "stats-job 7\r\n");
583 ckrespsub(fd, "OK ");
584 ckrespsub(fd, "\nttr: 21600\n");
586 killsrv();
590 void
591 cttestttrsmall()
593 port = SERVER();
594 fd = mustdiallocal(port);
595 mustsend(fd, "put 0 0 0 1\r\n");
596 mustsend(fd, "a\r\n");
597 ckresp(fd, "INSERTED 1\r\n");
598 mustsend(fd, "stats-job 1\r\n");
599 ckrespsub(fd, "OK ");
600 ckrespsub(fd, "\nttr: 1\n");
602 killsrv();
606 void
607 cttestzerodelay()
609 port = SERVER();
610 fd = mustdiallocal(port);
611 mustsend(fd, "put 0 0 1 0\r\n");
612 mustsend(fd, "\r\n");
613 ckresp(fd, "INSERTED 1\r\n");
615 killsrv();
619 void
620 cttestreservewithtimeout2conn()
622 int fd0, fd1;
624 job_data_size_limit = 10;
626 port = SERVER();
627 fd0 = mustdiallocal(port);
628 fd1 = mustdiallocal(port);
629 mustsend(fd0, "watch foo\r\n");
630 ckresp(fd0, "WATCHING 2\r\n");
631 mustsend(fd0, "reserve-with-timeout 1\r\n");
632 mustsend(fd1, "watch foo\r\n");
633 ckresp(fd1, "WATCHING 2\r\n");
634 timeout = 1100000000; // 1.1s
635 ckresp(fd0, "TIMED_OUT\r\n");
637 killsrv();
641 void
642 cttestbinlogemptyexit()
644 mkdtemp(dir);
645 srv.wal.dir = dir;
646 srv.wal.use = 1;
647 job_data_size_limit = 10;
649 port = SERVER();
651 killsrv();
653 port = SERVER();
654 fd = mustdiallocal(port);
655 mustsend(fd, "put 0 0 0 0\r\n");
656 mustsend(fd, "\r\n");
657 ckresp(fd, "INSERTED 1\r\n");
659 killsrv();
660 execlp("rm", "rm", "-rf", dir, NULL);
664 void
665 cttestbinlogbury()
667 mkdtemp(dir);
668 srv.wal.dir = dir;
669 srv.wal.use = 1;
670 job_data_size_limit = 10;
672 port = SERVER();
673 fd = mustdiallocal(port);
674 mustsend(fd, "put 0 0 100 0\r\n");
675 mustsend(fd, "\r\n");
676 ckresp(fd, "INSERTED 1\r\n");
677 mustsend(fd, "reserve\r\n");
678 ckresp(fd, "RESERVED 1 0\r\n");
679 ckresp(fd, "\r\n");
680 mustsend(fd, "bury 1 0\r\n");
681 ckresp(fd, "BURIED\r\n");
683 killsrv();
684 execlp("rm", "rm", "-rf", dir, NULL);
688 void
689 cttestbinlogbasic()
691 mkdtemp(dir);
692 srv.wal.dir = dir;
693 srv.wal.use = 1;
694 job_data_size_limit = 10;
696 port = SERVER();
697 fd = mustdiallocal(port);
698 mustsend(fd, "put 0 0 100 0\r\n");
699 mustsend(fd, "\r\n");
700 ckresp(fd, "INSERTED 1\r\n");
702 killsrv();
703 waitpid(srvpid, NULL, 0);
705 port = SERVER();
706 fd = mustdiallocal(port);
707 mustsend(fd, "delete 1\r\n");
708 ckresp(fd, "DELETED\r\n");
710 killsrv();
711 execlp("rm", "rm", "-rf", dir, NULL);
715 void
716 cttestbinlogsizelimit()
718 int i = 0;
719 char *b2;
720 int gotsize;
722 size = 1024;
723 mkdtemp(dir);
724 srv.wal.dir = dir;
725 srv.wal.use = 1;
726 srv.wal.filesz = size;
727 srv.wal.syncrate = 0;
728 srv.wal.wantsync = 1;
730 port = SERVER();
731 fd = mustdiallocal(port);
732 b2 = fmtalloc("%s/binlog.2", dir);
733 while (!exist(b2)) {
734 mustsend(fd, "put 0 0 100 50\r\n");
735 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
736 ckresp(fd, fmtalloc("INSERTED %d\r\n", ++i));
739 gotsize = filesize(fmtalloc("%s/binlog.1", dir));
740 assertf(gotsize == size, "binlog.1 %d != %d", gotsize, size);
741 gotsize = filesize(b2);
742 assertf(gotsize == size, "binlog.2 %d != %d", gotsize, size);
744 killsrv();
745 execlp("rm", "rm", "-rf", dir, NULL);
749 void
750 cttestbinlogallocation()
752 int i = 0;
754 size = 601;
755 mkdtemp(dir);
756 srv.wal.dir = dir;
757 srv.wal.use = 1;
758 srv.wal.filesz = size;
759 srv.wal.syncrate = 0;
760 srv.wal.wantsync = 1;
762 port = SERVER();
763 fd = mustdiallocal(port);
764 for (i = 1; i <= 96; i++) {
765 mustsend(fd, "put 0 0 120 22\r\n");
766 mustsend(fd, "job payload xxxxxxxxxx\r\n");
767 ckresp(fd, fmtalloc("INSERTED %d\r\n", i));
769 for (i = 1; i <= 96; i++) {
770 mustsend(fd, fmtalloc("delete %d\r\n", i));
771 ckresp(fd, "DELETED\r\n");
774 killsrv();
775 execlp("rm", "rm", "-rf", dir, NULL);
779 void
780 cttestbinlogread()
782 mkdtemp(dir);
783 srv.wal.dir = dir;
784 srv.wal.use = 1;
785 srv.wal.syncrate = 0;
786 srv.wal.wantsync = 1;
788 port = SERVER();
789 fd = mustdiallocal(port);
790 mustsend(fd, "use test\r\n");
791 ckresp(fd, "USING test\r\n");
792 mustsend(fd, "put 0 0 120 4\r\n");
793 mustsend(fd, "test\r\n");
794 ckresp(fd, "INSERTED 1\r\n");
795 mustsend(fd, "put 0 0 120 4\r\n");
796 mustsend(fd, "tes1\r\n");
797 ckresp(fd, "INSERTED 2\r\n");
798 mustsend(fd, "watch test\r\n");
799 ckresp(fd, "WATCHING 2\r\n");
800 mustsend(fd, "reserve\r\n");
801 ckresp(fd, "RESERVED 1 4\r\n");
802 ckresp(fd, "test\r\n");
803 mustsend(fd, "release 1 1 1\r\n");
804 ckresp(fd, "RELEASED\r\n");
805 mustsend(fd, "reserve\r\n");
806 ckresp(fd, "RESERVED 2 4\r\n");
807 ckresp(fd, "tes1\r\n");
808 mustsend(fd, "delete 2\r\n");
809 ckresp(fd, "DELETED\r\n");
811 killsrv();
812 waitpid(srvpid, NULL, 0);
814 port = SERVER();
815 fd = mustdiallocal(port);
816 mustsend(fd, "watch test\r\n");
817 ckresp(fd, "WATCHING 2\r\n");
818 mustsend(fd, "reserve\r\n");
819 ckresp(fd, "RESERVED 1 4\r\n");
820 ckresp(fd, "test\r\n");
821 mustsend(fd, "delete 1\r\n");
822 ckresp(fd, "DELETED\r\n");
823 mustsend(fd, "delete 2\r\n");
824 ckresp(fd, "NOT_FOUND\r\n");
826 killsrv();
827 execlp("rm", "rm", "-rf", dir, NULL);
831 void
832 cttestbinlogdiskfull()
834 size = 1000;
835 falloc = &wrapfalloc;
836 fallocpat[0] = 1;
837 fallocpat[2] = 1;
839 mkdtemp(dir);
840 srv.wal.dir = dir;
841 srv.wal.use = 1;
842 srv.wal.filesz = size;
843 srv.wal.syncrate = 0;
844 srv.wal.wantsync = 1;
846 port = SERVER();
847 fd = mustdiallocal(port);
848 mustsend(fd, "put 0 0 100 50\r\n");
849 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
850 ckresp(fd, "INSERTED 1\r\n");
851 mustsend(fd, "put 0 0 100 50\r\n");
852 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
853 ckresp(fd, "INSERTED 2\r\n");
854 mustsend(fd, "put 0 0 100 50\r\n");
855 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
856 ckresp(fd, "INSERTED 3\r\n");
857 mustsend(fd, "put 0 0 100 50\r\n");
858 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
859 ckresp(fd, "INSERTED 4\r\n");
861 mustsend(fd, "put 0 0 100 50\r\n");
862 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
863 ckresp(fd, "OUT_OF_MEMORY\r\n");
865 mustsend(fd, "put 0 0 100 50\r\n");
866 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
867 ckresp(fd, "INSERTED 6\r\n");
868 mustsend(fd, "put 0 0 100 50\r\n");
869 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
870 ckresp(fd, "INSERTED 7\r\n");
871 mustsend(fd, "put 0 0 100 50\r\n");
872 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
873 ckresp(fd, "INSERTED 8\r\n");
874 mustsend(fd, "put 0 0 100 50\r\n");
875 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
876 ckresp(fd, "INSERTED 9\r\n");
878 mustsend(fd, "delete 1\r\n");
879 ckresp(fd, "DELETED\r\n");
880 mustsend(fd, "delete 2\r\n");
881 ckresp(fd, "DELETED\r\n");
882 mustsend(fd, "delete 3\r\n");
883 ckresp(fd, "DELETED\r\n");
884 mustsend(fd, "delete 4\r\n");
885 ckresp(fd, "DELETED\r\n");
886 mustsend(fd, "delete 6\r\n");
887 ckresp(fd, "DELETED\r\n");
888 mustsend(fd, "delete 7\r\n");
889 ckresp(fd, "DELETED\r\n");
890 mustsend(fd, "delete 8\r\n");
891 ckresp(fd, "DELETED\r\n");
892 mustsend(fd, "delete 9\r\n");
893 ckresp(fd, "DELETED\r\n");
895 killsrv();
896 execlp("rm", "rm", "-rf", dir, NULL);
900 void
901 cttestbinlogdiskfulldelete()
903 size = 1000;
904 falloc = &wrapfalloc;
905 fallocpat[0] = 1;
906 fallocpat[1] = 1;
908 mkdtemp(dir);
909 srv.wal.dir = dir;
910 srv.wal.use = 1;
911 srv.wal.filesz = size;
912 srv.wal.syncrate = 0;
913 srv.wal.wantsync = 1;
915 port = SERVER();
916 fd = mustdiallocal(port);
917 mustsend(fd, "put 0 0 100 50\r\n");
918 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
919 ckresp(fd, "INSERTED 1\r\n");
920 mustsend(fd, "put 0 0 100 50\r\n");
921 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
922 ckresp(fd, "INSERTED 2\r\n");
923 mustsend(fd, "put 0 0 100 50\r\n");
924 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
925 ckresp(fd, "INSERTED 3\r\n");
926 mustsend(fd, "put 0 0 100 50\r\n");
927 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
928 ckresp(fd, "INSERTED 4\r\n");
929 mustsend(fd, "put 0 0 100 50\r\n");
930 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
931 ckresp(fd, "INSERTED 5\r\n");
933 mustsend(fd, "put 0 0 100 50\r\n");
934 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
935 ckresp(fd, "INSERTED 6\r\n");
936 mustsend(fd, "put 0 0 100 50\r\n");
937 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
938 ckresp(fd, "INSERTED 7\r\n");
939 mustsend(fd, "put 0 0 100 50\r\n");
940 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
941 ckresp(fd, "INSERTED 8\r\n");
943 mustsend(fd, "put 0 0 100 50\r\n");
944 mustsend(fd, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
945 ckresp(fd, "OUT_OF_MEMORY\r\n");
947 assert(exist(fmtalloc("%s/binlog.1", dir)));
949 mustsend(fd, "delete 1\r\n");
950 ckresp(fd, "DELETED\r\n");
951 mustsend(fd, "delete 2\r\n");
952 ckresp(fd, "DELETED\r\n");
953 mustsend(fd, "delete 3\r\n");
954 ckresp(fd, "DELETED\r\n");
955 mustsend(fd, "delete 4\r\n");
956 ckresp(fd, "DELETED\r\n");
957 mustsend(fd, "delete 5\r\n");
958 ckresp(fd, "DELETED\r\n");
959 mustsend(fd, "delete 6\r\n");
960 ckresp(fd, "DELETED\r\n");
961 mustsend(fd, "delete 7\r\n");
962 ckresp(fd, "DELETED\r\n");
963 mustsend(fd, "delete 8\r\n");
964 ckresp(fd, "DELETED\r\n");
966 killsrv();
967 execlp("rm", "rm", "-rf", dir, NULL);
971 void
972 cttestbinlogv5()
974 char portstr[10];
976 if (system("which beanstalkd-1.4.6") != 0) {
977 puts("beanstalkd 1.4.6 not found, skipping");
978 exit(0);
981 installabrt();
982 mkdtemp(dir);
984 progname=__func__;
985 port = (rand() && 0xfbff) + 1024;
986 sprintf(portstr, "%d", port);
987 muststart("beanstalkd-1.4.6", "-b", dir, "-p", portstr);
988 fd = mustdiallocal(port);
989 mustsend(fd, "use test\r\n");
990 ckresp(fd, "USING test\r\n");
991 mustsend(fd, "put 1 2 3 4\r\n");
992 mustsend(fd, "test\r\n");
993 ckresp(fd, "INSERTED 1\r\n");
994 mustsend(fd, "put 4 3 2 1\r\n");
995 mustsend(fd, "x\r\n");
996 ckresp(fd, "INSERTED 2\r\n");
998 mustsend(fd, "stats-job 1\r\n");
999 ckrespsub(fd, "OK ");
1000 ckrespsub(fd, "\nid: 1\n");
1001 mustsend(fd, "stats-job 1\r\n");
1002 ckrespsub(fd, "OK ");
1003 ckrespsub(fd, "\ntube: test\n");
1004 mustsend(fd, "stats-job 1\r\n");
1005 ckrespsub(fd, "OK ");
1006 ckrespsub(fd, "\nstate: delayed\n");
1007 mustsend(fd, "stats-job 1\r\n");
1008 ckrespsub(fd, "OK ");
1009 ckrespsub(fd, "\npri: 1\n");
1010 mustsend(fd, "stats-job 1\r\n");
1011 ckrespsub(fd, "OK ");
1012 ckrespsub(fd, "\ndelay: 2\n");
1013 mustsend(fd, "stats-job 1\r\n");
1014 ckrespsub(fd, "OK ");
1015 ckrespsub(fd, "\nttr: 3\n");
1016 mustsend(fd, "stats-job 1\r\n");
1017 ckrespsub(fd, "OK ");
1018 ckrespsub(fd, "\nreserves: 0\n");
1019 mustsend(fd, "stats-job 1\r\n");
1020 ckrespsub(fd, "OK ");
1021 ckrespsub(fd, "\ntimeouts: 0\n");
1022 mustsend(fd, "stats-job 1\r\n");
1023 ckrespsub(fd, "OK ");
1024 ckrespsub(fd, "\nreleases: 0\n");
1025 mustsend(fd, "stats-job 1\r\n");
1026 ckrespsub(fd, "OK ");
1027 ckrespsub(fd, "\nburies: 0\n");
1028 mustsend(fd, "stats-job 1\r\n");
1029 ckrespsub(fd, "OK ");
1030 ckrespsub(fd, "\nkicks: 0\n");
1032 mustsend(fd, "stats-job 2\r\n");
1033 ckrespsub(fd, "OK ");
1034 ckrespsub(fd, "\nid: 2\n");
1035 mustsend(fd, "stats-job 2\r\n");
1036 ckrespsub(fd, "OK ");
1037 ckrespsub(fd, "\ntube: test\n");
1038 mustsend(fd, "stats-job 2\r\n");
1039 ckrespsub(fd, "OK ");
1040 ckrespsub(fd, "\nstate: delayed\n");
1041 mustsend(fd, "stats-job 2\r\n");
1042 ckrespsub(fd, "OK ");
1043 ckrespsub(fd, "\npri: 4\n");
1044 mustsend(fd, "stats-job 2\r\n");
1045 ckrespsub(fd, "OK ");
1046 ckrespsub(fd, "\ndelay: 3\n");
1047 mustsend(fd, "stats-job 2\r\n");
1048 ckrespsub(fd, "OK ");
1049 ckrespsub(fd, "\nttr: 2\n");
1050 mustsend(fd, "stats-job 2\r\n");
1051 ckrespsub(fd, "OK ");
1052 ckrespsub(fd, "\nreserves: 0\n");
1053 mustsend(fd, "stats-job 2\r\n");
1054 ckrespsub(fd, "OK ");
1055 ckrespsub(fd, "\ntimeouts: 0\n");
1056 mustsend(fd, "stats-job 2\r\n");
1057 ckrespsub(fd, "OK ");
1058 ckrespsub(fd, "\nreleases: 0\n");
1059 mustsend(fd, "stats-job 2\r\n");
1060 ckrespsub(fd, "OK ");
1061 ckrespsub(fd, "\nburies: 0\n");
1062 mustsend(fd, "stats-job 2\r\n");
1063 ckrespsub(fd, "OK ");
1064 ckrespsub(fd, "\nkicks: 0\n");
1066 killsrv();
1068 srv.wal.dir = dir;
1069 srv.wal.use = 1;
1070 srv.wal.syncrate = 0;
1071 srv.wal.wantsync = 1;
1073 port = SERVER();
1074 fd = mustdiallocal(port);
1076 mustsend(fd, "stats-job 1\r\n");
1077 ckrespsub(fd, "OK ");
1078 ckrespsub(fd, "\nid: 1\n");
1079 mustsend(fd, "stats-job 1\r\n");
1080 ckrespsub(fd, "OK ");
1081 ckrespsub(fd, "\ntube: test\n");
1082 mustsend(fd, "stats-job 1\r\n");
1083 ckrespsub(fd, "OK ");
1084 ckrespsub(fd, "\nstate: delayed\n");
1085 mustsend(fd, "stats-job 1\r\n");
1086 ckrespsub(fd, "OK ");
1087 ckrespsub(fd, "\npri: 1\n");
1088 mustsend(fd, "stats-job 1\r\n");
1089 ckrespsub(fd, "OK ");
1090 ckrespsub(fd, "\ndelay: 2\n");
1091 mustsend(fd, "stats-job 1\r\n");
1092 ckrespsub(fd, "OK ");
1093 ckrespsub(fd, "\nttr: 3\n");
1094 mustsend(fd, "stats-job 1\r\n");
1095 ckrespsub(fd, "OK ");
1096 ckrespsub(fd, "\nreserves: 0\n");
1097 mustsend(fd, "stats-job 1\r\n");
1098 ckrespsub(fd, "OK ");
1099 ckrespsub(fd, "\ntimeouts: 0\n");
1100 mustsend(fd, "stats-job 1\r\n");
1101 ckrespsub(fd, "OK ");
1102 ckrespsub(fd, "\nreleases: 0\n");
1103 mustsend(fd, "stats-job 1\r\n");
1104 ckrespsub(fd, "OK ");
1105 ckrespsub(fd, "\nburies: 0\n");
1106 mustsend(fd, "stats-job 1\r\n");
1107 ckrespsub(fd, "OK ");
1108 ckrespsub(fd, "\nkicks: 0\n");
1110 mustsend(fd, "stats-job 2\r\n");
1111 ckrespsub(fd, "OK ");
1112 ckrespsub(fd, "\nid: 2\n");
1113 mustsend(fd, "stats-job 2\r\n");
1114 ckrespsub(fd, "OK ");
1115 ckrespsub(fd, "\ntube: test\n");
1116 mustsend(fd, "stats-job 2\r\n");
1117 ckrespsub(fd, "OK ");
1118 ckrespsub(fd, "\nstate: delayed\n");
1119 mustsend(fd, "stats-job 2\r\n");
1120 ckrespsub(fd, "OK ");
1121 ckrespsub(fd, "\npri: 4\n");
1122 mustsend(fd, "stats-job 2\r\n");
1123 ckrespsub(fd, "OK ");
1124 ckrespsub(fd, "\ndelay: 3\n");
1125 mustsend(fd, "stats-job 2\r\n");
1126 ckrespsub(fd, "OK ");
1127 ckrespsub(fd, "\nttr: 2\n");
1128 mustsend(fd, "stats-job 2\r\n");
1129 ckrespsub(fd, "OK ");
1130 ckrespsub(fd, "\nreserves: 0\n");
1131 mustsend(fd, "stats-job 2\r\n");
1132 ckrespsub(fd, "OK ");
1133 ckrespsub(fd, "\ntimeouts: 0\n");
1134 mustsend(fd, "stats-job 2\r\n");
1135 ckrespsub(fd, "OK ");
1136 ckrespsub(fd, "\nreleases: 0\n");
1137 mustsend(fd, "stats-job 2\r\n");
1138 ckrespsub(fd, "OK ");
1139 ckrespsub(fd, "\nburies: 0\n");
1140 mustsend(fd, "stats-job 2\r\n");
1141 ckrespsub(fd, "OK ");
1142 ckrespsub(fd, "\nkicks: 0\n");
1144 killsrv();
1145 execlp("rm", "rm", "-rf", dir, NULL);