Exemplo n.º 1
0
static int test_extensions(x11display_t * x11disp)
{
   x11display_t x11disp_noext = x11display_FREE;

   // prepare
   TEST(0 == init2_x11display(&x11disp_noext, ":0", false));

   // TEST xrandr available / version
   TEST(1 == x11disp->xdbe.isSupported) ;
   TEST(1 <= x11disp->xdbe.version_major) ;
   TEST(0 == x11disp_noext.xdbe.isSupported) ;

   // TEST xrandr available / version
   TEST(1 == x11disp->xrandr.isSupported) ;
   TEST(1 <= x11disp->xrandr.version_major) ;
   TEST(0 == x11disp_noext.xrandr.isSupported) ;

   // TEST xcomposite available / version
   TEST(1 == x11disp->xrender.isSupported) ;
   TEST(1 <= x11disp->xrender.version_major || x11disp->xrender.version_minor > 2) ;
   TEST(0 == x11disp_noext.xrender.isSupported) ;

   // unprepare
   TEST(0 == free_x11display(&x11disp_noext));

   return 0 ;
ONERR:
   free_x11display(&x11disp_noext);
   return EINVAL ;
}
Exemplo n.º 2
0
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 ;
}
Exemplo n.º 3
0
/* 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 ;
}
Exemplo n.º 4
0
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 ;
}
Exemplo n.º 5
0
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 ;
}
Exemplo n.º 6
0
static int initprivate_x11display(/*out*/x11display_t * x11disp, const char * display_server_name, bool isInitExtension)
{
   int  err ;
   x11display_t   newdisp = x11display_FREE;
   memblock_t     mblock;

   if (!display_server_name) {
      display_server_name = getenv("DISPLAY") ;
      if (!display_server_name) {
         err = EINVAL;
         TRACE_NOARG_ERRLOG(log_flags_NONE, X11_DISPLAY_NOT_SET);
         goto ONERR;
      }
   }

   // create new x11_display

   err = ALLOC_MM(sizeof(x11windowmap_t), &mblock);
   if (err) goto ONERR;

   newdisp.idmap       = (x11windowmap_t*) mblock.addr;
   memset(newdisp.idmap->entries, 0, sizeof(newdisp.idmap->entries));
   newdisp.sys_display = XOpenDisplay(display_server_name);
   if (!newdisp.sys_display) {
      err = ECONNREFUSED;
      TRACE_ERRLOG(log_flags_NONE, X11_NO_CONNECTION, display_server_name);
      goto ONERR;
   }

#define SETATOM(NAME)   newdisp.atoms.NAME = XInternAtom(newdisp.sys_display, #NAME, False); \
                        static_assert(sizeof(newdisp.atoms.NAME) == sizeof(uint32_t), "same type")
   SETATOM(WM_PROTOCOLS);
   SETATOM(WM_DELETE_WINDOW);
   SETATOM(_NET_FRAME_EXTENTS);
   SETATOM(_NET_WM_WINDOW_OPACITY);
#undef  SETATOM

   if (isInitExtension) {
      err = queryextensions_x11display(&newdisp);
      if (err) goto ONERR;
   }

   *x11disp = newdisp;

   return 0;
ONERR:
   free_x11display(&newdisp);
   TRACEEXIT_ERRLOG(err);
   return err;
}
Exemplo n.º 7
0
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 ;
}