2010-09-16 18:22:32 +04:00
/*
2007-02-14 22:30:05 +03:00
Unix SMB / CIFS implementation .
test suite for winreg ndr operations
Copyright ( C ) Jelmer Vernooij 2007
2010-09-16 18:22:32 +04:00
2007-02-14 22:30:05 +03:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2007-02-14 22:30:05 +03:00
( at your option ) any later version .
2010-09-16 18:22:32 +04:00
2007-02-14 22:30:05 +03:00
This program 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 General Public License for more details .
2010-09-16 18:22:32 +04:00
2007-02-14 22:30:05 +03:00
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2007-02-14 22:30:05 +03:00
*/
# include "includes.h"
# include "torture/ndr/ndr.h"
# include "torture/ndr/proto.h"
2008-10-11 23:31:42 +04:00
# include "../lib/util/dlinklist.h"
2007-12-14 00:46:27 +03:00
# include "param/param.h"
2007-02-14 22:30:05 +03:00
struct ndr_pull_test_data {
DATA_BLOB data ;
2010-09-16 18:21:39 +04:00
DATA_BLOB data_context ;
2007-02-14 22:30:05 +03:00
size_t struct_size ;
ndr_pull_flags_fn_t pull_fn ;
int ndr_flags ;
} ;
static bool wrap_ndr_pull_test ( struct torture_context * tctx ,
2010-09-16 18:25:51 +04:00
struct torture_tcase * tcase ,
struct torture_test * test )
2007-02-14 22:30:05 +03:00
{
bool ( * check_fn ) ( struct torture_context * ctx , void * data ) = test - > fn ;
2007-09-08 20:46:30 +04:00
const struct ndr_pull_test_data * data = ( const struct ndr_pull_test_data * ) test - > data ;
2007-02-14 22:30:05 +03:00
void * ds = talloc_zero_size ( tctx , data - > struct_size ) ;
2010-05-09 19:20:01 +04:00
struct ndr_pull * ndr = ndr_pull_init_blob ( & ( data - > data ) , tctx ) ;
2007-02-14 22:30:05 +03:00
ndr - > flags | = LIBNDR_FLAG_REF_ALLOC ;
2007-11-09 21:24:51 +03:00
torture_assert_ndr_success ( tctx , data - > pull_fn ( ndr , data - > ndr_flags , ds ) ,
" pulling " ) ;
2007-02-14 22:30:05 +03:00
2010-09-16 18:22:32 +04:00
torture_assert ( tctx , ndr - > offset = = ndr - > data_size ,
talloc_asprintf ( tctx ,
2007-02-18 15:00:53 +03:00
" %d unread bytes " , ndr - > data_size - ndr - > offset ) ) ;
2010-09-16 18:22:32 +04:00
if ( check_fn ! = NULL )
2007-02-16 15:47:08 +03:00
return check_fn ( tctx , ds ) ;
else
return true ;
2007-02-14 22:30:05 +03:00
}
_PUBLIC_ struct torture_test * _torture_suite_add_ndr_pull_test (
2010-09-16 18:22:32 +04:00
struct torture_suite * suite ,
2007-02-14 22:30:05 +03:00
const char * name , ndr_pull_flags_fn_t pull_fn ,
2010-09-16 18:22:32 +04:00
DATA_BLOB db ,
2007-02-14 22:30:05 +03:00
size_t struct_size ,
int ndr_flags ,
bool ( * check_fn ) ( struct torture_context * ctx , void * data ) )
{
2010-09-16 18:22:32 +04:00
struct torture_test * test ;
2007-02-14 22:30:05 +03:00
struct torture_tcase * tcase ;
struct ndr_pull_test_data * data ;
2010-09-16 18:22:32 +04:00
2007-02-14 22:30:05 +03:00
tcase = torture_suite_add_tcase ( suite , name ) ;
test = talloc ( tcase , struct torture_test ) ;
test - > name = talloc_strdup ( test , name ) ;
test - > description = NULL ;
test - > run = wrap_ndr_pull_test ;
data = talloc ( test , struct ndr_pull_test_data ) ;
data - > data = db ;
data - > ndr_flags = ndr_flags ;
data - > struct_size = struct_size ;
data - > pull_fn = pull_fn ;
2010-09-16 18:21:39 +04:00
test - > data = data ;
test - > fn = check_fn ;
test - > dangerous = false ;
DLIST_ADD_END ( tcase - > tests , test , struct torture_test * ) ;
return test ;
}
static bool wrap_ndr_inout_pull_test ( struct torture_context * tctx ,
struct torture_tcase * tcase ,
struct torture_test * test )
{
bool ( * check_fn ) ( struct torture_context * ctx , void * data ) = test - > fn ;
const struct ndr_pull_test_data * data = ( const struct ndr_pull_test_data * ) test - > data ;
void * ds = talloc_zero_size ( tctx , data - > struct_size ) ;
struct ndr_pull * ndr ;
/* handle NDR_IN context */
ndr = ndr_pull_init_blob ( & ( data - > data_context ) , tctx ) ;
torture_assert ( tctx , ndr , " ndr init failed " ) ;
ndr - > flags | = LIBNDR_FLAG_REF_ALLOC ;
torture_assert_ndr_success ( tctx ,
data - > pull_fn ( ndr , NDR_IN , ds ) ,
" ndr pull of context failed " ) ;
torture_assert ( tctx , ndr - > offset = = ndr - > data_size ,
talloc_asprintf ( tctx , " %d unread bytes " , ndr - > data_size - ndr - > offset ) ) ;
talloc_free ( ndr ) ;
/* handle NDR_OUT */
ndr = ndr_pull_init_blob ( & ( data - > data ) , tctx ) ;
torture_assert ( tctx , ndr , " ndr init failed " ) ;
ndr - > flags | = LIBNDR_FLAG_REF_ALLOC ;
torture_assert_ndr_success ( tctx ,
data - > pull_fn ( ndr , NDR_OUT , ds ) ,
" ndr pull failed " ) ;
torture_assert ( tctx , ndr - > offset = = ndr - > data_size ,
talloc_asprintf ( tctx , " %d unread bytes " , ndr - > data_size - ndr - > offset ) ) ;
talloc_free ( ndr ) ;
if ( check_fn ) {
return check_fn ( tctx , ds ) ;
} else {
return true ;
}
}
_PUBLIC_ struct torture_test * _torture_suite_add_ndr_pull_inout_test (
struct torture_suite * suite ,
const char * name , ndr_pull_flags_fn_t pull_fn ,
DATA_BLOB db_in ,
DATA_BLOB db_out ,
size_t struct_size ,
bool ( * check_fn ) ( struct torture_context * ctx , void * data ) )
{
struct torture_test * test ;
struct torture_tcase * tcase ;
struct ndr_pull_test_data * data ;
tcase = torture_suite_add_tcase ( suite , name ) ;
test = talloc ( tcase , struct torture_test ) ;
test - > name = talloc_strdup ( test , name ) ;
test - > description = NULL ;
test - > run = wrap_ndr_inout_pull_test ;
data = talloc ( test , struct ndr_pull_test_data ) ;
data - > data = db_out ;
data - > data_context = db_in ;
data - > ndr_flags = 0 ;
data - > struct_size = struct_size ;
data - > pull_fn = pull_fn ;
2007-02-14 22:30:05 +03:00
test - > data = data ;
test - > fn = check_fn ;
test - > dangerous = false ;
DLIST_ADD_END ( tcase - > tests , test , struct torture_test * ) ;
return test ;
}
2007-02-16 18:13:51 +03:00
static bool test_check_string_terminator ( struct torture_context * tctx )
{
struct ndr_pull * ndr ;
DATA_BLOB blob ;
TALLOC_CTX * mem_ctx = tctx ;
/* Simple test */
2008-10-18 20:09:04 +04:00
blob = strhex_to_data_blob ( tctx , " 0000 " ) ;
2010-09-16 18:22:32 +04:00
2010-05-09 19:20:01 +04:00
ndr = ndr_pull_init_blob ( & blob , mem_ctx ) ;
2007-02-16 18:13:51 +03:00
2007-11-09 21:24:51 +03:00
torture_assert_ndr_success ( tctx , ndr_check_string_terminator ( ndr , 1 , 2 ) ,
" simple check_string_terminator test failed " ) ;
2007-02-16 18:13:51 +03:00
torture_assert ( tctx , ndr - > offset = = 0 ,
" check_string_terminator did not reset offset " ) ;
2007-11-09 21:24:51 +03:00
if ( NDR_ERR_CODE_IS_SUCCESS ( ndr_check_string_terminator ( ndr , 1 , 3 ) ) ) {
2007-02-16 18:13:51 +03:00
torture_fail ( tctx , " check_string_terminator checked beyond string boundaries " ) ;
}
2010-09-16 18:22:32 +04:00
torture_assert ( tctx , ndr - > offset = = 0 ,
2007-02-16 18:13:51 +03:00
" check_string_terminator did not reset offset " ) ;
talloc_free ( ndr ) ;
2008-10-18 20:09:04 +04:00
blob = strhex_to_data_blob ( tctx , " 11220000 " ) ;
2010-05-09 19:20:01 +04:00
ndr = ndr_pull_init_blob ( & blob , mem_ctx ) ;
2007-02-16 18:13:51 +03:00
2007-11-09 21:24:51 +03:00
torture_assert_ndr_success ( tctx ,
2007-02-16 18:13:51 +03:00
ndr_check_string_terminator ( ndr , 4 , 1 ) ,
" check_string_terminator failed to recognize terminator " ) ;
2007-11-09 21:24:51 +03:00
torture_assert_ndr_success ( tctx ,
2007-02-16 18:13:51 +03:00
ndr_check_string_terminator ( ndr , 3 , 1 ) ,
" check_string_terminator failed to recognize terminator " ) ;
2007-11-09 21:24:51 +03:00
if ( NDR_ERR_CODE_IS_SUCCESS ( ndr_check_string_terminator ( ndr , 2 , 1 ) ) ) {
torture_fail ( tctx , " check_string_terminator erroneously reported terminator " ) ;
2007-02-16 18:13:51 +03:00
}
torture_assert ( tctx , ndr - > offset = = 0 ,
" check_string_terminator did not reset offset " ) ;
return true ;
}
static bool test_guid_from_string_valid ( struct torture_context * tctx )
{
/* FIXME */
return true ;
}
static bool test_guid_from_string_null ( struct torture_context * tctx )
{
struct GUID guid ;
2010-09-16 18:22:32 +04:00
torture_assert_ntstatus_equal ( tctx , NT_STATUS_INVALID_PARAMETER ,
2010-09-16 18:25:51 +04:00
GUID_from_string ( NULL , & guid ) ,
" NULL failed " ) ;
2007-02-16 18:13:51 +03:00
return true ;
}
static bool test_guid_from_string_invalid ( struct torture_context * tctx )
{
struct GUID g1 ;
2010-09-16 18:22:32 +04:00
torture_assert_ntstatus_equal ( tctx , NT_STATUS_INVALID_PARAMETER ,
2010-09-16 18:25:51 +04:00
GUID_from_string ( " bla " , & g1 ) ,
" parameter not invalid " ) ;
2007-02-16 18:13:51 +03:00
return true ;
2010-09-16 18:22:32 +04:00
}
2007-02-16 18:13:51 +03:00
static bool test_guid_from_string ( struct torture_context * tctx )
{
struct GUID g1 , exp ;
torture_assert_ntstatus_ok ( tctx ,
2010-09-16 18:25:51 +04:00
GUID_from_string ( " 00000001-0002-0003-0405-060708090a0b " , & g1 ) ,
" invalid return code " ) ;
2007-02-16 18:13:51 +03:00
exp . time_low = 1 ;
exp . time_mid = 2 ;
exp . time_hi_and_version = 3 ;
exp . clock_seq [ 0 ] = 4 ;
exp . clock_seq [ 1 ] = 5 ;
exp . node [ 0 ] = 6 ;
exp . node [ 1 ] = 7 ;
exp . node [ 2 ] = 8 ;
exp . node [ 3 ] = 9 ;
exp . node [ 4 ] = 10 ;
exp . node [ 5 ] = 11 ;
torture_assert ( tctx , GUID_equal ( & g1 , & exp ) , " UUID parsed incorrectly " ) ;
torture_assert_ntstatus_ok ( tctx ,
2010-09-16 18:25:51 +04:00
GUID_from_string ( " {00000001-0002-0003-0405-060708090a0b} " , & g1 ) ,
" invalid return code " ) ;
2007-02-16 18:13:51 +03:00
torture_assert ( tctx , GUID_equal ( & g1 , & exp ) , " UUID parsed incorrectly " ) ;
return true ;
}
static bool test_guid_string_valid ( struct torture_context * tctx )
{
struct GUID g ;
g . time_low = 1 ;
g . time_mid = 2 ;
g . time_hi_and_version = 3 ;
g . clock_seq [ 0 ] = 4 ;
g . clock_seq [ 1 ] = 5 ;
g . node [ 0 ] = 6 ;
g . node [ 1 ] = 7 ;
g . node [ 2 ] = 8 ;
g . node [ 3 ] = 9 ;
g . node [ 4 ] = 10 ;
g . node [ 5 ] = 11 ;
2010-09-16 18:25:51 +04:00
torture_assert_str_equal ( tctx , " 00000001-0002-0003-0405-060708090a0b " ,
GUID_string ( tctx , & g ) ,
" parsing guid failed " ) ;
2007-02-16 18:13:51 +03:00
return true ;
}
static bool test_guid_string2_valid ( struct torture_context * tctx )
{
struct GUID g ;
g . time_low = 1 ;
g . time_mid = 2 ;
g . time_hi_and_version = 3 ;
g . clock_seq [ 0 ] = 4 ;
g . clock_seq [ 1 ] = 5 ;
g . node [ 0 ] = 6 ;
g . node [ 1 ] = 7 ;
g . node [ 2 ] = 8 ;
g . node [ 3 ] = 9 ;
g . node [ 4 ] = 10 ;
g . node [ 5 ] = 11 ;
2010-09-16 18:25:51 +04:00
torture_assert_str_equal ( tctx , " {00000001-0002-0003-0405-060708090a0b} " ,
GUID_string2 ( tctx , & g ) ,
" parsing guid failed " ) ;
2007-02-16 18:13:51 +03:00
return true ;
}
static bool test_compare_uuid ( struct torture_context * tctx )
{
struct GUID g1 , g2 ;
ZERO_STRUCT ( g1 ) ; ZERO_STRUCT ( g2 ) ;
2010-09-16 18:22:32 +04:00
torture_assert_int_equal ( tctx , 0 , GUID_compare ( & g1 , & g2 ) ,
2010-09-16 18:25:51 +04:00
" GUIDs not equal " ) ;
2007-02-16 18:13:51 +03:00
g1 . time_low = 1 ;
2010-09-16 18:22:32 +04:00
torture_assert_int_equal ( tctx , 1 , GUID_compare ( & g1 , & g2 ) ,
2010-09-16 18:25:51 +04:00
" GUID diff invalid " ) ;
2007-02-16 18:13:51 +03:00
g1 . time_low = 10 ;
2009-12-21 15:19:08 +03:00
torture_assert_int_equal ( tctx , 1 , GUID_compare ( & g1 , & g2 ) ,
2010-09-16 18:25:51 +04:00
" GUID diff invalid " ) ;
2007-02-16 18:13:51 +03:00
g1 . time_low = 0 ;
g1 . clock_seq [ 1 ] = 20 ;
2009-12-21 15:19:08 +03:00
torture_assert_int_equal ( tctx , 1 , GUID_compare ( & g1 , & g2 ) ,
2010-09-16 18:25:51 +04:00
" GUID diff invalid " ) ;
2009-12-21 15:19:08 +03:00
g1 . time_low = ~ 0 ;
torture_assert_int_equal ( tctx , 1 , GUID_compare ( & g1 , & g2 ) ,
2010-09-16 18:25:51 +04:00
" GUID diff invalid " ) ;
2009-12-21 15:19:08 +03:00
g1 . time_low = 0 ;
g2 . time_low = ~ 0 ;
torture_assert_int_equal ( tctx , - 1 , GUID_compare ( & g1 , & g2 ) ,
2010-09-16 18:25:51 +04:00
" GUID diff invalid " ) ;
2007-02-16 18:13:51 +03:00
return true ;
}
2007-03-03 18:01:05 +03:00
struct torture_suite * torture_local_ndr ( TALLOC_CTX * mem_ctx )
2007-02-14 22:30:05 +03:00
{
2010-12-11 05:26:31 +03:00
struct torture_suite * suite = torture_suite_create ( mem_ctx , " ndr " ) ;
2007-02-14 22:30:05 +03:00
torture_suite_add_suite ( suite , ndr_winreg_suite ( suite ) ) ;
2007-02-16 00:06:33 +03:00
torture_suite_add_suite ( suite , ndr_atsvc_suite ( suite ) ) ;
2007-02-16 01:07:18 +03:00
torture_suite_add_suite ( suite , ndr_lsa_suite ( suite ) ) ;
2007-02-16 04:08:59 +03:00
torture_suite_add_suite ( suite , ndr_epmap_suite ( suite ) ) ;
2007-02-16 15:47:08 +03:00
torture_suite_add_suite ( suite , ndr_dfs_suite ( suite ) ) ;
2009-12-13 18:41:53 +03:00
torture_suite_add_suite ( suite , ndr_dfsblob_suite ( suite ) ) ;
2007-02-17 04:58:06 +03:00
torture_suite_add_suite ( suite , ndr_netlogon_suite ( suite ) ) ;
2007-02-18 03:41:42 +03:00
torture_suite_add_suite ( suite , ndr_drsuapi_suite ( suite ) ) ;
torture_suite_add_suite ( suite , ndr_spoolss_suite ( suite ) ) ;
2007-03-02 19:20:48 +03:00
torture_suite_add_suite ( suite , ndr_samr_suite ( suite ) ) ;
2010-03-24 20:08:21 +03:00
torture_suite_add_suite ( suite , ndr_drsblobs_suite ( suite ) ) ;
2010-09-08 13:18:40 +04:00
torture_suite_add_suite ( suite , ndr_nbt_suite ( suite ) ) ;
2010-09-14 19:27:55 +04:00
torture_suite_add_suite ( suite , ndr_ntlmssp_suite ( suite ) ) ;
2010-09-21 07:39:24 +04:00
torture_suite_add_suite ( suite , ndr_backupkey_suite ( suite ) ) ;
2011-05-31 11:49:19 +04:00
torture_suite_add_suite ( suite , ndr_string_suite ( suite ) ) ;
2007-02-14 22:30:05 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " string terminator " ,
2010-09-16 18:25:51 +04:00
test_check_string_terminator ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " guid_from_string_null " ,
2010-09-16 18:25:51 +04:00
test_guid_from_string_null ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " guid_from_string " ,
2010-09-16 18:25:51 +04:00
test_guid_from_string ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " guid_from_string_invalid " ,
2010-09-16 18:25:51 +04:00
test_guid_from_string_invalid ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " guid_string_valid " ,
2010-09-16 18:25:51 +04:00
test_guid_string_valid ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " guid_string2_valid " ,
2010-09-16 18:25:51 +04:00
test_guid_string2_valid ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " guid_from_string_valid " ,
2010-09-16 18:25:51 +04:00
test_guid_from_string_valid ) ;
2007-02-16 18:13:51 +03:00
2010-09-16 18:22:32 +04:00
torture_suite_add_simple_test ( suite , " compare_uuid " ,
2010-09-16 18:25:51 +04:00
test_compare_uuid ) ;
2007-02-14 22:30:05 +03:00
2007-02-16 18:13:51 +03:00
return suite ;
2007-02-14 22:30:05 +03:00
}