126 lines
3.3 KiB
C
126 lines
3.3 KiB
C
#include "test_set_up.h"
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <sys/wait.h>
|
|
|
|
// Extern definitions
|
|
char display_name[5];
|
|
int aswm_pid;
|
|
Display* test_display;
|
|
Window test_root;
|
|
zlog_category_t *test_log;
|
|
|
|
// Local variables
|
|
unsigned int display_count = 100;
|
|
char display_fd[128];
|
|
int xephyr_pid;
|
|
|
|
void run_xephyr() {
|
|
FILE* displayfd = fopen(display_fd, "w"); // Used to store the name of the
|
|
// display on which Xephyr is
|
|
// running once it's ready.
|
|
char dfd[256]; // File descriptor of the opened temporary file.
|
|
sprintf(dfd, "%i", displayfd->_fileno);
|
|
char* args[] = {"Xephyr", display_name, "-br", "-ac", "-screen", "1440x810", "-displayfd", dfd, "-nopn", NULL};
|
|
execvp(args[0], args);
|
|
}
|
|
|
|
void set_up_test_logger(void) {
|
|
int rc;
|
|
|
|
rc = zlog_init(ASWM_TEST_DIR "/log.conf");
|
|
if (rc) {
|
|
printf("Init test zlog failed\n");
|
|
}
|
|
|
|
test_log = zlog_get_category("test");
|
|
if (!test_log) {
|
|
printf("Get zlog test_log category failed\n");
|
|
}
|
|
}
|
|
|
|
void tear_down_test_logger(void) {
|
|
zlog_fini();
|
|
}
|
|
|
|
bool check_xephyr_available() {
|
|
xephyr_pid = fork();
|
|
if(xephyr_pid == 0) {
|
|
char* args[] = {"which", "Xephyr", NULL};
|
|
execvp(args[0], args);
|
|
}
|
|
int stat_loc;
|
|
waitpid(xephyr_pid, &stat_loc, 0);
|
|
if(stat_loc != 0) {
|
|
zlog_error(test_log, "Xephyr executable not found. Make sure it is installed and available in your PATH.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void setUp(void) {
|
|
|
|
tmpnam(display_fd); // Creates a temporary file name
|
|
sprintf(display_name, ":%u", display_count); // Loads initial display count
|
|
// in display name
|
|
// Tries to create the first xephyr instance
|
|
xephyr_pid = fork();
|
|
if(xephyr_pid == 0) {
|
|
run_xephyr();
|
|
} else {
|
|
zlog_info(test_log, "Trying to run Xephyr instance on :%u...", display_count);
|
|
}
|
|
|
|
// The following loop waits for one of those two things:
|
|
// 1. The display name on which Xephyr is running is loaded into content,
|
|
// what indicates that the X server is ready.
|
|
// 2. The Xephyr process as stopped, what indicates that the proposed
|
|
// display count was already in use. In that case, try again after
|
|
// incrementing display count, until valid Xephyr display is running.
|
|
char content[256];
|
|
while(strlen(content) == 0) {
|
|
FILE* displayfd = fopen(display_fd, "r");
|
|
if(displayfd != NULL) {
|
|
fgets(content, 256, displayfd);
|
|
fseek(displayfd, 0, SEEK_SET);
|
|
fclose(displayfd);
|
|
}
|
|
|
|
int stat_loc;
|
|
if(waitpid(xephyr_pid, &stat_loc, WNOHANG) < 0) {
|
|
display_count++;
|
|
sprintf(display_name, ":%u", display_count);
|
|
xephyr_pid = fork();
|
|
if(xephyr_pid == 0) {
|
|
run_xephyr();
|
|
} else {
|
|
zlog_info(test_log, "Trying to run Xephyr instance on :%u...", display_count);
|
|
}
|
|
}
|
|
}
|
|
sscanf(content, "%i", &display_count);
|
|
|
|
aswm_pid = fork();
|
|
if(aswm_pid == 0) {
|
|
zlog_info(test_log, "Running aswm instance on %s...", display_name);
|
|
char* args[] = {"./aswm", "--log", ASWM_TEST_DIR "/aswm_log.conf", NULL};
|
|
char display_env[256];
|
|
sprintf(display_env, "DISPLAY=%s", display_name);
|
|
char* envp[] = {display_env, NULL};
|
|
execve(args[0], args, envp);
|
|
}
|
|
// TODO: condition in aswm to ensure it is running
|
|
sleep(2);
|
|
|
|
test_display = XOpenDisplay(display_name);
|
|
test_root = DefaultRootWindow(test_display);
|
|
}
|
|
|
|
void tearDown(void) {
|
|
XCloseDisplay(test_display);
|
|
|
|
kill(aswm_pid, SIGTERM);
|
|
kill(xephyr_pid, SIGTERM);
|
|
}
|
|
|