static int test_query(void) { x11display_t x11disp; // TEST isextxrandr_x11display x11disp.xrandr.isSupported = true ; TEST(true == isextxrandr_x11display(&x11disp)) ; x11disp.xrandr.isSupported = false ; TEST(false == isextxrandr_x11display(&x11disp)) ; // TEST isfree_x11display memset(&x11disp, 255, sizeof(x11disp)); TEST(0 == isfree_x11display(&x11disp)); x11disp.idmap = 0; TEST(0 == isfree_x11display(&x11disp)); x11disp.sys_display = 0; TEST(1 == isfree_x11display(&x11disp)); // TEST sysdisplay_x11display for (uintptr_t i = 15; i <= 15; --i) { x11disp.sys_display = (void*)i; TEST((struct sys_display_t*)i == sysdisplay_x11display(&x11disp)); } // TEST io_x11display TEST(0 == init_x11display(&x11disp, ":0.0")); TEST(0 == isfree_x11display(&x11disp)); TEST(0 < io_x11display(&x11disp)); int fd = io_x11display(&x11disp); TEST(0 == free_x11display(&x11disp)); TEST(1 == isfree_x11display(&x11disp)); // TEST io_x11display: same fd TEST(0 == init_x11display(&x11disp, ":0.0")); TEST(fd == io_x11display(&x11disp)); TEST(0 == free_x11display(&x11disp)); // TEST errorstring_x11display: last char is set to 0 char errstr[100] ; char errstr2[100] ; memset(errstr, 1, sizeof(errstr)) ; memset(errstr2, 1, sizeof(errstr2)) ; TEST(0 == init_x11display(&x11disp, ":0.0")) ; TEST(sizeof(errstr) == strnlen(errstr, sizeof(errstr))) ; errorstring_x11display(&x11disp, 1, errstr, sizeof(errstr)) ; uint8_t errlen = (uint8_t) strnlen(errstr, sizeof(errstr)) ; TEST(2 < errlen) ; TEST(sizeof(errstr) > errlen) ; errorstring_x11display(&x11disp, 1, errstr2, errlen) ; TEST(0 == strncmp(errstr, errstr2, (uint8_t)(errlen-2))) ; TEST(0 != errstr[errlen-1]) ; TEST(0 == errstr2[errlen-1]) ; memset(errstr, 1, sizeof(errstr)) ; TEST(0 == memcmp(errstr, errstr2 + errlen, sizeof(errstr2)-errlen)) ; TEST(0 == free_x11display(&x11disp)) ; return 0 ; ONERR: return EINVAL ; }
/* function: childprocess_environment * Execute this test in child to make changing environment safe. * XOpenDisplay has memory leak in case server does not exist. */ static int childprocess_environment(void * dummy) { (void) dummy; x11display_t x11disp = x11display_FREE; // TEST init_x11display: ECONNREFUSED TEST(ECONNREFUSED == init_x11display(&x11disp, ":9999.0")) ; TEST(0 == x11disp.sys_display) ; // TEST init_x11display: getenv("DISPLAY") if (!getenv("DISPLAY")) { TEST(0 == setenv("DISPLAY", ":0", 1)) ; } TEST(0 == init_x11display(&x11disp, 0 /*use value of getenv("DISPLAY")*/)) ; TEST(0 == free_x11display(&x11disp)) ; // TEST init_x11display: EINVAL / DISPLAY not set TEST(0 == unsetenv("DISPLAY")) ; TEST(0 == getenv("DISPLAY")) ; TEST(EINVAL == init_x11display(&x11disp, 0/*use value of getenv("DISPLAY") => EINVAL*/)) ; TEST(0 == x11disp.sys_display) ; return 0 ; ONERR: TEST(0 == free_x11display(&x11disp)) ; return EINVAL ; }
static int childprocess_unittest(void) { x11display_t x11disp = x11display_FREE ; x11screen_t x11screen = x11screen_FREE ; resourceusage_t usage = resourceusage_FREE ; // prepare TEST(0 == init_x11display(&x11disp, ":0")) ; x11screen = defaultscreen_x11display(&x11disp) ; if (test_iterator(&x11screen)) goto ONERR; if (test_initfree(&x11screen)) goto ONERR; if (test_setvideomode(&x11screen)) goto ONERR; // has memory leak TEST(0 == init_resourceusage(&usage)) ; if (test_iterator(&x11screen)) goto ONERR; if (test_initfree(&x11screen)) goto ONERR; TEST(0 == same_resourceusage(&usage)) ; TEST(0 == free_resourceusage(&usage)) ; // unprepare TEST(0 == free_x11display(&x11disp)) ; return 0 ; ONERR: (void) free_resourceusage(&usage) ; (void) free_x11display(&x11disp) ; return EINVAL ; }
static int childprocess_unittest(void) { x11display_t x11disp1 = x11display_FREE ; x11display_t x11disp2 = x11display_FREE ; resourceusage_t usage = resourceusage_FREE ; // XQueryExtension keeps file descriptors and memory // without it no resource leak ! TEST(0 == init_resourceusage(&usage)) ; TEST(0 == init2_x11display(&x11disp1, ":0", false)) ; TEST(0 == free_x11display(&x11disp1)) ; TEST(0 == same_resourceusage(&usage)) ; TEST(0 == free_resourceusage(&usage)) ; TEST(0 == init_resourceusage(&usage)) ; if (test_initfree_env()) goto ONERR; TEST(0 == same_resourceusage(&usage)) ; TEST(0 == free_resourceusage(&usage)) ; if (test_initfree()) goto ONERR; TEST(0 == init_x11display(&x11disp1, ":0")) ; TEST(0 == init_x11display(&x11disp2, ":0")) ; char errstr[100]; errorstring_x11display(&x11disp1, 1, errstr, sizeof(errstr)); TEST(0 == init_resourceusage(&usage)) ; if (test_query()) goto ONERR; if (test_screen(&x11disp1, &x11disp2)) goto ONERR; if (test_extensions(&x11disp1)) goto ONERR; if (test_id_manager(&x11disp1, &x11disp2)) goto ONERR; TEST(0 == same_resourceusage(&usage)) ; TEST(0 == free_resourceusage(&usage)) ; TEST(0 == free_x11display(&x11disp1)) ; TEST(0 == free_x11display(&x11disp2)) ; return 0 ; ONERR: (void) free_x11display(&x11disp1); (void) free_x11display(&x11disp2); (void) free_resourceusage(&usage); return EINVAL ; }
static int test_initfree(void) { x11display_t x11disp = x11display_FREE ; x11display_t x11disp4 = x11display_FREE ; pid_t child = 1 ; // TEST x11display_FREE TEST(x11disp.idmap == 0) ; TEST(x11disp.sys_display == 0) ; TEST(x11disp.atoms.WM_PROTOCOLS == 0) ; TEST(x11disp.atoms.WM_DELETE_WINDOW == 0) ; TEST(x11disp.atoms._NET_FRAME_EXTENTS == 0) ; TEST(x11disp.atoms._NET_WM_WINDOW_OPACITY == 0) ; // TEST init2_x11display, free_x11display for (int isExtension = 0; isExtension <= 1; ++isExtension) { TEST(0 == init2_x11display(&x11disp, ":0.0", (isExtension != 0))) ; TEST(x11disp.idmap != 0) ; TEST(x11disp.sys_display != 0) ; TEST(x11disp.atoms.WM_PROTOCOLS == XInternAtom(x11disp.sys_display, "WM_PROTOCOLS", False)) ; TEST(x11disp.atoms.WM_DELETE_WINDOW == XInternAtom(x11disp.sys_display, "WM_DELETE_WINDOW", False)) ; TEST(x11disp.atoms._NET_FRAME_EXTENTS == XInternAtom(x11disp.sys_display, "_NET_FRAME_EXTENTS", False)) ; TEST(x11disp.atoms._NET_WM_WINDOW_OPACITY == XInternAtom(x11disp.sys_display, "_NET_WM_WINDOW_OPACITY", False)) ; TEST(0 < io_x11display(&x11disp)) ; TEST(0 == free_x11display(&x11disp)) ; TEST(0 == x11disp.idmap) ; TEST(0 == x11disp.sys_display) ; TEST(0 == free_x11display(&x11disp)) ; TEST(0 == x11disp.idmap) ; TEST(0 == x11disp.sys_display) ; } // TEST init_x11display, free_x11display TEST(0 == init_x11display(&x11disp, ":0.0")) ; TEST(x11disp.idmap != 0) ; TEST(x11disp.sys_display != 0) ; TEST(x11disp.atoms.WM_PROTOCOLS == XInternAtom(x11disp.sys_display, "WM_PROTOCOLS", False)) ; TEST(x11disp.atoms.WM_DELETE_WINDOW == XInternAtom(x11disp.sys_display, "WM_DELETE_WINDOW", False)) ; TEST(x11disp.atoms._NET_FRAME_EXTENTS == XInternAtom(x11disp.sys_display, "_NET_FRAME_EXTENTS", False)) ; TEST(x11disp.atoms._NET_WM_WINDOW_OPACITY == XInternAtom(x11disp.sys_display, "_NET_WM_WINDOW_OPACITY", False)) ; TEST(0 < io_x11display(&x11disp)) ; TEST(0 == free_x11display(&x11disp)) ; TEST(0 == x11disp.idmap) ; TEST(0 == x11disp.sys_display) ; TEST(0 == free_x11display(&x11disp)) ; TEST(0 == x11disp.idmap) ; TEST(0 == x11disp.sys_display) ; // TEST init_x11display: 2 different connections TEST(0 == init_x11display(&x11disp, ":0.0")) ; TEST(x11disp.idmap != 0) ; TEST(x11disp.sys_display != 0) ; TEST(x11disp.atoms.WM_PROTOCOLS == XInternAtom(x11disp.sys_display, "WM_PROTOCOLS", False)) ; TEST(x11disp.atoms.WM_DELETE_WINDOW == XInternAtom(x11disp.sys_display, "WM_DELETE_WINDOW", False)) ; TEST(x11disp.atoms._NET_FRAME_EXTENTS == XInternAtom(x11disp.sys_display, "_NET_FRAME_EXTENTS", False)) ; TEST(x11disp.atoms._NET_WM_WINDOW_OPACITY == XInternAtom(x11disp.sys_display, "_NET_WM_WINDOW_OPACITY", False)) ; TEST(0 < io_x11display(&x11disp)) ; TEST(0 == init_x11display(&x11disp4, ":0.0")) ; // creates new connection TEST(x11disp4.idmap != 0) ; TEST(x11disp4.sys_display != 0) ; TEST(x11disp4.sys_display != x11disp.sys_display) ; TEST(x11disp4.atoms.WM_PROTOCOLS == XInternAtom(x11disp.sys_display, "WM_PROTOCOLS", False)) ; TEST(x11disp4.atoms.WM_DELETE_WINDOW == XInternAtom(x11disp.sys_display, "WM_DELETE_WINDOW", False)) ; TEST(x11disp4.atoms._NET_FRAME_EXTENTS == XInternAtom(x11disp.sys_display, "_NET_FRAME_EXTENTS", False)) ; TEST(x11disp4.atoms._NET_WM_WINDOW_OPACITY == XInternAtom(x11disp.sys_display, "_NET_WM_WINDOW_OPACITY", False)) ; TEST(io_x11display(&x11disp4) > 0) ; TEST(io_x11display(&x11disp4) != io_x11display(&x11disp)) ; TEST(0 == free_x11display(&x11disp4)) ; TEST(0 == x11disp4.idmap) ; TEST(0 == x11disp4.sys_display) ; TEST(0 == free_x11display(&x11disp)) ; TEST(0 == x11disp.idmap) ; TEST(0 == x11disp.sys_display) ; return 0 ; ONERR: if (!child) exit(1) ; (void) free_x11display(&x11disp) ; (void) free_x11display(&x11disp4) ; return EINVAL ; }