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