2012-11-16 02:03:31 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2012 Lennart Poettering
2013-03-29 04:17:24 +04:00
Copyright 2013 Zbigniew Jędrzejewski - Szmek
2012-11-16 02:03:31 +04:00
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/>.
* * */
# include <locale.h>
2013-03-29 04:17:24 +04:00
# include <unistd.h>
# include <errno.h>
2014-01-28 16:47:35 +04:00
# include <fcntl.h>
2012-11-16 02:03:31 +04:00
2015-10-24 23:58:24 +03:00
# include "sd-messages.h"
2015-10-25 15:14:12 +03:00
# include "catalog.h"
# include "fd-util.h"
2012-11-16 02:03:31 +04:00
# include "log.h"
2013-03-29 04:17:24 +04:00
# include "macro.h"
2015-10-24 23:58:24 +03:00
# include "string-util.h"
2015-10-25 15:14:12 +03:00
# include "util.h"
2012-11-16 02:03:31 +04:00
2013-07-18 10:30:06 +04:00
static const char * catalog_dirs [ ] = {
CATALOG_DIR ,
NULL ,
} ;
static const char * no_catalog_dirs [ ] = {
" /bin/hopefully/with/no/catalog " ,
NULL
} ;
2013-03-29 04:17:24 +04:00
static void test_import ( Hashmap * h , struct strbuf * sb ,
const char * contents , ssize_t size , int code ) {
int r ;
char name [ ] = " /tmp/test-catalog.XXXXXX " ;
2014-01-28 16:47:35 +04:00
_cleanup_close_ int fd ;
fd = mkostemp_safe ( name , O_RDWR | O_CLOEXEC ) ;
2014-11-30 04:16:19 +03:00
assert_se ( fd > = 0 ) ;
2013-03-29 04:17:24 +04:00
assert_se ( write ( fd , contents , size ) = = size ) ;
r = catalog_import_file ( h , sb , name ) ;
2014-11-30 04:16:19 +03:00
assert_se ( r = = code ) ;
2013-03-29 04:17:24 +04:00
unlink ( name ) ;
}
static void test_catalog_importing ( void ) {
Hashmap * h ;
struct strbuf * sb ;
2014-08-13 03:00:18 +04:00
assert_se ( h = hashmap_new ( & catalog_hash_ops ) ) ;
2013-03-29 04:17:24 +04:00
assert_se ( sb = strbuf_new ( ) ) ;
# define BUF "xxx"
test_import ( h , sb , BUF , sizeof ( BUF ) , - EINVAL ) ;
# undef BUF
2014-11-30 04:16:19 +03:00
assert_se ( hashmap_isempty ( h ) ) ;
2013-03-29 04:17:24 +04:00
log_debug ( " ---------------------------------------- " ) ;
# define BUF \
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededede \n " \
" Subject: message \n " \
" \n " \
" payload \n "
test_import ( h , sb , BUF , sizeof ( BUF ) , - EINVAL ) ;
# undef BUF
log_debug ( " ---------------------------------------- " ) ;
# define BUF \
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededed \n " \
" Subject: message \n " \
" \n " \
" payload \n "
test_import ( h , sb , BUF , sizeof ( BUF ) , 0 ) ;
# undef BUF
2014-11-30 04:16:19 +03:00
assert_se ( hashmap_size ( h ) = = 1 ) ;
2012-11-16 02:03:31 +04:00
2013-03-29 04:17:24 +04:00
log_debug ( " ---------------------------------------- " ) ;
hashmap_free_free ( h ) ;
strbuf_cleanup ( sb ) ;
}
static const char * database = NULL ;
static void test_catalog_update ( void ) {
2014-01-28 16:47:35 +04:00
static char name [ ] = " /tmp/test-catalog.XXXXXX " ;
2013-03-29 04:17:24 +04:00
int r ;
2014-01-28 16:47:35 +04:00
r = mkostemp_safe ( name , O_RDWR | O_CLOEXEC ) ;
2014-11-30 04:16:19 +03:00
assert_se ( r > = 0 ) ;
2013-03-29 04:17:24 +04:00
database = name ;
/* Test what happens if there are no files. */
r = catalog_update ( database , NULL , NULL ) ;
2014-11-30 04:16:19 +03:00
assert_se ( r > = 0 ) ;
2013-03-29 04:17:24 +04:00
2013-07-18 10:30:06 +04:00
/* Test what happens if there are no files in the directory. */
r = catalog_update ( database , NULL , no_catalog_dirs ) ;
2014-11-30 04:16:19 +03:00
assert_se ( r > = 0 ) ;
2013-07-18 10:30:06 +04:00
/* Make sure that we at least have some files loaded or the
catalog_list below will fail . */
r = catalog_update ( database , NULL , catalog_dirs ) ;
2014-11-30 04:16:19 +03:00
assert_se ( r > = 0 ) ;
2013-03-29 04:17:24 +04:00
}
2013-12-03 06:35:31 +04:00
static void test_catalog_file_lang ( void ) {
2013-12-16 06:07:47 +04:00
_cleanup_free_ char * lang = NULL , * lang2 = NULL , * lang3 = NULL , * lang4 = NULL ;
2013-12-03 06:35:31 +04:00
assert_se ( catalog_file_lang ( " systemd.de_DE.catalog " , & lang ) = = 1 ) ;
assert_se ( streq ( lang , " de_DE " ) ) ;
assert_se ( catalog_file_lang ( " systemd..catalog " , & lang2 ) = = 0 ) ;
assert_se ( lang2 = = NULL ) ;
assert_se ( catalog_file_lang ( " systemd.fr.catalog " , & lang2 ) = = 1 ) ;
assert_se ( streq ( lang2 , " fr " ) ) ;
assert_se ( catalog_file_lang ( " systemd.fr.catalog.gz " , & lang3 ) = = 0 ) ;
assert_se ( lang3 = = NULL ) ;
assert_se ( catalog_file_lang ( " systemd.01234567890123456789012345678901.catalog " , & lang3 ) = = 0 ) ;
assert_se ( lang3 = = NULL ) ;
assert_se ( catalog_file_lang ( " systemd.0123456789012345678901234567890.catalog " , & lang3 ) = = 1 ) ;
assert_se ( streq ( lang3 , " 0123456789012345678901234567890 " ) ) ;
2013-12-16 06:07:47 +04:00
assert_se ( catalog_file_lang ( " /x/y/systemd.catalog " , & lang4 ) = = 0 ) ;
assert_se ( lang4 = = NULL ) ;
assert_se ( catalog_file_lang ( " /x/y/systemd.ru_RU.catalog " , & lang4 ) = = 1 ) ;
assert_se ( streq ( lang4 , " ru_RU " ) ) ;
2013-12-03 06:35:31 +04:00
}
2013-03-29 04:17:24 +04:00
int main ( int argc , char * argv [ ] ) {
2012-11-16 02:03:31 +04:00
_cleanup_free_ char * text = NULL ;
2013-03-29 04:17:24 +04:00
int r ;
2012-11-16 02:03:31 +04:00
setlocale ( LC_ALL , " de_DE.UTF-8 " ) ;
2014-04-11 16:44:55 +04:00
log_parse_environment ( ) ;
log_open ( ) ;
2012-11-16 02:03:31 +04:00
2013-12-16 06:07:47 +04:00
test_catalog_file_lang ( ) ;
2013-03-29 04:17:24 +04:00
test_catalog_importing ( ) ;
2012-11-16 02:03:31 +04:00
2013-03-29 04:17:24 +04:00
test_catalog_update ( ) ;
2013-03-20 04:54:04 +04:00
2013-03-29 04:17:24 +04:00
r = catalog_list ( stdout , database , true ) ;
assert_se ( r > = 0 ) ;
2012-11-16 02:03:31 +04:00
2013-03-29 04:17:24 +04:00
r = catalog_list ( stdout , database , false ) ;
assert_se ( r > = 0 ) ;
2012-11-16 02:03:31 +04:00
2013-03-29 04:17:24 +04:00
assert_se ( catalog_get ( database , SD_MESSAGE_COREDUMP , & text ) > = 0 ) ;
2012-11-16 02:03:31 +04:00
printf ( " >>>%s<<< \n " , text ) ;
2013-03-29 04:17:24 +04:00
if ( database )
unlink ( database ) ;
2012-11-16 02:03:31 +04:00
return 0 ;
}