2012-03-20 15:55:11 +04:00
/*
* Copyright ( C ) 2012 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
2012-07-21 14:06:23 +04:00
* License along with this library ; If not , see
* < http : //www.gnu.org/licenses/>.
2012-03-20 15:55:11 +04:00
*
* Author : Daniel P . Berrange < berrange @ redhat . com >
*/
# include <config.h>
# include <stdlib.h>
# include <signal.h>
# include "testutils.h"
# include "util.h"
# include "virterror_internal.h"
# include "memory.h"
# include "logging.h"
# include "viruri.h"
# define VIR_FROM_THIS VIR_FROM_RPC
struct URIParseData {
const char * uri ;
2012-03-26 14:23:45 +04:00
const char * uri_out ;
2012-03-20 15:55:11 +04:00
const char * scheme ;
const char * server ;
int port ;
const char * path ;
const char * query ;
const char * fragment ;
2012-04-05 19:52:42 +04:00
const char * user ;
2012-03-20 17:59:32 +04:00
virURIParamPtr params ;
2012-03-20 15:55:11 +04:00
} ;
static int testURIParse ( const void * args )
{
int ret = - 1 ;
virURIPtr uri = NULL ;
const struct URIParseData * data = args ;
2012-03-26 14:23:45 +04:00
char * uristr = NULL ;
2012-03-20 17:59:32 +04:00
size_t i ;
2012-03-20 15:55:11 +04:00
Centralize error reporting for URI parsing/formatting problems
Move error reporting out of the callers, into virURIParse
and virURIFormat, to get consistency.
* include/libvirt/virterror.h, src/util/virterror.c: Add VIR_FROM_URI
* src/util/viruri.c, src/util/viruri.h: Add error reporting
* src/esx/esx_driver.c, src/libvirt.c, src/libxl/libxl_driver.c,
src/lxc/lxc_driver.c, src/openvz/openvz_driver.c,
src/qemu/qemu_driver.c, src/qemu/qemu_migration.c,
src/remote/remote_driver.c, src/uml/uml_driver.c,
src/vbox/vbox_tmpl.c, src/vmx/vmx.c, src/xen/xen_driver.c,
src/xen/xend_internal.c, tests/viruritest.c: Remove error
reporting
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-03-20 16:16:54 +04:00
if ( ! ( uri = virURIParse ( data - > uri ) ) )
2012-03-20 15:55:11 +04:00
goto cleanup ;
if ( ! STREQ ( uri - > scheme , data - > scheme ) ) {
VIR_DEBUG ( " Expected scheme '%s', actual '%s' " ,
data - > scheme , uri - > scheme ) ;
goto cleanup ;
}
if ( ! STREQ ( uri - > server , data - > server ) ) {
VIR_DEBUG ( " Expected server '%s', actual '%s' " ,
data - > server , uri - > server ) ;
goto cleanup ;
}
if ( uri - > port ! = data - > port ) {
VIR_DEBUG ( " Expected port '%d', actual '%d' " ,
data - > port , uri - > port ) ;
goto cleanup ;
}
if ( ! STREQ_NULLABLE ( uri - > path , data - > path ) ) {
VIR_DEBUG ( " Expected path '%s', actual '%s' " ,
data - > path , uri - > path ) ;
goto cleanup ;
}
if ( ! STREQ_NULLABLE ( uri - > query , data - > query ) ) {
VIR_DEBUG ( " Expected query '%s', actual '%s' " ,
data - > query , uri - > query ) ;
goto cleanup ;
}
if ( ! STREQ_NULLABLE ( uri - > fragment , data - > fragment ) ) {
VIR_DEBUG ( " Expected fragment '%s', actual '%s' " ,
data - > fragment , uri - > fragment ) ;
goto cleanup ;
}
2012-03-20 17:59:32 +04:00
for ( i = 0 ; data - > params & & data - > params [ i ] . name & & i < uri - > paramsCount ; i + + ) {
if ( ! STREQ_NULLABLE ( data - > params [ i ] . name , uri - > params [ i ] . name ) ) {
VIR_DEBUG ( " Expected param name %zu '%s', actual '%s' " ,
i , data - > params [ i ] . name , uri - > params [ i ] . name ) ;
goto cleanup ;
}
if ( ! STREQ_NULLABLE ( data - > params [ i ] . value , uri - > params [ i ] . value ) ) {
VIR_DEBUG ( " Expected param value %zu '%s', actual '%s' " ,
i , data - > params [ i ] . value , uri - > params [ i ] . value ) ;
goto cleanup ;
}
}
if ( data - > params & & data - > params [ i ] . name ) {
VIR_DEBUG ( " Missing parameter %zu %s=%s " ,
i , data - > params [ i ] . name , data - > params [ i ] . value ) ;
goto cleanup ;
}
if ( i ! = uri - > paramsCount ) {
VIR_DEBUG ( " Unexpected parameter %zu %s=%s " ,
i , uri - > params [ i ] . name , uri - > params [ i ] . value ) ;
goto cleanup ;
}
2012-03-26 14:23:45 +04:00
VIR_FREE ( uri - > query ) ;
uri - > query = virURIFormatParams ( uri ) ;
if ( ! ( uristr = virURIFormat ( uri ) ) )
goto cleanup ;
if ( ! STREQ ( uristr , data - > uri_out ) ) {
VIR_DEBUG ( " URI did not roundtrip, expect '%s', actual '%s' " ,
data - > uri_out , uristr ) ;
goto cleanup ;
}
2012-03-20 15:55:11 +04:00
ret = 0 ;
cleanup :
VIR_FREE ( uristr ) ;
2012-03-20 15:59:42 +04:00
virURIFree ( uri ) ;
2012-03-20 15:55:11 +04:00
return ret ;
}
static int
mymain ( void )
{
int ret = 0 ;
signal ( SIGPIPE , SIG_IGN ) ;
2012-03-26 14:23:45 +04:00
# define TEST_FULL(uri, uri_out, scheme, server, port, path, query, \
2012-04-05 19:52:42 +04:00
fragment , user , params ) \
2012-03-20 15:55:11 +04:00
do { \
const struct URIParseData data = { \
2012-03-26 14:23:45 +04:00
uri , ( uri_out ) ? ( uri_out ) : ( uri ) , scheme , server , port , \
2012-04-05 19:52:42 +04:00
path , query , fragment , user , params \
2012-03-20 15:55:11 +04:00
} ; \
2012-03-26 14:23:45 +04:00
if ( virtTestRun ( " Test URI " # uri , 1 , testURIParse , & data ) < 0 ) \
2012-03-20 15:55:11 +04:00
ret = - 1 ; \
} while ( 0 )
2012-04-05 19:52:42 +04:00
# define TEST_PARSE(uri, scheme, server, port, path, query, fragment, user, params) \
TEST_FULL ( uri , NULL , scheme , server , port , path , query , fragment , user , params )
2012-03-26 14:23:45 +04:00
# define TEST_PARAMS(query_in, query_out, params) \
TEST_FULL ( " test://example.com/? " query_in , \
* query_out ? " test://example.com/? " query_out : NULL , \
2012-04-05 19:52:42 +04:00
" test " , " example.com " , 0 , " / " , query_in , NULL , NULL , params )
2012-03-20 15:55:11 +04:00
2012-03-20 17:59:32 +04:00
virURIParam params [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " name " , ( char * ) " value " , false } ,
{ NULL , NULL , false } ,
2012-03-20 17:59:32 +04:00
} ;
2012-04-05 19:52:42 +04:00
TEST_PARSE ( " test://example.com " , " test " , " example.com " , 0 , NULL , NULL , NULL , NULL , NULL ) ;
TEST_PARSE ( " test://foo@example.com " , " test " , " example.com " , 0 , NULL , NULL , NULL , " foo " , NULL ) ;
TEST_PARSE ( " test://example.com:123 " , " test " , " example.com " , 123 , NULL , NULL , NULL , NULL , NULL ) ;
TEST_PARSE ( " test://example.com:123/system?name=value#foo " , " test " , " example.com " , 123 , " /system " , " name=value " , " foo " , NULL , params ) ;
TEST_PARSE ( " test://127.0.0.1:123/system " , " test " , " 127.0.0.1 " , 123 , " /system " , NULL , NULL , NULL , NULL ) ;
TEST_PARSE ( " test://[::1]:123/system " , " test " , " ::1 " , 123 , " /system " , NULL , NULL , NULL , NULL ) ;
TEST_PARSE ( " test://[2001:41c8:1:4fd4::2]:123/system " , " test " , " 2001:41c8:1:4fd4::2 " , 123 , " /system " , NULL , NULL , NULL , NULL ) ;
2012-03-20 15:55:11 +04:00
2012-03-26 14:23:45 +04:00
virURIParam params1 [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " foo " , ( char * ) " one " , false } ,
{ ( char * ) " bar " , ( char * ) " two " , false } ,
{ NULL , NULL , false } ,
2012-03-26 14:23:45 +04:00
} ;
virURIParam params2 [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " foo " , ( char * ) " one " , false } ,
{ ( char * ) " foo " , ( char * ) " two " , false } ,
{ NULL , NULL , false } ,
2012-03-26 14:23:45 +04:00
} ;
virURIParam params3 [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " foo " , ( char * ) " &one " , false } ,
{ ( char * ) " bar " , ( char * ) " &two " , false } ,
{ NULL , NULL , false } ,
2012-03-26 14:23:45 +04:00
} ;
virURIParam params4 [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " foo " , ( char * ) " " , false } ,
{ NULL , NULL , false } ,
2012-03-26 14:23:45 +04:00
} ;
virURIParam params5 [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " foo " , ( char * ) " one two " , false } ,
{ NULL , NULL , false } ,
2012-03-26 14:23:45 +04:00
} ;
virURIParam params6 [ ] = {
2012-04-06 06:04:23 +04:00
{ ( char * ) " foo " , ( char * ) " one " , false } ,
{ NULL , NULL , false } ,
2012-03-26 14:23:45 +04:00
} ;
TEST_PARAMS ( " foo=one&bar=two " , " " , params1 ) ;
TEST_PARAMS ( " foo=one&foo=two " , " " , params2 ) ;
TEST_PARAMS ( " foo=one&&foo=two " , " foo=one&foo=two " , params2 ) ;
TEST_PARAMS ( " foo=one;foo=two " , " foo=one&foo=two " , params2 ) ;
TEST_PARAMS ( " foo=%26one&bar=%26two " , " " , params3 ) ;
TEST_PARAMS ( " foo " , " foo= " , params4 ) ;
TEST_PARAMS ( " foo= " , " " , params4 ) ;
TEST_PARAMS ( " foo=& " , " foo= " , params4 ) ;
TEST_PARAMS ( " foo=&& " , " foo= " , params4 ) ;
TEST_PARAMS ( " foo=one%20two " , " " , params5 ) ;
TEST_PARAMS ( " =bogus&foo=one " , " foo=one " , params6 ) ;
2012-03-22 15:33:35 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2012-03-20 15:55:11 +04:00
}
VIRT_TEST_MAIN ( mymain )