2005-05-17 16:17:42 +04:00
#!/usr/bin/perl
# Simple tests for pidl's handling of ref pointers, based
# on tridge's ref_notes.txt
2005-05-17 19:51:35 +04:00
# (C) 2005 Jelmer Vernooij <jelmer@samba.org>.
# Published under the GNU General Public License.
2005-05-17 16:17:42 +04:00
use strict ;
2005-12-25 06:04:13 +03:00
use Test::More tests = > 21 * 8 ;
use FindBin qw( $RealBin ) ;
use lib "$RealBin/../lib" ;
use lib "$RealBin" ;
use Util qw( test_samba4_ndr ) ;
2005-05-17 16:17:42 +04:00
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "noptr-push" ,
2005-05-17 16:17:42 +04:00
' typedef struct {
uint16 x ;
} xstruct ;
[ public ] uint16 echo_TestRef ( [ in ] xstruct foo ) ;
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
uint16_t v = 13 ;
struct echo_TestRef r ;
r . in . foo . x = v ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) ) {
fprintf ( stderr , "push failed\n" ) ;
2005-05-17 16:17:42 +04:00
return 1 ;
2005-05-17 17:19:40 +04:00
}
2005-05-17 16:17:42 +04:00
2005-05-17 17:19:40 +04:00
if ( ndr - > offset != 2 ) {
fprintf ( stderr , "Offset(%d) != 2\n" , ndr - > offset ) ;
2005-05-17 16:17:42 +04:00
return 2 ;
2005-05-17 17:19:40 +04:00
}
2005-05-17 16:17:42 +04:00
2005-05-17 17:19:40 +04:00
if ( ndr - > data [ 0 ] != 13 || ndr - > data [ 1 ] != 0 ) {
fprintf ( stderr , "Data incorrect\n" ) ;
2005-05-17 16:17:42 +04:00
return 3 ;
2005-05-17 17:19:40 +04:00
}
2005-05-17 16:17:42 +04:00
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-embedded-push" ,
2005-05-17 16:17:42 +04:00
' typedef struct {
2005-05-17 17:19:40 +04:00
uint16 * x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in ] xstruct foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
uint16_t v = 13 ;
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo . x = & v ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 6 )
return 2 ;
if ( ndr - > data [ 0 ] == 0 && ndr - > data [ 1 ] == 0 &&
ndr - > data [ 2 ] == 0 && ndr - > data [ 3 ] == 0 )
return 3 ;
if ( ndr - > data [ 4 ] != 13 || ndr - > data [ 5 ] != 0 )
return 4 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-embedded-push-null" ,
2005-05-17 16:17:42 +04:00
' typedef struct {
2005-05-17 17:19:40 +04:00
uint16 * x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in ] xstruct foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo . x = NULL ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 4 )
return 2 ;
if ( ndr - > data [ 0 ] != 0 || ndr - > data [ 1 ] != 0 ||
ndr - > data [ 2 ] != 0 || ndr - > data [ 3 ] != 0 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-embedded-push" ,
2005-05-17 16:17:42 +04:00
'
typedef struct {
2005-05-17 17:19:40 +04:00
[ ref ] uint16 * x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in ] xstruct foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
uint16_t v = 13 ;
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo . x = & v ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 6 )
return 2 ;
if ( ndr - > data [ 0 ] == 0 && ndr - > data [ 1 ] == 0 &&
ndr - > data [ 2 ] == 0 && ndr - > data [ 3 ] == 0 )
return 3 ;
if ( ndr - > data [ 4 ] != 13 || ndr - > data [ 5 ] != 0 )
return 4 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-embedded-push-null" ,
2005-05-17 16:17:42 +04:00
'
typedef struct {
2005-05-17 17:19:40 +04:00
[ ref ] uint16 * x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in ] xstruct foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo . x = NULL ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_OK ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-push" ,
2005-05-17 16:17:42 +04:00
'
typedef struct {
2005-05-17 17:19:40 +04:00
uint16 x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in ] xstruct * foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
struct xstruct s ;
s . x = 13 ;
r . in . foo = & s ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 2 )
return 2 ;
if ( ndr - > data [ 0 ] != 13 || ndr - > data [ 1 ] != 0 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-push-null" ,
2005-05-17 16:17:42 +04:00
'
typedef struct {
2005-05-17 17:19:40 +04:00
uint16 x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in ] xstruct * foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo = NULL ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_OK ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-push" ,
2005-05-17 16:17:42 +04:00
'
typedef struct {
2005-05-17 17:19:40 +04:00
uint16 x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in , ref ] xstruct * foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
struct xstruct s ;
s . x = 13 ;
r . in . foo = & s ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 2 )
return 2 ;
if ( ndr - > data [ 0 ] != 13 || ndr - > data [ 1 ] != 0 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-push-null" ,
2005-05-17 16:17:42 +04:00
'
typedef struct {
2005-05-17 17:19:40 +04:00
uint16 x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in , ref ] xstruct * foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo = NULL ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_OK ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "uniqueptr-top-push" ,
2005-05-17 16:17:42 +04:00
' typedef struct {
2005-05-17 17:19:40 +04:00
uint16 x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in , unique ] xstruct * foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
struct xstruct s ;
s . x = 13 ;
r . in . foo = & s ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 6 )
return 2 ;
if ( ndr - > data [ 0 ] == 0 && ndr - > data [ 1 ] == 0 &&
ndr - > data [ 2 ] == 0 && ndr - > data [ 3 ] == 0 )
return 3 ;
if ( ndr - > data [ 4 ] != 13 || ndr - > data [ 5 ] != 0 )
return 4 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "uniqueptr-top-push-null" ,
2005-05-17 16:17:42 +04:00
' typedef struct {
2005-05-17 17:19:40 +04:00
uint16 x ;
2005-05-17 16:17:42 +04:00
} xstruct ;
2005-05-17 17:19:40 +04:00
[ public ] uint16 echo_TestRef ( [ in , unique ] xstruct * foo ) ;
2005-05-17 16:17:42 +04:00
' ,
'
struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo = NULL ;
2005-05-17 17:19:40 +04:00
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
2005-05-17 16:17:42 +04:00
return 1 ;
if ( ndr - > offset != 4 )
return 2 ;
if ( ndr - > data [ 0 ] != 0 || ndr - > data [ 1 ] != 0 ||
ndr - > data [ 2 ] != 0 || ndr - > data [ 3 ] != 0 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-out-pull" ,
2005-05-17 17:19:40 +04:00
'
typedef struct {
uint16 x ;
} xstruct ;
[ public ] void echo_TestRef ( [ out ] xstruct * foo ) ;
' ,
'
uint8_t data [] = { 0x0D , 0x00 } ;
DATA_BLOB b = { data , 2 } ;
struct ndr_pull * ndr = ndr_pull_init_blob ( & b , NULL ) ;
struct xstruct s ;
struct echo_TestRef r ;
r . out . foo = & s ;
if ( NT_STATUS_IS_ERR ( ndr_pull_echo_TestRef ( ndr , NDR_OUT , & r ) ) )
return 1 ;
if ( ! r . out . foo )
return 2 ;
if ( r . out . foo - > x != 13 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-out-pull-null" ,
2005-05-17 17:19:40 +04:00
'
typedef struct {
uint16 x ;
} xstruct ;
[ public ] void echo_TestRef ( [ out ] xstruct * foo ) ;
' ,
'
uint8_t data [] = { 0x0D , 0x00 } ;
DATA_BLOB b = { data , 2 } ;
struct ndr_pull * ndr = ndr_pull_init_blob ( & b , NULL ) ;
struct echo_TestRef r ;
r . out . foo = NULL ;
if ( NT_STATUS_IS_OK ( ndr_pull_echo_TestRef ( ndr , NDR_OUT , & r ) ) )
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-out-pull" ,
2005-05-17 17:19:40 +04:00
'
typedef struct {
uint16 x ;
} xstruct ;
[ public ] void echo_TestRef ( [ out , ref ] xstruct * foo ) ;
' ,
'
uint8_t data [] = { 0x0D , 0x00 } ;
DATA_BLOB b = { data , 2 } ;
struct ndr_pull * ndr = ndr_pull_init_blob ( & b , NULL ) ;
struct xstruct s ;
struct echo_TestRef r ;
r . out . foo = & s ;
if ( NT_STATUS_IS_ERR ( ndr_pull_echo_TestRef ( ndr , NDR_OUT , & r ) ) )
return 1 ;
if ( ! r . out . foo )
return 2 ;
if ( r . out . foo - > x != 13 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-out-pull-null" ,
2005-05-17 17:19:40 +04:00
'
typedef struct {
uint16 x ;
} xstruct ;
[ public ] void echo_TestRef ( [ out , ref ] xstruct * foo ) ;
' ,
'
uint8_t data [] = { 0x0D , 0x00 } ;
DATA_BLOB b = { data , 2 } ;
struct ndr_pull * ndr = ndr_pull_init_blob ( & b , NULL ) ;
struct echo_TestRef r ;
r . out . foo = NULL ;
if ( NT_STATUS_IS_OK ( ndr_pull_echo_TestRef ( ndr , NDR_OUT , & r ) ) )
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-push-double" ,
2005-05-17 17:19:40 +04:00
'
[ public ] void echo_TestRef ( [ in ] uint16 ** foo ) ;
' ,
' struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
uint16_t v = 13 ;
uint16_t * pv = & v ;
r . in . foo = & pv ;
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
return 1 ;
if ( ndr - > offset != 6 )
return 2 ;
if ( ndr - > data [ 0 ] == 0 && ndr - > data [ 1 ] == 0 &&
ndr - > data [ 2 ] == 0 && ndr - > data [ 3 ] == 0 )
return 3 ;
if ( ndr - > data [ 4 ] != 0x0D || ndr - > data [ 5 ] != 0x00 )
return 4 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-push-double-sndnull" ,
2005-05-17 17:19:40 +04:00
'
[ public ] void echo_TestRef ( [ in ] uint16 ** foo ) ;
' ,
' struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
uint16_t * pv = NULL ;
r . in . foo = & pv ;
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
return 1 ;
if ( ndr - > offset != 4 )
return 2 ;
if ( ndr - > data [ 0 ] != 0 || ndr - > data [ 1 ] != 0 ||
ndr - > data [ 2 ] != 0 || ndr - > data [ 3 ] != 0 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "ptr-top-push-double-fstnull" ,
2005-05-17 17:19:40 +04:00
'
[ public ] void echo_TestRef ( [ in ] uint16 ** foo ) ;
' ,
' struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo = NULL ;
if ( NT_STATUS_IS_OK ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-push-double" ,
2005-05-17 17:19:40 +04:00
'
[ public ] void echo_TestRef ( [ in , ref ] uint16 ** foo ) ;
' ,
' struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
uint16_t v = 13 ;
uint16_t * pv = & v ;
r . in . foo = & pv ;
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
return 1 ;
if ( ndr - > offset != 6 )
return 2 ;
if ( ndr - > data [ 0 ] == 0 && ndr - > data [ 1 ] == 0 &&
ndr - > data [ 2 ] == 0 && ndr - > data [ 3 ] == 0 )
return 3 ;
if ( ndr - > data [ 4 ] != 0x0D || ndr - > data [ 5 ] != 0x00 )
return 4 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-push-double-sndnull" ,
2005-05-17 17:19:40 +04:00
'
[ public ] void echo_TestRef ( [ in , ref ] uint16 ** foo ) ;
' ,
' struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
uint16_t * pv = NULL ;
r . in . foo = & pv ;
if ( NT_STATUS_IS_ERR ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
return 1 ;
if ( ndr - > offset != 4 )
return 2 ;
if ( ndr - > data [ 0 ] != 0 || ndr - > data [ 1 ] != 0 ||
ndr - > data [ 2 ] != 0 || ndr - > data [ 3 ] != 0 )
return 3 ;
' ) ;
2005-12-25 06:04:13 +03:00
test_samba4_ndr ( "refptr-top-push-double-fstnull" ,
2005-05-17 17:19:40 +04:00
'
[ public ] void echo_TestRef ( [ in , ref ] uint16 ** foo ) ;
' ,
' struct ndr_push * ndr = ndr_push_init ( ) ;
struct echo_TestRef r ;
r . in . foo = NULL ;
if ( NT_STATUS_IS_OK ( ndr_push_echo_TestRef ( ndr , NDR_IN , & r ) ) )
return 1 ;
/* Windows gives [client runtime error 0x6f4] */
' ) ;
2005-06-04 17:57:52 +04:00
2005-12-25 06:04:13 +03:00
#FIXME: Not supported yet
#test_samba4_ndr("ignore-ptr",
#'
# [public] void echo_TestRef([in,ignore] uint16 *foo, [in] uint16 *bar);
#',
#' struct ndr_push *ndr = ndr_push_init();
# struct echo_TestRef r;
# uint16_t v = 10;
# r.in.foo = &v;
# r.in.bar = &v;
#
# if (NT_STATUS_IS_OK(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
# return 1;
#
# if (ndr->offset != 4)
# return 2;
#');