📄 ndr_refptr.pl
字号:
#!/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;');}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -