2014-01-23 12:17:05 +04:00
/*
* Copyright ( C ) 2014 Red Hat , Inc .
*
* 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"
2018-12-13 17:53:50 +03:00
# define LIBVIRT_VIRCOMMANDPRIV_H_ALLOW
2014-03-11 14:59:58 +04:00
# include "vircommandpriv.h"
2014-01-23 12:17:05 +04:00
# include "virnetdevbandwidth.h"
# include "netdev_bandwidth_conf.c"
# define VIR_FROM_THIS VIR_FROM_NONE
struct testMinimalStruct {
const char * expected_result ;
const char * band1 ;
const char * band2 ;
} ;
2014-01-27 17:53:00 +04:00
struct testSetStruct {
const char * band ;
const char * exp_cmd ;
const char * iface ;
const bool hierarchical_class ;
} ;
2017-11-03 15:09:47 +03:00
# define PARSE(xml, var) \
do { \
int rc ; \
xmlDocPtr doc ; \
xmlXPathContextPtr ctxt = NULL ; \
\
if ( ! xml ) \
break ; \
\
if ( ! ( doc = virXMLParseStringCtxt ( ( xml ) , \
" bandwidth definition " , \
& ctxt ) ) ) \
goto cleanup ; \
\
rc = virNetDevBandwidthParse ( & ( var ) , \
2019-05-14 17:44:55 +03:00
NULL , \
2017-11-03 15:09:47 +03:00
ctxt - > node , \
2019-01-29 20:26:40 +03:00
true ) ; \
2017-11-03 15:09:47 +03:00
xmlFreeDoc ( doc ) ; \
xmlXPathFreeContext ( ctxt ) ; \
if ( rc < 0 ) \
goto cleanup ; \
2014-01-23 12:17:05 +04:00
} while ( 0 )
2014-01-27 17:53:00 +04:00
static int
testVirNetDevBandwidthSet ( const void * data )
{
int ret = - 1 ;
const struct testSetStruct * info = data ;
const char * iface = info - > iface ;
virNetDevBandwidthPtr band = NULL ;
2020-07-03 02:35:41 +03:00
g_auto ( virBuffer ) buf = VIR_BUFFER_INITIALIZER ;
2014-01-27 17:53:00 +04:00
char * actual_cmd = NULL ;
PARSE ( info - > band , band ) ;
if ( ! iface )
iface = " eth0 " ;
2014-03-07 15:39:48 +04:00
virCommandSetDryRun ( & buf , NULL , NULL ) ;
2014-01-27 17:53:00 +04:00
2017-10-02 15:12:44 +03:00
if ( virNetDevBandwidthSet ( iface , band , info - > hierarchical_class , true ) < 0 )
2014-01-27 17:53:00 +04:00
goto cleanup ;
if ( ! ( actual_cmd = virBufferContentAndReset ( & buf ) ) ) {
/* This is interesting, no command has been executed.
* Maybe that ' s expected , actually . */
}
if ( STRNEQ_NULLABLE ( info - > exp_cmd , actual_cmd ) ) {
2016-05-26 18:01:51 +03:00
virTestDifference ( stderr ,
NULLSTR ( info - > exp_cmd ) ,
NULLSTR ( actual_cmd ) ) ;
2014-01-27 17:53:00 +04:00
goto cleanup ;
}
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2014-03-07 15:39:48 +04:00
virCommandSetDryRun ( NULL , NULL , NULL ) ;
2014-01-27 17:53:00 +04:00
virNetDevBandwidthFree ( band ) ;
VIR_FREE ( actual_cmd ) ;
return ret ;
}
2014-01-23 12:17:05 +04:00
static int
mymain ( void )
{
int ret = 0 ;
2017-11-03 15:09:47 +03:00
# define DO_TEST_SET(Band, Exp_cmd, ...) \
do { \
struct testSetStruct data = { . band = Band , \
. exp_cmd = Exp_cmd , \
__VA_ARGS__ } ; \
if ( virTestRun ( " virNetDevBandwidthSet " , \
testVirNetDevBandwidthSet , \
& data ) < 0 ) \
ret = - 1 ; \
2014-01-27 17:53:00 +04:00
} while ( 0 )
2014-01-23 12:17:05 +04:00
2014-01-31 18:04:03 +04:00
DO_TEST_SET ( NULL , NULL ) ;
2015-01-07 19:53:04 +03:00
DO_TEST_SET ( " <bandwidth/> " , NULL ) ;
2014-01-31 18:04:03 +04:00
DO_TEST_SET ( ( " <bandwidth> "
" <inbound average='1024'/> "
" </bandwidth> " ) ,
( TC " qdisc del dev eth0 root \n "
TC " qdisc del dev eth0 ingress \n "
TC " qdisc add dev eth0 root handle 1: htb default 1 \n "
2016-02-02 14:48:44 +03:00
TC " class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps quantum 87 \n "
2014-01-31 18:04:03 +04:00
TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10 \n "
2015-04-14 16:40:17 +03:00
TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1 \n " ) ) ;
2014-01-31 18:04:03 +04:00
DO_TEST_SET ( ( " <bandwidth> "
" <outbound average='1024'/> "
" </bandwidth> " ) ,
( TC " qdisc del dev eth0 root \n "
TC " qdisc del dev eth0 ingress \n "
TC " qdisc add dev eth0 ingress \n "
2014-04-04 17:39:33 +04:00
TC " filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 "
2014-01-31 18:04:03 +04:00
" police rate 1024kbps burst 1024kb mtu 64kb drop flowid :1 \n " ) ) ;
2014-01-27 17:53:00 +04:00
DO_TEST_SET ( ( " <bandwidth> "
" <inbound average='1' peak='2' floor='3' burst='4'/> "
" <outbound average='5' peak='6' burst='7'/> "
" </bandwidth> " ) ,
2014-01-31 12:52:30 +04:00
( TC " qdisc del dev eth0 root \n "
TC " qdisc del dev eth0 ingress \n "
TC " qdisc add dev eth0 root handle 1: htb default 1 \n "
2016-02-02 14:48:44 +03:00
TC " class add dev eth0 parent 1: classid 1:1 htb rate 1kbps ceil 2kbps burst 4kb quantum 1 \n "
2014-01-31 12:52:30 +04:00
TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10 \n "
2015-04-14 16:40:17 +03:00
TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1 \n "
2014-01-31 12:52:30 +04:00
TC " qdisc add dev eth0 ingress \n "
2014-04-04 17:39:33 +04:00
TC " filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 "
2014-01-27 17:53:00 +04:00
" police rate 5kbps burst 7kb mtu 64kb drop flowid :1 \n " ) ) ;
2014-01-23 12:17:05 +04:00
return ret ;
}
2019-08-21 19:13:16 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain , VIR_TEST_MOCK ( " virnetdevbandwidth " ) )