1#!/usr/bin/perl
2# NDR alignment 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
11test_samba4_ndr('align-uint8-uint16',
12'
13	typedef [public] struct {
14		uint8 x;
15		uint16 y;
16	} bla;
17',
18'
19	struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
20	struct bla r;
21	uint8_t expected[] = { 0x0D, 0x00, 0xef, 0xbe };
22	DATA_BLOB expected_blob = { expected, 4 };
23	DATA_BLOB result_blob;
24	r.x = 13;
25	r.y = 0xbeef;
26
27	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_bla(ndr, NDR_SCALARS|NDR_BUFFERS, &r)))
28		return 1;
29
30	result_blob = ndr_push_blob(ndr);
31
32	if (data_blob_cmp(&result_blob, &expected_blob) != 0)
33		return 2;
34');
35
36test_samba4_ndr('align-uint8-uint32',
37'
38	typedef [public] struct {
39		uint8 x;
40		uint32 y;
41	} bla;
42',
43'
44	struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
45	struct bla r;
46	uint8_t expected[] = { 0x0D, 0x00, 0x00, 0x00, 0xef, 0xbe, 0xef, 0xbe };
47	DATA_BLOB expected_blob = { expected, 8 };
48	DATA_BLOB result_blob;
49	r.x = 13;
50	r.y = 0xbeefbeef;
51
52	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_bla(ndr, NDR_SCALARS|NDR_BUFFERS, &r)))
53		return 1;
54
55	result_blob = ndr_push_blob(ndr);
56
57	if (data_blob_cmp(&result_blob, &expected_blob) != 0)
58		return 2;
59');
60
61
62test_samba4_ndr('align-uint8-hyper',
63'
64	typedef [public] struct {
65		uint8 x;
66		hyper y;
67	} bla;
68',
69'
70	struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
71	struct bla r;
72	uint8_t expected[] = { 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73			       0xef, 0xbe, 0xef, 0xbe, 0xef, 0xbe, 0xef, 0xbe };
74	DATA_BLOB expected_blob = { expected, 16 };
75	DATA_BLOB result_blob;
76	r.x = 13;
77	r.y = 0xbeefbeefbeefbeefLLU;
78
79	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_bla(ndr, NDR_SCALARS|NDR_BUFFERS, &r)))
80		return 1;
81
82	result_blob = ndr_push_blob(ndr);
83
84	if (data_blob_cmp(&result_blob, &expected_blob) != 0)
85		return 2;
86');
87
88test_samba4_ndr('noalignflag-uint8-uint16',
89'
90	typedef [public] struct {
91		uint8 x;
92		uint16 y;
93	} bla;
94',
95'
96	struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
97	struct bla r;
98	uint8_t expected[] = { 0x0D, 0xef, 0xbe };
99	DATA_BLOB expected_blob = { expected, 3 };
100	DATA_BLOB result_blob;
101	ndr->flags |= LIBNDR_FLAG_NOALIGN;
102
103	r.x = 13;
104	r.y = 0xbeef;
105
106	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_bla(ndr, NDR_SCALARS|NDR_BUFFERS, &r)))
107		return 1;
108
109	result_blob = ndr_push_blob(ndr);
110
111	if (data_blob_cmp(&result_blob, &expected_blob) != 0)
112		return 2;
113');
114
115test_samba4_ndr('align-blob-align2',
116'
117	typedef [public] struct {
118		uint8 x;
119		[flag(LIBNDR_FLAG_ALIGN2)] DATA_BLOB data;
120		uint8 y;
121	} blie;
122',
123'
124	struct ndr_push *ndr = ndr_push_init_ctx(NULL, NULL);
125	struct blie r;
126	uint8_t data[] = { 0x01, 0x02 };
127	uint8_t expected[] = { 0x0D, 0x00, 0x0E };
128	DATA_BLOB expected_blob = { expected, 3 };
129	DATA_BLOB result_blob;
130
131	r.x = 13;
132	r.y = 14;
133	r.data.data = data;
134	r.data.length = 2;
135
136	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_blie(ndr, NDR_SCALARS|NDR_BUFFERS, &r)))
137		return 1;
138
139	result_blob = ndr_push_blob(ndr);
140
141	if (data_blob_cmp(&result_blob, &expected_blob) != 0)
142		return 2;
143');
144