1#!/usr/bin/perl
2# NDR allocation tests
3# (C) 2005 Jelmer Vernooij. Published under the GNU GPL
4use strict;
5
6use Test::More tests => 5 * 8;
7use FindBin qw($RealBin);
8use lib "$RealBin";
9use Util qw(test_samba4_ndr);
10
11# Check that an outgoing scalar pointer is allocated correctly
12
13test_samba4_ndr("alloc-scalar",
14'
15	typedef struct {
16		uint8 *x;
17	} bla;
18
19	[public] void TestAlloc([in] bla foo);
20','
21	uint8_t data[] = { 0xde, 0xad, 0xbe, 0xef, 0x03 };
22	DATA_BLOB b = { data, 5 };
23	struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL, NULL);
24	struct TestAlloc r;
25
26	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestAlloc(ndr, NDR_IN, &r)))
27		return 1;
28
29	if (r.in.foo.x == NULL)
30		return 2;
31
32	if (*r.in.foo.x != 0x03)
33		return 3;
34'
35);
36
37# Check that an outgoing buffer pointer is allocated correctly
38test_samba4_ndr("alloc-buffer",
39'
40	typedef struct { uint8 data; } blie;
41	typedef struct { blie *x; } bla;
42
43	[public] void TestAlloc([in] bla foo);
44','
45	uint8_t data[] = { 0xde, 0xad, 0xbe, 0xef, 0x03 };
46	DATA_BLOB b = { data, 5 };
47	struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL, NULL);
48	struct TestAlloc r;
49
50	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestAlloc(ndr, NDR_IN, &r)))
51		return 1;
52
53	if (r.in.foo.x == NULL)
54		return 2;
55
56	if (r.in.foo.x->data != 0x03)
57		return 3;
58'
59);
60
61# Check that ref pointers aren't allocated by default
62test_samba4_ndr("ref-noalloc-null",
63'
64	[public] void TestAlloc([in,ref] uint8 *t);
65','
66	uint8_t data[] = { 0x03 };
67	DATA_BLOB b = { data, 1 };
68	struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL, NULL);
69	struct TestAlloc r;
70	r.in.t = NULL;
71
72	if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestAlloc(ndr, NDR_IN, &r)))
73		return 1;
74'
75);
76
77# Check that ref pointers aren't allocated by default
78test_samba4_ndr("ref-noalloc",
79'
80	[public] void TestAlloc([in,ref] uint8 *t);
81','
82	uint8_t data[] = { 0x03 };
83	DATA_BLOB b = { data, 1 };
84	struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL, NULL);
85	struct TestAlloc r;
86	uint8_t x;
87	r.in.t = &x;
88
89	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestAlloc(ndr, NDR_IN, &r)))
90		return 1;
91
92	if (*r.in.t != 0x03)
93		return 2;
94'
95);
96
97# Check that an outgoing ref pointer is allocated correctly
98test_samba4_ndr("ref-alloc",
99'
100	[public] void TestAlloc([in,ref] uint8 *t);
101','
102	uint8_t data[] = { 0x03 };
103	DATA_BLOB b = { data, 1 };
104	struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL, NULL);
105	struct TestAlloc r;
106	ndr->flags |= LIBNDR_FLAG_REF_ALLOC;
107	r.in.t = NULL;
108
109	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestAlloc(ndr, NDR_IN, &r)))
110		return 1;
111
112	if (r.in.t == NULL)
113		return 2;
114
115	if (*r.in.t != 0x03)
116		return 3;
117'
118);
119