2013-07-18 13:54:21 +04:00
/*
2014-03-17 13:38:38 +04:00
* Copyright ( C ) 2013 , 2014 Red Hat , Inc .
2013-07-18 13:54:21 +04:00
*
* This library 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 .
*
* This library 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 this library . If not , see
* < http : //www.gnu.org/licenses/>.
*/
# include <config.h>
# include "testutils.h"
2014-05-21 01:04:44 +04:00
# if defined(WITH_DBUS) && defined(__linux__)
2013-09-17 21:11:25 +04:00
2014-03-12 16:20:07 +04:00
# include <dbus / dbus.h>
2019-07-12 19:55:13 +03:00
# include <fcntl.h>
2020-02-17 00:59:28 +03:00
# include <unistd.h>
2013-09-17 21:11:25 +04:00
2018-12-13 17:53:50 +03:00
# define LIBVIRT_VIRSYSTEMDPRIV_H_ALLOW
2016-06-24 18:41:09 +03:00
# include "virsystemdpriv.h"
2013-09-17 21:11:25 +04:00
# include "virsystemd.h"
2016-02-11 13:14:11 +03:00
# include "virdbus.h"
2013-09-17 21:11:25 +04:00
# include "virlog.h"
2014-03-12 16:20:07 +04:00
# include "virmock.h"
2019-06-25 15:03:56 +03:00
# include "rpc / virnetsocket.h"
2020-03-20 20:14:22 +03:00
# include "domain_driver.h"
2013-09-17 21:11:25 +04:00
# define VIR_FROM_THIS VIR_FROM_NONE
2013-07-18 13:54:21 +04:00
2014-02-28 16:16:17 +04:00
VIR_LOG_INIT ( " tests.systemdtest " ) ;
2014-06-03 15:02:52 +04:00
VIR_MOCK_WRAP_RET_ARGS ( dbus_connection_send_with_reply_and_block ,
2014-03-12 16:20:07 +04:00
DBusMessage * ,
DBusConnection * , connection ,
DBusMessage * , message ,
int , timeout_milliseconds ,
DBusError * , error )
{
DBusMessage * reply = NULL ;
const char * service = dbus_message_get_destination ( message ) ;
const char * member = dbus_message_get_member ( message ) ;
2014-06-03 15:02:52 +04:00
VIR_MOCK_REAL_INIT ( dbus_connection_send_with_reply_and_block ) ;
2014-03-12 16:20:07 +04:00
if ( STREQ ( service , " org.freedesktop.machine1 " ) ) {
if ( getenv ( " FAIL_BAD_SERVICE " ) ) {
dbus_set_error_const ( error ,
" org.freedesktop.systemd.badthing " ,
" Something went wrong creating the machine " ) ;
} else {
reply = dbus_message_new ( DBUS_MESSAGE_TYPE_METHOD_RETURN ) ;
2016-02-02 21:45:55 +03:00
if ( STREQ ( member , " GetMachineByPID " ) ) {
const char * object_path = " /org/freedesktop/machine1/machine/qemu_2ddemo " ;
DBusMessageIter iter ;
dbus_message_iter_init_append ( reply , & iter ) ;
if ( ! dbus_message_iter_append_basic ( & iter ,
DBUS_TYPE_OBJECT_PATH ,
& object_path ) )
goto error ;
} else if ( STREQ ( member , " Get " ) ) {
const char * name = " qemu-demo " ;
DBusMessageIter iter ;
DBusMessageIter sub ;
dbus_message_iter_init_append ( reply , & iter ) ;
dbus_message_iter_open_container ( & iter , DBUS_TYPE_VARIANT ,
" s " , & sub ) ;
if ( ! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& name ) )
goto error ;
dbus_message_iter_close_container ( & iter , & sub ) ;
}
2014-03-12 16:20:07 +04:00
}
2014-04-11 11:20:48 +04:00
} else if ( STREQ ( service , " org.freedesktop.login1 " ) ) {
char * supported = getenv ( " RESULT_SUPPORT " ) ;
DBusMessageIter iter ;
reply = dbus_message_new ( DBUS_MESSAGE_TYPE_METHOD_RETURN ) ;
dbus_message_iter_init_append ( reply , & iter ) ;
if ( ! dbus_message_iter_append_basic ( & iter ,
DBUS_TYPE_STRING ,
& supported ) )
goto error ;
2014-03-12 16:20:07 +04:00
} else if ( STREQ ( service , " org.freedesktop.DBus " ) & &
STREQ ( member , " ListActivatableNames " ) ) {
const char * svc1 = " org.foo.bar.wizz " ;
const char * svc2 = " org.freedesktop.machine1 " ;
2014-04-11 11:20:48 +04:00
const char * svc3 = " org.freedesktop.login1 " ;
2014-03-12 16:20:07 +04:00
DBusMessageIter iter ;
DBusMessageIter sub ;
reply = dbus_message_new ( DBUS_MESSAGE_TYPE_METHOD_RETURN ) ;
dbus_message_iter_init_append ( reply , & iter ) ;
dbus_message_iter_open_container ( & iter , DBUS_TYPE_ARRAY ,
" s " , & sub ) ;
if ( ! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& svc1 ) )
goto error ;
if ( ! getenv ( " FAIL_NO_SERVICE " ) & &
! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& svc2 ) )
goto error ;
2014-04-11 11:20:48 +04:00
if ( ! getenv ( " FAIL_NO_SERVICE " ) & &
! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& svc3 ) )
goto error ;
2014-03-12 16:20:07 +04:00
dbus_message_iter_close_container ( & iter , & sub ) ;
} else if ( STREQ ( service , " org.freedesktop.DBus " ) & &
STREQ ( member , " ListNames " ) ) {
const char * svc1 = " org.foo.bar.wizz " ;
const char * svc2 = " org.freedesktop.systemd1 " ;
2014-04-11 11:20:48 +04:00
const char * svc3 = " org.freedesktop.login1 " ;
2014-03-12 16:20:07 +04:00
DBusMessageIter iter ;
DBusMessageIter sub ;
reply = dbus_message_new ( DBUS_MESSAGE_TYPE_METHOD_RETURN ) ;
dbus_message_iter_init_append ( reply , & iter ) ;
dbus_message_iter_open_container ( & iter , DBUS_TYPE_ARRAY ,
" s " , & sub ) ;
if ( ! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& svc1 ) )
goto error ;
if ( ( ! getenv ( " FAIL_NO_SERVICE " ) & & ! getenv ( " FAIL_NOT_REGISTERED " ) ) & &
! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& svc2 ) )
goto error ;
2014-04-11 11:20:48 +04:00
if ( ( ! getenv ( " FAIL_NO_SERVICE " ) & & ! getenv ( " FAIL_NOT_REGISTERED " ) ) & &
! dbus_message_iter_append_basic ( & sub ,
DBUS_TYPE_STRING ,
& svc3 ) )
goto error ;
2014-03-12 16:20:07 +04:00
dbus_message_iter_close_container ( & iter , & sub ) ;
} else {
reply = dbus_message_new ( DBUS_MESSAGE_TYPE_METHOD_RETURN ) ;
}
return reply ;
error :
2016-02-11 13:14:11 +03:00
virDBusMessageUnref ( reply ) ;
2014-03-12 16:20:07 +04:00
return NULL ;
}
2019-10-14 15:45:03 +03:00
static int testCreateContainer ( const void * opaque G_GNUC_UNUSED )
2013-07-18 13:54:21 +04:00
{
unsigned char uuid [ VIR_UUID_BUFLEN ] = {
1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 ,
4 , 4 , 4 , 4
} ;
if ( virSystemdCreateMachine ( " demo " ,
" lxc " ,
uuid ,
" /proc/123/root " ,
123 ,
true ,
2014-11-11 20:38:43 +03:00
0 , NULL ,
2019-05-23 02:12:14 +03:00
" highpriority.slice " , 0 ) < 0 ) {
2013-07-18 13:54:21 +04:00
fprintf ( stderr , " %s " , " Failed to create LXC machine \n " ) ;
return - 1 ;
}
return 0 ;
}
2019-10-14 15:45:03 +03:00
static int testTerminateContainer ( const void * opaque G_GNUC_UNUSED )
2013-09-30 18:46:29 +04:00
{
2016-02-01 18:50:54 +03:00
if ( virSystemdTerminateMachine ( " lxc-demo " ) < 0 ) {
2013-09-30 18:46:29 +04:00
fprintf ( stderr , " %s " , " Failed to terminate LXC machine \n " ) ;
return - 1 ;
}
return 0 ;
}
2019-10-14 15:45:03 +03:00
static int testCreateMachine ( const void * opaque G_GNUC_UNUSED )
2013-07-18 13:54:21 +04:00
{
unsigned char uuid [ VIR_UUID_BUFLEN ] = {
1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 ,
4 , 4 , 4 , 4
} ;
if ( virSystemdCreateMachine ( " demo " ,
" qemu " ,
uuid ,
NULL ,
123 ,
false ,
2014-11-11 20:38:43 +03:00
0 , NULL ,
2019-05-23 02:12:14 +03:00
NULL , 0 ) < 0 ) {
2013-07-18 13:54:21 +04:00
fprintf ( stderr , " %s " , " Failed to create KVM machine \n " ) ;
return - 1 ;
}
return 0 ;
}
2019-10-14 15:45:03 +03:00
static int testTerminateMachine ( const void * opaque G_GNUC_UNUSED )
2013-09-30 18:46:29 +04:00
{
2016-02-01 18:50:54 +03:00
if ( virSystemdTerminateMachine ( " test-qemu-demo " ) < 0 ) {
2013-09-30 18:46:29 +04:00
fprintf ( stderr , " %s " , " Failed to terminate KVM machine \n " ) ;
return - 1 ;
}
return 0 ;
}
2019-10-14 15:45:03 +03:00
static int testCreateNoSystemd ( const void * opaque G_GNUC_UNUSED )
2013-07-18 13:54:21 +04:00
{
unsigned char uuid [ VIR_UUID_BUFLEN ] = {
1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 ,
4 , 4 , 4 , 4
} ;
2013-07-22 19:33:37 +04:00
int rv ;
2013-07-18 13:54:21 +04:00
2019-12-18 20:16:19 +03:00
g_setenv ( " FAIL_NO_SERVICE " , " 1 " , TRUE ) ;
2013-07-18 13:54:21 +04:00
2013-07-22 19:33:37 +04:00
if ( ( rv = virSystemdCreateMachine ( " demo " ,
" qemu " ,
uuid ,
NULL ,
123 ,
false ,
2014-11-11 20:38:43 +03:00
0 , NULL ,
2019-05-23 02:12:14 +03:00
NULL , 0 ) ) = = 0 ) {
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NO_SERVICE " ) ;
2013-07-18 13:54:21 +04:00
fprintf ( stderr , " %s " , " Unexpected create machine success \n " ) ;
return - 1 ;
}
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NO_SERVICE " ) ;
2013-07-18 13:54:21 +04:00
2013-07-22 19:33:37 +04:00
if ( rv ! = - 2 ) {
fprintf ( stderr , " %s " , " Unexpected create machine error \n " ) ;
return - 1 ;
}
return 0 ;
}
2013-07-18 13:54:21 +04:00
2019-10-14 15:45:03 +03:00
static int testCreateSystemdNotRunning ( const void * opaque G_GNUC_UNUSED )
2014-02-28 00:21:57 +04:00
{
unsigned char uuid [ VIR_UUID_BUFLEN ] = {
1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 ,
4 , 4 , 4 , 4
} ;
int rv ;
2019-12-18 20:16:19 +03:00
g_setenv ( " FAIL_NOT_REGISTERED " , " 1 " , TRUE ) ;
2014-02-28 00:21:57 +04:00
if ( ( rv = virSystemdCreateMachine ( " demo " ,
" qemu " ,
uuid ,
NULL ,
123 ,
false ,
2014-11-11 20:38:43 +03:00
0 , NULL ,
2019-05-23 02:12:14 +03:00
NULL , 0 ) ) = = 0 ) {
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NOT_REGISTERED " ) ;
2014-02-28 00:21:57 +04:00
fprintf ( stderr , " %s " , " Unexpected create machine success \n " ) ;
return - 1 ;
}
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NOT_REGISTERED " ) ;
2014-02-28 00:21:57 +04:00
if ( rv ! = - 2 ) {
fprintf ( stderr , " %s " , " Unexpected create machine error \n " ) ;
return - 1 ;
}
return 0 ;
}
2019-10-14 15:45:03 +03:00
static int testCreateBadSystemd ( const void * opaque G_GNUC_UNUSED )
2013-07-22 19:33:37 +04:00
{
unsigned char uuid [ VIR_UUID_BUFLEN ] = {
1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 ,
4 , 4 , 4 , 4
} ;
int rv ;
2019-12-18 20:16:19 +03:00
g_setenv ( " FAIL_BAD_SERVICE " , " 1 " , TRUE ) ;
2013-07-22 19:33:37 +04:00
if ( ( rv = virSystemdCreateMachine ( " demo " ,
" qemu " ,
uuid ,
NULL ,
123 ,
false ,
2014-11-11 20:38:43 +03:00
0 , NULL ,
2019-05-23 02:12:14 +03:00
NULL , 0 ) ) = = 0 ) {
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_BAD_SERVICE " ) ;
2013-07-22 19:33:37 +04:00
fprintf ( stderr , " %s " , " Unexpected create machine success \n " ) ;
2013-07-18 13:54:21 +04:00
return - 1 ;
}
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_BAD_SERVICE " ) ;
2013-07-18 13:54:21 +04:00
2013-07-22 19:33:37 +04:00
if ( rv ! = - 1 ) {
fprintf ( stderr , " %s " , " Unexpected create machine error \n " ) ;
return - 1 ;
}
2013-07-18 13:54:21 +04:00
2013-07-22 19:33:37 +04:00
return 0 ;
2013-07-18 13:54:21 +04:00
}
2013-07-26 18:18:55 +04:00
2019-10-14 15:45:03 +03:00
static int testCreateNetwork ( const void * opaque G_GNUC_UNUSED )
2014-11-11 20:38:43 +03:00
{
unsigned char uuid [ VIR_UUID_BUFLEN ] = {
1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 ,
4 , 4 , 4 , 4
} ;
int nicindexes [ ] = {
2 , 1729 , 87539319 ,
} ;
2019-10-15 14:55:26 +03:00
size_t nnicindexes = G_N_ELEMENTS ( nicindexes ) ;
2014-11-11 20:38:43 +03:00
if ( virSystemdCreateMachine ( " demo " ,
" lxc " ,
uuid ,
" /proc/123/root " ,
123 ,
true ,
nnicindexes , nicindexes ,
2019-05-23 02:12:14 +03:00
" highpriority.slice " , 0 ) < 0 ) {
2014-11-11 20:38:43 +03:00
fprintf ( stderr , " %s " , " Failed to create LXC machine \n " ) ;
return - 1 ;
}
return 0 ;
}
2016-02-02 21:45:55 +03:00
static int
2019-10-14 15:45:03 +03:00
testGetMachineName ( const void * opaque G_GNUC_UNUSED )
2016-02-02 21:45:55 +03:00
{
char * tmp = virSystemdGetMachineNameByPID ( 1234 ) ;
int ret = - 1 ;
if ( ! tmp ) {
fprintf ( stderr , " %s " , " Failed to create LXC machine \n " ) ;
return ret ;
}
if ( STREQ ( tmp , " qemu-demo " ) )
ret = 0 ;
VIR_FREE ( tmp ) ;
return ret ;
}
2015-11-24 17:56:12 +03:00
struct testNameData {
2013-07-26 18:18:55 +04:00
const char * name ;
const char * expected ;
2020-03-11 19:56:12 +03:00
const char * root ;
2016-02-01 18:50:54 +03:00
int id ;
bool legacy ;
2013-07-26 18:18:55 +04:00
} ;
static int
testScopeName ( const void * opaque )
{
2015-11-24 17:56:12 +03:00
const struct testNameData * data = opaque ;
2013-07-26 18:18:55 +04:00
int ret = - 1 ;
char * actual = NULL ;
2016-02-01 18:50:54 +03:00
if ( ! ( actual = virSystemdMakeScopeName ( data - > name , " lxc " , data - > legacy ) ) )
2013-07-26 18:18:55 +04:00
goto cleanup ;
if ( STRNEQ ( actual , data - > expected ) ) {
fprintf ( stderr , " Expected '%s' but got '%s' \n " ,
data - > expected , actual ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
VIR_FREE ( actual ) ;
return ret ;
}
2015-11-24 17:56:12 +03:00
static int
testMachineName ( const void * opaque )
{
const struct testNameData * data = opaque ;
int ret = - 1 ;
char * actual = NULL ;
2020-03-20 20:14:22 +03:00
if ( ! ( actual = virDomainDriverGenerateMachineName ( " qemu " , data - > root ,
data - > id , data - > name , true ) ) )
2015-11-24 17:56:12 +03:00
goto cleanup ;
if ( STRNEQ ( actual , data - > expected ) ) {
fprintf ( stderr , " Expected '%s' but got '%s' \n " ,
data - > expected , actual ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
VIR_FREE ( actual ) ;
return ret ;
}
2014-04-11 11:20:48 +04:00
typedef int ( * virSystemdCanHelper ) ( bool * result ) ;
struct testPMSupportData {
virSystemdCanHelper tested ;
} ;
static int testPMSupportHelper ( const void * opaque )
{
int rv ;
bool result ;
size_t i ;
const char * results [ 4 ] = { " yes " , " no " , " na " , " challenge " } ;
int expected [ 4 ] = { 1 , 0 , 0 , 1 } ;
const struct testPMSupportData * data = opaque ;
for ( i = 0 ; i < 4 ; i + + ) {
2019-12-18 20:16:19 +03:00
g_setenv ( " RESULT_SUPPORT " , results [ i ] , TRUE ) ;
2014-04-11 11:20:48 +04:00
if ( ( rv = data - > tested ( & result ) ) < 0 ) {
fprintf ( stderr , " %s " , " Unexpected canSuspend error \n " ) ;
return - 1 ;
}
if ( result ! = expected [ i ] ) {
fprintf ( stderr , " Unexpected result for answer '%s' \n " , results [ i ] ) ;
goto error ;
}
2019-12-18 20:16:19 +03:00
g_unsetenv ( " RESULT_SUPPORT " ) ;
2014-04-11 11:20:48 +04:00
}
return 0 ;
error :
2019-12-18 20:16:19 +03:00
g_unsetenv ( " RESULT_SUPPORT " ) ;
2014-04-11 11:20:48 +04:00
return - 1 ;
}
static int testPMSupportHelperNoSystemd ( const void * opaque )
{
int rv ;
bool result ;
const struct testPMSupportData * data = opaque ;
2019-12-18 20:16:19 +03:00
g_setenv ( " FAIL_NO_SERVICE " , " 1 " , TRUE ) ;
2014-04-11 11:20:48 +04:00
if ( ( rv = data - > tested ( & result ) ) = = 0 ) {
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NO_SERVICE " ) ;
2014-04-11 11:20:48 +04:00
fprintf ( stderr , " %s " , " Unexpected canSuspend success \n " ) ;
return - 1 ;
}
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NO_SERVICE " ) ;
2014-04-11 11:20:48 +04:00
if ( rv ! = - 2 ) {
fprintf ( stderr , " %s " , " Unexpected canSuspend error \n " ) ;
return - 1 ;
}
return 0 ;
}
static int testPMSupportSystemdNotRunning ( const void * opaque )
{
int rv ;
bool result ;
const struct testPMSupportData * data = opaque ;
2019-12-18 20:16:19 +03:00
g_setenv ( " FAIL_NOT_REGISTERED " , " 1 " , TRUE ) ;
2014-04-11 11:20:48 +04:00
if ( ( rv = data - > tested ( & result ) ) = = 0 ) {
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NOT_REGISTERED " ) ;
2014-04-11 11:20:48 +04:00
fprintf ( stderr , " %s " , " Unexpected canSuspend success \n " ) ;
return - 1 ;
}
2019-12-18 20:16:19 +03:00
g_unsetenv ( " FAIL_NOT_REGISTERED " ) ;
2014-04-11 11:20:48 +04:00
if ( rv ! = - 2 ) {
fprintf ( stderr , " %s " , " Unexpected canSuspend error \n " ) ;
return - 1 ;
}
return 0 ;
}
2019-06-25 15:03:56 +03:00
static int
testActivationCreateFDs ( virNetSocketPtr * sockUNIX ,
virNetSocketPtr * * sockIP ,
size_t * nsockIP )
{
* sockUNIX = NULL ;
* sockIP = NULL ;
* nsockIP = 0 ;
if ( virNetSocketNewListenUNIX ( " virsystemdtest.sock " ,
0777 ,
0 ,
0 ,
sockUNIX ) < 0 )
return - 1 ;
if ( virNetSocketNewListenTCP ( " localhost " ,
NULL ,
AF_UNSPEC ,
sockIP ,
nsockIP ) < 0 ) {
virObjectUnref ( * sockUNIX ) ;
return - 1 ;
}
return 0 ;
}
static int
testActivation ( bool useNames )
{
virNetSocketPtr sockUNIX ;
virNetSocketPtr * sockIP ;
size_t nsockIP ;
int ret = - 1 ;
size_t i ;
2020-01-14 16:30:07 +03:00
char nfdstr [ VIR_INT64_STR_BUFLEN ] ;
char pidstr [ VIR_INT64_STR_BUFLEN ] ;
2019-06-25 15:03:56 +03:00
virSystemdActivationMap map [ 2 ] ;
int * fds = NULL ;
size_t nfds = 0 ;
2019-10-15 15:47:50 +03:00
g_autoptr ( virSystemdActivation ) act = NULL ;
2019-10-15 15:47:50 +03:00
g_auto ( virBuffer ) names = VIR_BUFFER_INITIALIZER ;
2020-02-22 02:57:33 +03:00
g_autofree char * demo_socket_path = NULL ;
2019-07-15 18:58:02 +03:00
virBufferAddLit ( & names , " demo-unix.socket " ) ;
2019-06-25 15:03:56 +03:00
if ( testActivationCreateFDs ( & sockUNIX , & sockIP , & nsockIP ) < 0 )
return - 1 ;
2020-02-22 02:57:33 +03:00
demo_socket_path = virNetSocketGetPath ( sockUNIX ) ;
2019-07-15 18:58:02 +03:00
for ( i = 0 ; i < nsockIP ; i + + )
virBufferAddLit ( & names , " :demo-ip.socket " ) ;
2019-06-25 15:03:56 +03:00
2019-11-13 16:53:42 +03:00
g_snprintf ( nfdstr , sizeof ( nfdstr ) , " %zu " , 1 + nsockIP ) ;
g_snprintf ( pidstr , sizeof ( pidstr ) , " %lld " , ( long long ) getpid ( ) ) ;
2019-06-25 15:03:56 +03:00
2019-12-18 20:16:19 +03:00
g_setenv ( " LISTEN_FDS " , nfdstr , TRUE ) ;
g_setenv ( " LISTEN_PID " , pidstr , TRUE ) ;
2019-06-25 15:03:56 +03:00
if ( useNames )
2019-12-18 20:16:19 +03:00
g_setenv ( " LISTEN_FDNAMES " , virBufferCurrentContent ( & names ) , TRUE ) ;
2019-06-25 15:03:56 +03:00
else
2019-12-18 20:16:19 +03:00
g_unsetenv ( " LISTEN_FDNAMES " ) ;
2019-06-25 15:03:56 +03:00
map [ 0 ] . name = " demo-unix.socket " ;
map [ 0 ] . family = AF_UNIX ;
2020-02-22 02:57:33 +03:00
map [ 0 ] . path = demo_socket_path ;
2019-06-25 15:03:56 +03:00
map [ 1 ] . name = " demo-ip.socket " ;
map [ 1 ] . family = AF_INET ;
map [ 1 ] . port = virNetSocketGetPort ( sockIP [ 0 ] ) ;
2019-10-15 14:55:26 +03:00
if ( virSystemdGetActivation ( map , G_N_ELEMENTS ( map ) , & act ) < 0 )
2019-06-25 15:03:56 +03:00
goto cleanup ;
if ( act = = NULL ) {
fprintf ( stderr , " Activation object was not created: %s " , virGetLastErrorMessage ( ) ) ;
goto cleanup ;
}
if ( virSystemdActivationComplete ( act ) = = 0 ) {
fprintf ( stderr , " Activation did not report unclaimed FDs " ) ;
goto cleanup ;
}
virSystemdActivationClaimFDs ( act , " demo-unix.socket " , & fds , & nfds ) ;
if ( nfds ! = 1 ) {
fprintf ( stderr , " Expected 1 UNIX fd, but got %zu \n " , nfds ) ;
goto cleanup ;
}
VIR_FREE ( fds ) ;
virSystemdActivationClaimFDs ( act , " demo-ip.socket " , & fds , & nfds ) ;
if ( nfds ! = nsockIP ) {
fprintf ( stderr , " Expected %zu IP fd, but got %zu \n " , nsockIP , nfds ) ;
goto cleanup ;
}
VIR_FREE ( fds ) ;
virSystemdActivationClaimFDs ( act , " demo-ip-alt.socket " , & fds , & nfds ) ;
if ( nfds ! = 0 ) {
fprintf ( stderr , " Expected 0 IP fd, but got %zu \n " , nfds ) ;
goto cleanup ;
}
if ( virSystemdActivationComplete ( act ) < 0 ) {
fprintf ( stderr , " Action was not complete: %s \n " , virGetLastErrorMessage ( ) ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
virObjectUnref ( sockUNIX ) ;
for ( i = 0 ; i < nsockIP ; i + + )
virObjectUnref ( sockIP [ i ] ) ;
VIR_FREE ( sockIP ) ;
VIR_FREE ( fds ) ;
return ret ;
}
static int
2019-10-14 15:45:03 +03:00
testActivationEmpty ( const void * opaque G_GNUC_UNUSED )
2019-06-25 15:03:56 +03:00
{
virSystemdActivationPtr act ;
2019-12-18 20:16:19 +03:00
g_unsetenv ( " LISTEN_FDS " ) ;
2019-06-25 15:03:56 +03:00
if ( virSystemdGetActivation ( NULL , 0 , & act ) < 0 )
return - 1 ;
if ( act ! = NULL ) {
fprintf ( stderr , " Unexpectedly got activation object " ) ;
2019-10-01 12:50:34 +03:00
virSystemdActivationFree ( act ) ;
2019-06-25 15:03:56 +03:00
return - 1 ;
}
return 0 ;
}
static int
2019-10-14 15:45:03 +03:00
testActivationFDNames ( const void * opaque G_GNUC_UNUSED )
2019-06-25 15:03:56 +03:00
{
return testActivation ( true ) ;
}
static int
2019-10-14 15:45:03 +03:00
testActivationFDAddrs ( const void * opaque G_GNUC_UNUSED )
2019-06-25 15:03:56 +03:00
{
return testActivation ( false ) ;
}
2013-07-18 13:54:21 +04:00
static int
mymain ( void )
{
int ret = 0 ;
2016-02-01 18:50:54 +03:00
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
/* The one we use in tests quite often */
if ( virUUIDParse ( " c7a5fdbd-edaf-9455-926a-d65c16db1809 " , uuid ) < 0 )
return EXIT_FAILURE ;
2017-11-03 15:09:47 +03:00
# define DO_TEST(_name, func) \
do { \
if ( virTestRun ( _name , func , NULL ) < 0 ) \
ret = - 1 ; \
if ( virTestRun ( _name " again " , func , NULL ) < 0 ) \
ret = - 1 ; \
virSystemdHasMachinedResetCachedValue ( ) ; \
2017-02-23 14:25:33 +03:00
} while ( 0 )
DO_TEST ( " Test create container " , testCreateContainer ) ;
DO_TEST ( " Test terminate container " , testTerminateContainer ) ;
DO_TEST ( " Test create machine " , testCreateMachine ) ;
DO_TEST ( " Test terminate machine " , testTerminateMachine ) ;
DO_TEST ( " Test create no systemd " , testCreateNoSystemd ) ;
DO_TEST ( " Test create systemd not running " , testCreateSystemdNotRunning ) ;
DO_TEST ( " Test create bad systemd " , testCreateBadSystemd ) ;
DO_TEST ( " Test create with network " , testCreateNetwork ) ;
DO_TEST ( " Test getting machine name " , testGetMachineName ) ;
2013-07-18 13:54:21 +04:00
2017-11-03 15:09:47 +03:00
# define TEST_SCOPE(_name, unitname, _legacy) \
do { \
struct testNameData data = { \
. name = _name , . expected = unitname , . legacy = _legacy , \
} ; \
if ( virTestRun ( " Test scopename " , testScopeName , & data ) < 0 ) \
ret = - 1 ; \
2013-07-26 18:18:55 +04:00
} while ( 0 )
2017-11-03 15:09:47 +03:00
# define TEST_SCOPE_OLD(name, unitname) \
2016-02-01 18:50:54 +03:00
TEST_SCOPE ( name , unitname , true )
2017-11-03 15:09:47 +03:00
# define TEST_SCOPE_NEW(name, unitname) \
2016-02-01 18:50:54 +03:00
TEST_SCOPE ( name , unitname , false )
TEST_SCOPE_OLD ( " demo " , " machine-lxc \\ x2ddemo.scope " ) ;
TEST_SCOPE_OLD ( " demo-name " , " machine-lxc \\ x2ddemo \\ x2dname.scope " ) ;
TEST_SCOPE_OLD ( " demo!name " , " machine-lxc \\ x2ddemo \\ x21name.scope " ) ;
TEST_SCOPE_OLD ( " .demo " , " machine-lxc \\ x2d \\ x2edemo.scope " ) ;
TEST_SCOPE_OLD ( " bull💩 " , " machine-lxc \\ x2dbull \\ xf0 \\ x9f \\ x92 \\ xa9.scope " ) ;
TEST_SCOPE_NEW ( " qemu-3-demo " , " machine-qemu \\ x2d3 \\ x2ddemo.scope " ) ;
2015-11-24 17:56:12 +03:00
2020-03-11 19:56:12 +03:00
# define TEST_MACHINE(_name, _root, _id, machinename) \
2017-11-03 15:09:47 +03:00
do { \
struct testNameData data = { \
2020-03-11 19:56:12 +03:00
. name = _name , . expected = machinename , . root = _root , . id = _id , \
2017-11-03 15:09:47 +03:00
} ; \
if ( virTestRun ( " Test scopename " , testMachineName , & data ) < 0 ) \
ret = - 1 ; \
2015-11-24 17:56:12 +03:00
} while ( 0 )
2020-03-11 19:56:12 +03:00
TEST_MACHINE ( " demo " , NULL , 1 , " qemu-1-demo " ) ;
TEST_MACHINE ( " demo-name " , NULL , 2 , " qemu-2-demo-name " ) ;
TEST_MACHINE ( " demo!name " , NULL , 3 , " qemu-3-demoname " ) ;
TEST_MACHINE ( " .demo " , NULL , 4 , " qemu-4-demo " ) ;
TEST_MACHINE ( " bull \U0001f4a9 " , NULL , 5 , " qemu-5-bull " ) ;
TEST_MACHINE ( " demo..name " , NULL , 6 , " qemu-6-demo.name " ) ;
TEST_MACHINE ( " 12345678901234567890123456789012345678901234567890123456789 " , NULL , 7 ,
2016-02-01 18:50:54 +03:00
" qemu-7-123456789012345678901234567890123456789012345678901234567 " ) ;
2020-03-11 19:56:12 +03:00
TEST_MACHINE ( " 123456789012345678901234567890123456789012345678901234567890 " , NULL , 8 ,
2016-02-01 18:50:54 +03:00
" qemu-8-123456789012345678901234567890123456789012345678901234567 " ) ;
2020-03-11 19:56:12 +03:00
TEST_MACHINE ( " kstest-network-device-default-httpks_(c9eed63e-981e-48ec-acdc-56b3f8c5f678) " ,
NULL , 100 ,
2020-01-14 08:20:52 +03:00
" qemu-100-kstest-network-device-default-httpksc9eed63e-981e-48ec " ) ;
2020-03-11 19:56:12 +03:00
TEST_MACHINE ( " kstest-network-device-default-httpks_(c9eed63e-981e-48ec--cdc-56b3f8c5f678) " ,
NULL , 10 ,
2020-02-28 19:12:41 +03:00
" qemu-10-kstest-network-device-default-httpksc9eed63e-981e-48ec-c " ) ;
2020-03-11 19:56:12 +03:00
TEST_MACHINE ( " demo.-.test. " , NULL , 11 , " qemu-11-demo.test " ) ;
TEST_MACHINE ( " demo " , " /tmp/root1 " , 1 , " qemu-embed-0991f456-1-demo " ) ;
TEST_MACHINE ( " demo " , " /tmp/root2 " , 1 , " qemu-embed-95d47ff5-1-demo " ) ;
2013-07-26 18:18:55 +04:00
2017-11-03 15:09:47 +03:00
# define TESTS_PM_SUPPORT_HELPER(name, function) \
do { \
struct testPMSupportData data = { \
function \
} ; \
if ( virTestRun ( " Test " name " " , testPMSupportHelper , & data ) < 0 ) \
ret = - 1 ; \
2019-08-13 17:34:30 +03:00
virSystemdHasLogindResetCachedValue ( ) ; \
2017-11-03 15:09:47 +03:00
if ( virTestRun ( " Test " name " no systemd " , \
testPMSupportHelperNoSystemd , & data ) < 0 ) \
ret = - 1 ; \
2019-08-13 17:34:30 +03:00
virSystemdHasLogindResetCachedValue ( ) ; \
2017-11-03 15:09:47 +03:00
if ( virTestRun ( " Test systemd " name " not running " , \
testPMSupportSystemdNotRunning , & data ) < 0 ) \
ret = - 1 ; \
2019-08-13 17:34:30 +03:00
virSystemdHasLogindResetCachedValue ( ) ; \
2014-04-11 11:20:48 +04:00
} while ( 0 )
TESTS_PM_SUPPORT_HELPER ( " canSuspend " , & virSystemdCanSuspend ) ;
TESTS_PM_SUPPORT_HELPER ( " canHibernate " , & virSystemdCanHibernate ) ;
TESTS_PM_SUPPORT_HELPER ( " canHybridSleep " , & virSystemdCanHybridSleep ) ;
2019-06-25 15:03:56 +03:00
if ( virTestRun ( " Test activation empty " , testActivationEmpty , NULL ) < 0 )
ret = - 1 ;
2019-07-12 19:55:13 +03:00
if ( fcntl ( STDERR_FILENO + 1 , F_GETFL ) = = - 1 & & errno = = EBADF & &
fcntl ( STDERR_FILENO + 2 , F_GETFL ) = = - 1 & & errno = = EBADF & &
fcntl ( STDERR_FILENO + 3 , F_GETFL ) = = - 1 & & errno = = EBADF ) {
if ( virTestRun ( " Test activation names " , testActivationFDNames , NULL ) < 0 )
ret = - 1 ;
if ( virTestRun ( " Test activation addrs " , testActivationFDAddrs , NULL ) < 0 )
ret = - 1 ;
} else {
VIR_INFO ( " Skipping activation tests as FD 3/4/5 is open " ) ;
}
2019-06-25 15:03:56 +03:00
2014-03-17 13:38:38 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2013-07-18 13:54:21 +04:00
}
2019-08-21 19:13:16 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain , VIR_TEST_MOCK ( " virdbus " ) )
2013-09-17 21:11:25 +04:00
2014-05-21 01:04:44 +04:00
# else /* ! (WITH_DBUS && __linux__) */
2013-09-17 21:11:25 +04:00
int
main ( void )
{
return EXIT_AM_SKIP ;
}
2014-03-12 16:20:07 +04:00
# endif /* ! WITH_DBUS */