2013-04-15 16:05:00 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2013 Zbigniew Jędrzejewski - Szmek
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2013-01-18 10:13:27 +04:00
# include <assert.h>
# include "util.h"
# include "cgroup-util.h"
2013-04-16 06:36:06 +04:00
static void check_p_d_u ( const char * path , int code , const char * result ) {
2013-04-15 16:05:00 +04:00
_cleanup_free_ char * unit = NULL ;
2013-01-18 10:13:27 +04:00
2013-04-16 06:36:06 +04:00
assert_se ( cg_path_decode_unit ( path , & unit ) = = code ) ;
2013-04-15 16:05:00 +04:00
assert_se ( streq_ptr ( unit , result ) ) ;
}
2013-01-18 10:13:27 +04:00
2013-04-16 06:36:06 +04:00
static void test_path_decode_unit ( void ) {
check_p_d_u ( " getty@.service/tty2 " , 0 , " getty@tty2.service " ) ;
check_p_d_u ( " getty@.service/tty2/xxx " , 0 , " getty@tty2.service " ) ;
check_p_d_u ( " getty@.service/ " , - EINVAL , NULL ) ;
check_p_d_u ( " getty@.service " , - EINVAL , NULL ) ;
check_p_d_u ( " getty.service " , 0 , " getty.service " ) ;
check_p_d_u ( " getty " , - EINVAL , NULL ) ;
2013-04-15 16:05:00 +04:00
}
static void check_p_g_u ( const char * path , int code , const char * result ) {
_cleanup_free_ char * unit = NULL ;
assert_se ( cg_path_get_unit ( path , & unit ) = = code ) ;
assert_se ( streq_ptr ( unit , result ) ) ;
}
static void check_p_g_u_u ( const char * path , int code , const char * result ) {
_cleanup_free_ char * unit = NULL ;
assert_se ( cg_path_get_user_unit ( path , & unit ) = = code ) ;
assert_se ( streq_ptr ( unit , result ) ) ;
}
static void test_path_get_unit ( void ) {
check_p_g_u ( " /system/foobar.service/sdfdsaf " , 0 , " foobar.service " ) ;
check_p_g_u ( " /system/getty@.service/tty5 " , 0 , " getty@tty5.service " ) ;
check_p_g_u ( " /system/getty@.service/tty5/aaa/bbb " , 0 , " getty@tty5.service " ) ;
check_p_g_u ( " /system/getty@.service/tty5/ " , 0 , " getty@tty5.service " ) ;
check_p_g_u ( " /system/getty@tty6.service/tty5 " , 0 , " getty@tty6.service " ) ;
check_p_g_u ( " sadfdsafsda " , - ENOENT , NULL ) ;
check_p_g_u ( " /system/getty####@tty6.service/tty5 " , - EINVAL , NULL ) ;
2013-04-16 06:36:06 +04:00
}
2013-04-15 16:05:00 +04:00
2013-04-16 06:36:06 +04:00
static void test_path_get_user_unit ( void ) {
2013-04-15 16:05:00 +04:00
check_p_g_u_u ( " /user/lennart/2/systemd-21548/foobar.service " , 0 , " foobar.service " ) ;
check_p_g_u_u ( " /user/lennart/2/systemd-21548/foobar.service/waldo " , 0 , " foobar.service " ) ;
check_p_g_u_u ( " /user/lennart/2/systemd-21548/foobar.service/waldo/uuuux " , 0 , " foobar.service " ) ;
check_p_g_u_u ( " /user/lennart/2/systemd-21548/waldo/waldo/uuuux " , - EINVAL , NULL ) ;
check_p_g_u_u ( " /user/lennart/2/foobar.service " , - ENOENT , NULL ) ;
check_p_g_u_u ( " /user/lennart/2/systemd-21548/foobar@.service/pie/pa/po " , 0 , " foobar@pie.service " ) ;
2013-01-18 10:13:27 +04:00
}
2013-04-16 06:36:06 +04:00
static void test_get_paths ( void ) {
_cleanup_free_ char * a = NULL , * b = NULL , * c = NULL , * d = NULL ;
assert_se ( cg_get_root_path ( & a ) > = 0 ) ;
log_info ( " Root = %s " , a ) ;
assert_se ( cg_get_system_path ( & b ) > = 0 ) ;
log_info ( " System = %s " , b ) ;
assert_se ( cg_get_user_path ( & c ) > = 0 ) ;
log_info ( " User = %s " , c ) ;
assert_se ( cg_get_machine_path ( & d ) > = 0 ) ;
log_info ( " Machine = %s " , d ) ;
}
2013-04-23 00:26:06 +04:00
static void test_proc ( void ) {
_cleanup_closedir_ DIR * d = NULL ;
struct dirent * de ;
int r ;
d = opendir ( " /proc " ) ;
assert_se ( d ) ;
FOREACH_DIRENT ( de , d , break ) {
_cleanup_free_ char * path = NULL , * path_shifted = NULL , * session = NULL , * unit = NULL , * user_unit = NULL , * machine = NULL , * prefix = NULL ;
pid_t pid ;
if ( de - > d_type ! = DT_DIR & &
de - > d_type ! = DT_UNKNOWN )
continue ;
r = parse_pid ( de - > d_name , & pid ) ;
if ( r < 0 )
continue ;
cg_pid_get_path ( SYSTEMD_CGROUP_CONTROLLER , pid , & path ) ;
cg_pid_get_path_shifted ( pid , & prefix , & path_shifted ) ;
cg_pid_get_session ( pid , & session ) ;
cg_pid_get_unit ( pid , & unit ) ;
cg_pid_get_user_unit ( pid , & user_unit ) ;
cg_pid_get_machine_name ( pid , & machine ) ;
printf ( " %lu \t %s \t %s \t %s \t %s \t %s \t %s \t %s \n " ,
( unsigned long ) pid ,
path ,
prefix ,
path_shifted ,
session ,
unit ,
user_unit ,
machine ) ;
}
}
2013-01-18 10:13:27 +04:00
int main ( void ) {
2013-04-16 06:36:06 +04:00
test_path_decode_unit ( ) ;
2013-04-15 16:05:00 +04:00
test_path_get_unit ( ) ;
2013-04-16 06:36:06 +04:00
test_path_get_user_unit ( ) ;
test_get_paths ( ) ;
2013-04-23 00:26:06 +04:00
test_proc ( ) ;
2013-01-18 10:13:27 +04:00
return 0 ;
}