* Ran Benita <ran234@gmail.com>
*/
+#include "config.h"
+
#include <limits.h>
#include <fcntl.h>
-#include <unistd.h>
+#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef _WIN32
+#include <io.h>
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <termios.h>
+#endif
#include "test.h"
+#include "utils.h"
/*
* Test a sequence of keysyms, resulting from a sequence of key presses,
xkb_keysym_t keysym;
const xkb_keysym_t *syms;
+ xkb_keysym_t sym;
unsigned int nsyms, i;
char ksbuf[64];
op = va_arg(ap, int);
nsyms = xkb_state_key_get_syms(state, kc, &syms);
- fprintf(stderr, "got %d syms for key 0x%x: [", nsyms, kc);
+ if (nsyms == 1) {
+ sym = xkb_state_key_get_one_sym(state, kc);
+ syms = &sym;
+ }
+
+ fprintf(stderr, "got %u syms for keycode %u: [", nsyms, kc);
if (op == DOWN || op == BOTH)
xkb_state_update_key(state, kc, XKB_KEY_DOWN);
}
}
+ if (nsyms == 0) {
+ keysym = va_arg(ap, int);
+ if (keysym != XKB_KEY_NoSymbol) {
+ xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "Expected %s, but got no keysyms.\n", ksbuf);
+ goto fail;
+ }
+ }
+
fprintf(stderr, "]\n");
keysym = va_arg(ap, int);
return ret;
}
-const char *
+char *
+test_makedir(const char *parent, const char *path)
+{
+ char *dirname;
+ int err;
+
+ dirname = asprintf_safe("%s/%s", parent, path);
+ assert(dirname);
+#ifdef _WIN32
+ err = _mkdir(dirname);
+#else
+ err = mkdir(dirname, 0777);
+#endif
+ assert(err == 0);
+
+ return dirname;
+}
+
+char *
+test_maketempdir(const char *template)
+{
+#ifdef _WIN32
+ const char *basetmp = getenv("TMP");
+ if (basetmp == NULL) {
+ basetmp = getenv("TEMP");
+ }
+ if (basetmp == NULL) {
+ basetmp = getenv("top_builddir");
+ }
+ assert(basetmp != NULL);
+ char *tmpdir = asprintf_safe("%s/%s", basetmp, template);
+ assert(tmpdir != NULL);
+ char *tmp = _mktemp(tmpdir);
+ assert(tmp == tmpdir);
+ int ret = _mkdir(tmp);
+ assert(ret == 0);
+ return tmpdir;
+#else
+ char *tmpdir = asprintf_safe("/tmp/%s", template);
+ assert(tmpdir != NULL);
+ char *tmp = mkdtemp(tmpdir);
+ assert(tmp == tmpdir);
+ return tmpdir;
+#endif
+}
+
+char *
test_get_path(const char *path_rel)
{
- static char path[PATH_MAX];
- const char *srcdir = getenv("srcdir");
+ char *path;
+ const char *srcdir;
- snprintf(path, PATH_MAX - 1,
- "%s/test/data/%s", srcdir ? srcdir : ".",
- path_rel ? path_rel : "");
+ srcdir = getenv("top_srcdir");
+ if (!srcdir)
+ srcdir = ".";
+ if (path_rel[0] == '/')
+ return strdup(path_rel);
+
+ path = asprintf_safe("%s/test/data%s%s", srcdir,
+ path_rel[0] ? "/" : "", path_rel);
+ if (!path) {
+ fprintf(stderr, "Failed to allocate path for %s\n", path_rel);
+ return NULL;
+ }
return path;
}
test_read_file(const char *path_rel)
{
struct stat info;
- char *ret, *tmp;
+ char *ret, *tmp, *path;
int fd, count, remaining;
- fd = open(test_get_path(path_rel), O_RDONLY);
+ path = test_get_path(path_rel);
+ if (!path)
+ return NULL;
+
+ fd = open(path, O_RDONLY);
+ free(path);
if (fd < 0)
return NULL;
{
enum xkb_context_flags ctx_flags;
struct xkb_context *ctx;
+ char *path;
ctx_flags = XKB_CONTEXT_NO_DEFAULT_INCLUDES;
if (test_flags & CONTEXT_ALLOW_ENVIRONMENT_NAMES) {
if (!ctx)
return NULL;
- xkb_context_include_path_append(ctx, test_get_path(""));
+ path = test_get_path("");
+ if (!path) {
+ xkb_context_unref(ctx);
+ return NULL;
+ }
+
+ xkb_context_include_path_append(ctx, path);
+ free(path);
return ctx;
}
{
struct xkb_keymap *keymap;
FILE *file;
- const char *path = test_get_path(path_rel);
+ char *path;
+
+ path = test_get_path(path_rel);
+ if (!path)
+ return NULL;
- file = fopen(path, "r");
+ file = fopen(path, "rb");
if (!file) {
fprintf(stderr, "Failed to open path: %s\n", path);
+ free(path);
return NULL;
}
assert(file != NULL);
if (!keymap) {
fprintf(stderr, "Failed to compile path: %s\n", path);
+ free(path);
return NULL;
}
fprintf(stderr, "Successfully compiled path: %s\n", path);
+ free(path);
return keymap;
}