2012-11-16 02:03:31 +04:00
/***
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/>.
* * */
2013-03-29 04:17:24 +04:00
# include <errno.h>
2014-01-28 16:47:35 +04:00
# include <fcntl.h>
2015-11-17 00:09:36 +03:00
# include <locale.h>
# include <unistd.h>
2012-11-16 02:03:31 +04:00
2015-10-24 23:58:24 +03:00
# include "sd-messages.h"
2015-10-27 05:01:06 +03:00
# include "alloc-util.h"
2015-10-25 15:14:12 +03:00
# include "catalog.h"
# include "fd-util.h"
2015-10-26 20:05:03 +03:00
# include "fileio.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
} ;
2015-11-08 14:51:51 +03:00
static Hashmap * test_import ( const char * contents , ssize_t size , int code ) {
2013-03-29 04:17:24 +04:00
int r ;
char name [ ] = " /tmp/test-catalog.XXXXXX " ;
2014-01-28 16:47:35 +04:00
_cleanup_close_ int fd ;
2015-11-08 14:51:51 +03:00
Hashmap * h ;
if ( size < 0 )
size = strlen ( contents ) ;
assert_se ( h = hashmap_new ( & catalog_hash_ops ) ) ;
2014-01-28 16:47:35 +04:00
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 ) ;
2015-11-08 13:20:01 +03:00
r = catalog_import_file ( h , name ) ;
2014-11-30 04:16:19 +03:00
assert_se ( r = = code ) ;
2013-03-29 04:17:24 +04:00
unlink ( name ) ;
2015-11-08 14:51:51 +03:00
return h ;
}
2013-03-29 04:17:24 +04:00
2015-11-08 14:51:51 +03:00
static void test_catalog_import_invalid ( void ) {
_cleanup_hashmap_free_free_free_ Hashmap * h = NULL ;
2013-03-29 04:17:24 +04:00
2015-11-08 14:51:51 +03:00
h = test_import ( " xxx " , - 1 , - EINVAL ) ;
2014-11-30 04:16:19 +03:00
assert_se ( hashmap_isempty ( h ) ) ;
2015-11-08 14:51:51 +03:00
}
2013-03-29 04:17:24 +04:00
2015-11-08 14:51:51 +03:00
static void test_catalog_import_badid ( void ) {
_cleanup_hashmap_free_free_free_ Hashmap * h = NULL ;
const char * input =
2013-03-29 04:17:24 +04:00
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededede \n " \
" Subject: message \n " \
" \n " \
2015-11-08 14:51:51 +03:00
" payload \n " ;
h = test_import ( input , - 1 , - EINVAL ) ;
}
2013-03-29 04:17:24 +04:00
2015-11-08 14:51:51 +03:00
static void test_catalog_import_one ( void ) {
_cleanup_hashmap_free_free_free_ Hashmap * h = NULL ;
char * payload ;
Iterator j ;
2013-03-29 04:17:24 +04:00
2015-11-08 14:51:51 +03:00
const char * input =
2013-03-29 04:17:24 +04:00
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededed \n " \
" Subject: message \n " \
" \n " \
2015-11-08 14:51:51 +03:00
" payload \n " ;
const char * expect =
" Subject: message \n " \
" \n " \
" payload \n " ;
2013-03-29 04:17:24 +04:00
2015-11-08 14:51:51 +03:00
h = test_import ( input , - 1 , 0 ) ;
2014-11-30 04:16:19 +03:00
assert_se ( hashmap_size ( h ) = = 1 ) ;
2012-11-16 02:03:31 +04:00
2015-11-08 14:51:51 +03:00
HASHMAP_FOREACH ( payload , h , j ) {
2016-02-19 01:37:17 +03:00
printf ( " expect: %s \n " , expect ) ;
printf ( " actual: %s \n " , payload ) ;
2015-11-08 14:51:51 +03:00
assert_se ( streq ( expect , payload ) ) ;
}
2013-03-29 04:17:24 +04:00
}
2015-11-08 15:18:07 +03:00
static void test_catalog_import_merge ( void ) {
_cleanup_hashmap_free_free_free_ Hashmap * h = NULL ;
char * payload ;
Iterator j ;
const char * input =
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededed \n " \
" Subject: message \n " \
" Defined-By: me \n " \
" \n " \
" payload \n " \
" \n " \
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededed \n " \
" Subject: override subject \n " \
" X-Header: hello \n " \
" \n " \
" override payload \n " ;
const char * combined =
" Subject: override subject \n " \
" X-Header: hello \n " \
" Subject: message \n " \
" Defined-By: me \n " \
" \n " \
" override payload \n " ;
h = test_import ( input , - 1 , 0 ) ;
assert_se ( hashmap_size ( h ) = = 1 ) ;
HASHMAP_FOREACH ( payload , h , j ) {
assert_se ( streq ( combined , payload ) ) ;
}
}
static void test_catalog_import_merge_no_body ( void ) {
_cleanup_hashmap_free_free_free_ Hashmap * h = NULL ;
char * payload ;
Iterator j ;
const char * input =
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededed \n " \
" Subject: message \n " \
" Defined-By: me \n " \
" \n " \
" payload \n " \
" \n " \
" -- 0027229ca0644181a76c4e92458afaff dededededededededededededededed \n " \
" Subject: override subject \n " \
" X-Header: hello \n " \
" \n " ;
const char * combined =
" Subject: override subject \n " \
" X-Header: hello \n " \
" Subject: message \n " \
" Defined-By: me \n " \
" \n " \
" payload \n " ;
h = test_import ( input , - 1 , 0 ) ;
assert_se ( hashmap_size ( h ) = = 1 ) ;
HASHMAP_FOREACH ( payload , h , j ) {
assert_se ( streq ( combined , payload ) ) ;
}
}
2013-03-29 04:17:24 +04:00
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 ( ) ;
2015-11-08 14:51:51 +03:00
test_catalog_import_invalid ( ) ;
test_catalog_import_badid ( ) ;
test_catalog_import_one ( ) ;
2015-11-08 15:18:07 +03:00
test_catalog_import_merge ( ) ;
test_catalog_import_merge_no_body ( ) ;
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 ;
}