nexmon – Rev 1

Subversion Repositories:
Rev:
#!/usr/bin/perl
# Simple tests for pidl's handling of ref pointers, based
# on tridge's ref_notes.txt
# (C) 2005 Jelmer Vernooij <jelmer@samba.org>.
# Published under the GNU General Public License.
use strict;

use Test::More tests => 22 * 8;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util qw(test_samba4_ndr);

test_samba4_ndr("noptr-push", 
'       typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        uint16_t v = 13;
        struct echo_TestRef r;
        r.in.foo.x = v; 

        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r))) {
                fprintf(stderr, "push failed\n");
                return 1;
        }

        if (ndr->offset != 2) {
                fprintf(stderr, "Offset(%d) != 2\n", ndr->offset);
                return 2;
        }

        if (ndr->data[0] != 13 || ndr->data[1] != 0) {
                fprintf(stderr, "Data incorrect\n");
                return 3;
        }
');

test_samba4_ndr("ptr-embedded-push", 
'   typedef struct {
                uint16 *x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct foo);
',
'
        uint16_t v = 13;
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo.x = &v; 

        if (!NDR_ERR_CODE_IS_SUCCESS(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] != 13 || ndr->data[5] != 0)
                return 4;
');

test_samba4_ndr("ptr-embedded-push-null", 
'   typedef struct {
                uint16 *x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo.x = NULL; 

        if (!NDR_ERR_CODE_IS_SUCCESS(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;
');

test_samba4_ndr("refptr-embedded-push", 
'
        typedef struct {
                [ref] uint16 *x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct foo);
',
'
        uint16_t v = 13;
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo.x = &v; 

        if (!NDR_ERR_CODE_IS_SUCCESS(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] != 13 || ndr->data[5] != 0)
                return 4;
');

test_samba4_ndr("refptr-embedded-push-null", 
'
        typedef struct {
                [ref] uint16 *x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo.x = NULL; 

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;
        /* Windows gives [client runtime error 0x6f4] */
');

test_samba4_ndr("ptr-top-push", 
'
        typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct *foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        struct xstruct s;
        s.x = 13;
        r.in.foo = &s;

        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;

        if (ndr->offset != 2)
                return 2;

        if (ndr->data[0] != 13 || ndr->data[1] != 0)
                return 3;
');

test_samba4_ndr("ptr-top-push-null", 
'
        typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in] xstruct *foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo = NULL;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;

        /* Windows gives [client runtime error 0x6f4] */
');


test_samba4_ndr("refptr-top-push", 
'
        typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in,ref] xstruct *foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        struct xstruct s;
        s.x = 13;
        r.in.foo = &s;

        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;

        if (ndr->offset != 2)
                return 2;

        if (ndr->data[0] != 13 || ndr->data[1] != 0)
                return 3;
');

test_samba4_ndr("refptr-top-push-null", 
'
        typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in,ref] xstruct *foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo = NULL;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;

        /* Windows gives [client runtime error 0x6f4] */
');


test_samba4_ndr("uniqueptr-top-push", 
'       typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in,unique] xstruct *foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        struct xstruct s;
        s.x = 13;
        r.in.foo = &s;

        if (!NDR_ERR_CODE_IS_SUCCESS(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] != 13 || ndr->data[5] != 0)
                return 4;
');

test_samba4_ndr("uniqueptr-top-push-null", 
'       typedef struct {
                uint16 x;
        } xstruct;

        [public] uint16 echo_TestRef([in,unique] xstruct *foo);
',
'
        struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo = NULL;

        if (!NDR_ERR_CODE_IS_SUCCESS(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;
');


test_samba4_ndr("ptr-top-out-pull", 
'
        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, NULL);
        struct xstruct s;
        struct echo_TestRef r;

        r.out.foo = &s;

        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_echo_TestRef(ndr, NDR_OUT, &r)))
                return 1;

        if (!r.out.foo)
                return 2;

        if (r.out.foo->x != 13)
                return 3;
');     

test_samba4_ndr("ptr-top-out-pull-null", 
'
        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, NULL);
        struct echo_TestRef r;

        r.out.foo = NULL;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_echo_TestRef(ndr, NDR_OUT, &r)))
                return 1;
        
        /* Windows gives [client runtime error 0x6f4] */
');


test_samba4_ndr("refptr-top-out-pull", 
'
        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, NULL);
        struct xstruct s;
        struct echo_TestRef r;

        r.out.foo = &s;

        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_echo_TestRef(ndr, NDR_OUT, &r)))
                return 1;

        if (!r.out.foo)
                return 2;

        if (r.out.foo->x != 13)
                return 3;
');     

test_samba4_ndr("refptr-top-out-pull-null", 
'
        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, NULL);
        struct echo_TestRef r;

        r.out.foo = NULL;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_echo_TestRef(ndr, NDR_OUT, &r)))
                return 1;
        
        /* Windows gives [client runtime error 0x6f4] */
');


test_samba4_ndr("ptr-top-push-double", 
'
        [public] void echo_TestRef([in] uint16 **foo);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        uint16_t v = 13;
        uint16_t *pv = &v;
        r.in.foo = &pv;

        if (!NDR_ERR_CODE_IS_SUCCESS(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;
');

SKIP: {
        skip "ptr-top-push-double-sndnull is known to fail", 8;

test_samba4_ndr("ptr-top-push-double-sndnull", 
'
        [public] void echo_TestRef([in] uint16 **foo);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        uint16_t *pv = NULL;
        r.in.foo = &pv;

        if (!NDR_ERR_CODE_IS_SUCCESS(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;
');
}

test_samba4_ndr("ptr-top-push-double-fstnull", 
'
        [public] void echo_TestRef([in] uint16 **foo);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo = NULL;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;
        
        /* Windows gives [client runtime error 0x6f4] */

');


test_samba4_ndr("refptr-top-push-double", 
'
        [public] void echo_TestRef([in,ref] uint16 **foo);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        uint16_t v = 13;
        uint16_t *pv = &v;
        r.in.foo = &pv;

        if (!NDR_ERR_CODE_IS_SUCCESS(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;
');

SKIP: {

        skip "refptr-top-push-double-sndnull is known to fail", 8;

test_samba4_ndr("refptr-top-push-double-sndnull", 
'
        [public] void echo_TestRef([in,ref] uint16 **foo);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        uint16_t *pv = NULL;
        r.in.foo = &pv;

        if (!NDR_ERR_CODE_IS_SUCCESS(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;
');
}

test_samba4_ndr("refptr-top-push-double-fstnull", 
'
        [public] void echo_TestRef([in,ref] uint16 **foo);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        r.in.foo = NULL;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;
        
        /* Windows gives [client runtime error 0x6f4] */

');

SKIP: {
        skip "ignore-ptrs are not supported yet", 8;
test_samba4_ndr("ignore-ptr", 
'
        [public] void echo_TestRef([in,ignore] uint16 *foo, [in] uint16 *bar);
',
'       struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
        struct echo_TestRef r;
        uint16_t v = 10;
        r.in.foo = &v; 
        r.in.bar = &v;

        if (NDR_ERR_CODE_IS_SUCCESS(ndr_push_echo_TestRef(ndr, NDR_IN, &r)))
                return 1;

        if (ndr->offset != 4)
                return 2;
');
}