Files
looper/engine/tests/test_status_fifo.c

90 lines
2.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#define STATUS_FIFO "/tmp/looper_status"
#define CMD_FIFO "/tmp/looper_cmd"
static int write_cmd(const char *cmd) {
int fd = open(CMD_FIFO, O_WRONLY | O_NONBLOCK);
if (fd < 0) return -1;
size_t len = strlen(cmd);
int n = write(fd, cmd, len);
if (n == (int)len && cmd[len-1] != '\n')
write(fd, "\n", 1);
close(fd);
return (n >= 0) ? 0 : -1;
}
static int read_status_line(char *buf, size_t bufsize) {
int fd = open(STATUS_FIFO, O_RDONLY | O_NONBLOCK);
if (fd < 0) return -1;
FILE *f = fdopen(fd, "r");
if (!f) { close(fd); return -1; }
if (fgets(buf, bufsize, f) == NULL) {
fclose(f);
return -1;
}
fclose(f);
return 0;
}
static pid_t start_looper(void) {
pid_t pid = fork();
if (pid < 0) { perror("fork"); return -1; }
if (pid == 0) {
close(2);
open("/dev/null", O_WRONLY);
execl("./looper", "looper", NULL);
perror("execl");
_exit(1);
}
return pid;
}
static int test_status_after_record(void) {
printf("Test: status FIFO reports recording state\n");
pid_t pid = start_looper();
if (pid < 0) return 1;
usleep(200000);
if (write_cmd("record 0") != 0) {
fprintf(stderr, " FAIL: cannot write record command\n");
kill(pid, SIGTERM); waitpid(pid, NULL, 0);
return 1;
}
usleep(500000);
char line[256];
if (read_status_line(line, sizeof(line)) != 0) {
fprintf(stderr, " FAIL: cannot read status line\n");
kill(pid, SIGTERM); waitpid(pid, NULL, 0);
return 1;
}
int ch, sc;
char state[32];
if (sscanf(line, "CH=%d SC=%d STATE=%31s", &ch, &sc, state) != 3) {
fprintf(stderr, " FAIL: malformed status line: %s\n", line);
kill(pid, SIGTERM); waitpid(pid, NULL, 0);
return 1;
}
if (ch != 0 || sc != 0 || strcmp(state, "RECORD") != 0) {
fprintf(stderr, " FAIL: expected CH=0 SC=0 STATE=RECORD, got: CH=%d SC=%d STATE=%s\n",
ch, sc, state);
kill(pid, SIGTERM); waitpid(pid, NULL, 0);
return 1;
}
printf(" PASS\n");
kill(pid, SIGTERM); waitpid(pid, NULL, 0);
return 0;
}
int main(void) {
int fail = 0;
fail += test_status_after_record();
return fail;
}