mirror of
https://github.com/samba-team/samba.git
synced 2025-02-10 13:57:47 +03:00
Samba present. Ignore tests that are known to fail for now. (This used to be commit a7279f13f0431a5036c931c5339542f98139c461)
528 lines
10 KiB
Perl
Executable File
528 lines
10 KiB
Perl
Executable File
#!/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/../lib";
|
|
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();
|
|
uint16_t v = 13;
|
|
struct echo_TestRef r;
|
|
r.in.foo.x = v;
|
|
|
|
if (NT_STATUS_IS_ERR(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();
|
|
struct echo_TestRef r;
|
|
r.in.foo.x = &v;
|
|
|
|
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] != 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();
|
|
struct echo_TestRef r;
|
|
r.in.foo.x = NULL;
|
|
|
|
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;
|
|
');
|
|
|
|
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();
|
|
struct echo_TestRef r;
|
|
r.in.foo.x = &v;
|
|
|
|
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] != 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();
|
|
struct echo_TestRef r;
|
|
r.in.foo.x = NULL;
|
|
|
|
if (NT_STATUS_IS_OK(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();
|
|
struct echo_TestRef r;
|
|
struct xstruct s;
|
|
s.x = 13;
|
|
r.in.foo = &s;
|
|
|
|
if (NT_STATUS_IS_ERR(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();
|
|
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] */
|
|
');
|
|
|
|
|
|
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();
|
|
struct echo_TestRef r;
|
|
struct xstruct s;
|
|
s.x = 13;
|
|
r.in.foo = &s;
|
|
|
|
if (NT_STATUS_IS_ERR(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();
|
|
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] */
|
|
');
|
|
|
|
|
|
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();
|
|
struct echo_TestRef r;
|
|
struct xstruct s;
|
|
s.x = 13;
|
|
r.in.foo = &s;
|
|
|
|
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] != 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();
|
|
struct echo_TestRef r;
|
|
r.in.foo = NULL;
|
|
|
|
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;
|
|
');
|
|
|
|
|
|
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);
|
|
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;
|
|
');
|
|
|
|
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);
|
|
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] */
|
|
');
|
|
|
|
|
|
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);
|
|
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;
|
|
');
|
|
|
|
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);
|
|
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] */
|
|
');
|
|
|
|
|
|
test_samba4_ndr("ptr-top-push-double",
|
|
'
|
|
[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;
|
|
');
|
|
|
|
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();
|
|
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;
|
|
');
|
|
}
|
|
|
|
test_samba4_ndr("ptr-top-push-double-fstnull",
|
|
'
|
|
[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] */
|
|
|
|
');
|
|
|
|
|
|
test_samba4_ndr("refptr-top-push-double",
|
|
'
|
|
[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;
|
|
');
|
|
|
|
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();
|
|
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;
|
|
');
|
|
}
|
|
|
|
test_samba4_ndr("refptr-top-push-double-fstnull",
|
|
'
|
|
[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] */
|
|
|
|
');
|
|
|
|
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();
|
|
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;
|
|
');
|
|
}
|