1/* 2 Unix SMB/CIFS implementation. 3 test suite for basic tdr functions 4 5 Copyright (C) Jelmer Vernooij 2007 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. 19*/ 20 21#include "includes.h" 22#include "torture/torture.h" 23#include "lib/tdr/tdr.h" 24 25static bool test_push_uint8(struct torture_context *tctx) 26{ 27 uint8_t v = 4; 28 struct tdr_push *tdr = tdr_push_init(tctx, global_iconv_convenience); 29 30 torture_assert_ntstatus_ok(tctx, tdr_push_uint8(tdr, &v), "push failed"); 31 torture_assert_int_equal(tctx, tdr->data.length, 1, "length incorrect"); 32 torture_assert_int_equal(tctx, tdr->data.data[0], 4, "data incorrect"); 33 return true; 34} 35 36static bool test_pull_uint8(struct torture_context *tctx) 37{ 38 uint8_t d = 2; 39 uint8_t l; 40 struct tdr_pull *tdr = tdr_pull_init(tctx, global_iconv_convenience); 41 tdr->data.data = &d; 42 tdr->data.length = 1; 43 tdr->offset = 0; 44 tdr->flags = 0; 45 torture_assert_ntstatus_ok(tctx, tdr_pull_uint8(tdr, tctx, &l), 46 "pull failed"); 47 torture_assert_int_equal(tctx, 1, tdr->offset, 48 "offset invalid"); 49 return true; 50} 51 52static bool test_push_uint16(struct torture_context *tctx) 53{ 54 uint16_t v = 0xF32; 55 struct tdr_push *tdr = tdr_push_init(tctx, global_iconv_convenience); 56 57 torture_assert_ntstatus_ok(tctx, tdr_push_uint16(tdr, &v), "push failed"); 58 torture_assert_int_equal(tctx, tdr->data.length, 2, "length incorrect"); 59 torture_assert_int_equal(tctx, tdr->data.data[0], 0x32, "data incorrect"); 60 torture_assert_int_equal(tctx, tdr->data.data[1], 0x0F, "data incorrect"); 61 return true; 62} 63 64static bool test_pull_uint16(struct torture_context *tctx) 65{ 66 uint8_t d[2] = { 782 & 0xFF, (782 & 0xFF00) / 0x100 }; 67 uint16_t l; 68 struct tdr_pull *tdr = tdr_pull_init(tctx, global_iconv_convenience); 69 tdr->data.data = d; 70 tdr->data.length = 2; 71 tdr->offset = 0; 72 tdr->flags = 0; 73 torture_assert_ntstatus_ok(tctx, tdr_pull_uint16(tdr, tctx, &l), 74 "pull failed"); 75 torture_assert_int_equal(tctx, 2, tdr->offset, "offset invalid"); 76 torture_assert_int_equal(tctx, 782, l, "right int read"); 77 return true; 78} 79 80static bool test_push_uint32(struct torture_context *tctx) 81{ 82 uint32_t v = 0x100F32; 83 struct tdr_push *tdr = tdr_push_init(tctx, global_iconv_convenience); 84 85 torture_assert_ntstatus_ok(tctx, tdr_push_uint32(tdr, &v), "push failed"); 86 torture_assert_int_equal(tctx, tdr->data.length, 4, "length incorrect"); 87 torture_assert_int_equal(tctx, tdr->data.data[0], 0x32, "data incorrect"); 88 torture_assert_int_equal(tctx, tdr->data.data[1], 0x0F, "data incorrect"); 89 torture_assert_int_equal(tctx, tdr->data.data[2], 0x10, "data incorrect"); 90 torture_assert_int_equal(tctx, tdr->data.data[3], 0x00, "data incorrect"); 91 return true; 92} 93 94static bool test_pull_uint32(struct torture_context *tctx) 95{ 96 uint8_t d[4] = { 782 & 0xFF, (782 & 0xFF00) / 0x100, 0, 0 }; 97 uint32_t l; 98 struct tdr_pull *tdr = tdr_pull_init(tctx, global_iconv_convenience); 99 tdr->data.data = d; 100 tdr->data.length = 4; 101 tdr->offset = 0; 102 tdr->flags = 0; 103 torture_assert_ntstatus_ok(tctx, tdr_pull_uint32(tdr, tctx, &l), 104 "pull failed"); 105 torture_assert_int_equal(tctx, 4, tdr->offset, "offset invalid"); 106 torture_assert_int_equal(tctx, 782, l, "right int read"); 107 return true; 108} 109 110static bool test_pull_charset(struct torture_context *tctx) 111{ 112 struct tdr_pull *tdr = tdr_pull_init(tctx, global_iconv_convenience); 113 const char *l = NULL; 114 tdr->data.data = (uint8_t *)talloc_strdup(tctx, "bla"); 115 tdr->data.length = 4; 116 tdr->offset = 0; 117 tdr->flags = 0; 118 torture_assert_ntstatus_ok(tctx, tdr_pull_charset(tdr, tctx, &l, -1, 1, CH_DOS), 119 "pull failed"); 120 torture_assert_int_equal(tctx, 4, tdr->offset, "offset invalid"); 121 torture_assert_str_equal(tctx, "bla", l, "right int read"); 122 123 tdr->offset = 0; 124 torture_assert_ntstatus_ok(tctx, tdr_pull_charset(tdr, tctx, &l, 2, 1, CH_UNIX), 125 "pull failed"); 126 torture_assert_int_equal(tctx, 2, tdr->offset, "offset invalid"); 127 torture_assert_str_equal(tctx, "bl", l, "right int read"); 128 129 return true; 130} 131 132static bool test_pull_charset_empty(struct torture_context *tctx) 133{ 134 struct tdr_pull *tdr = tdr_pull_init(tctx, global_iconv_convenience); 135 const char *l = NULL; 136 tdr->data.data = (uint8_t *)talloc_strdup(tctx, "bla"); 137 tdr->data.length = 4; 138 tdr->offset = 0; 139 tdr->flags = 0; 140 torture_assert_ntstatus_ok(tctx, tdr_pull_charset(tdr, tctx, &l, 0, 1, CH_DOS), 141 "pull failed"); 142 torture_assert_int_equal(tctx, 0, tdr->offset, "offset invalid"); 143 torture_assert_str_equal(tctx, "", l, "right string read"); 144 145 return true; 146} 147 148 149 150static bool test_push_charset(struct torture_context *tctx) 151{ 152 const char *l = "bloe"; 153 struct tdr_push *tdr = tdr_push_init(tctx, global_iconv_convenience); 154 torture_assert_ntstatus_ok(tctx, tdr_push_charset(tdr, &l, 4, 1, CH_UTF8), 155 "push failed"); 156 torture_assert_int_equal(tctx, 4, tdr->data.length, "offset invalid"); 157 torture_assert(tctx, strcmp("bloe", (const char *)tdr->data.data) == 0, "right string push"); 158 159 torture_assert_ntstatus_ok(tctx, tdr_push_charset(tdr, &l, -1, 1, CH_UTF8), 160 "push failed"); 161 torture_assert_int_equal(tctx, 9, tdr->data.length, "offset invalid"); 162 torture_assert_str_equal(tctx, "bloe", (const char *)tdr->data.data+4, "right string read"); 163 164 return true; 165} 166 167struct torture_suite *torture_local_tdr(TALLOC_CTX *mem_ctx) 168{ 169 struct torture_suite *suite = torture_suite_create(mem_ctx, "TDR"); 170 171 torture_suite_add_simple_test(suite, "pull_uint8", test_pull_uint8); 172 torture_suite_add_simple_test(suite, "push_uint8", test_push_uint8); 173 174 torture_suite_add_simple_test(suite, "pull_uint16", test_pull_uint16); 175 torture_suite_add_simple_test(suite, "push_uint16", test_push_uint16); 176 177 torture_suite_add_simple_test(suite, "pull_uint32", test_pull_uint32); 178 torture_suite_add_simple_test(suite, "push_uint32", test_push_uint32); 179 180 torture_suite_add_simple_test(suite, "pull_charset", test_pull_charset); 181 torture_suite_add_simple_test(suite, "pull_charset", test_pull_charset_empty); 182 torture_suite_add_simple_test(suite, "push_charset", test_push_charset); 183 184 return suite; 185} 186