root/source4/torture/ndr/ndr.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wrap_ndr_pull_test
  2. _torture_suite_add_ndr_pull_test
  3. test_check_string_terminator
  4. test_guid_from_string_valid
  5. test_guid_from_string_null
  6. test_guid_from_string_invalid
  7. test_guid_from_string
  8. test_guid_string_valid
  9. test_guid_string2_valid
  10. test_compare_uuid
  11. torture_local_ndr

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    test suite for winreg ndr operations
   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/ndr/ndr.h"
  23 #include "torture/ndr/proto.h"
  24 #include "torture/torture.h"
  25 #include "../lib/util/dlinklist.h"
  26 #include "param/param.h"
  27 
  28 struct ndr_pull_test_data {
  29         DATA_BLOB data;
  30         size_t struct_size;
  31         ndr_pull_flags_fn_t pull_fn;
  32         int ndr_flags;
  33 };
  34 
  35 static bool wrap_ndr_pull_test(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
  36                                                            struct torture_tcase *tcase,
  37                                                            struct torture_test *test)
  38 {
  39         bool (*check_fn) (struct torture_context *ctx, void *data) = test->fn;
  40         const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data;
  41         void *ds = talloc_zero_size(tctx, data->struct_size);
  42         struct ndr_pull *ndr = ndr_pull_init_blob(&(data->data), tctx, lp_iconv_convenience(tctx->lp_ctx));
  43 
  44         ndr->flags |= LIBNDR_FLAG_REF_ALLOC;
  45 
  46         torture_assert_ndr_success(tctx, data->pull_fn(ndr, data->ndr_flags, ds),
  47                                    "pulling");
  48 
  49         torture_assert(tctx, ndr->offset == ndr->data_size, 
  50                                    talloc_asprintf(tctx, 
  51                                            "%d unread bytes", ndr->data_size - ndr->offset));
  52 
  53         if (check_fn != NULL) 
  54                 return check_fn(tctx, ds);
  55         else
  56                 return true;
  57 }
  58 
  59 _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test(
     /* [<][>][^][v][top][bottom][index][help] */
  60                                         struct torture_suite *suite, 
  61                                         const char *name, ndr_pull_flags_fn_t pull_fn,
  62                                         DATA_BLOB db, 
  63                                         size_t struct_size,
  64                                         int ndr_flags,
  65                                         bool (*check_fn) (struct torture_context *ctx, void *data))
  66 {
  67         struct torture_test *test; 
  68         struct torture_tcase *tcase;
  69         struct ndr_pull_test_data *data;
  70         
  71         tcase = torture_suite_add_tcase(suite, name);
  72 
  73         test = talloc(tcase, struct torture_test);
  74 
  75         test->name = talloc_strdup(test, name);
  76         test->description = NULL;
  77         test->run = wrap_ndr_pull_test;
  78         data = talloc(test, struct ndr_pull_test_data);
  79         data->data = db;
  80         data->ndr_flags = ndr_flags;
  81         data->struct_size = struct_size;
  82         data->pull_fn = pull_fn;
  83         test->data = data;
  84         test->fn = check_fn;
  85         test->dangerous = false;
  86 
  87         DLIST_ADD_END(tcase->tests, test, struct torture_test *);
  88 
  89         return test;
  90 }
  91 
  92 static bool test_check_string_terminator(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
  93 {
  94         struct ndr_pull *ndr;
  95         DATA_BLOB blob;
  96         TALLOC_CTX *mem_ctx = tctx;
  97 
  98         /* Simple test */
  99         blob = strhex_to_data_blob(tctx, "0000");
 100         
 101         ndr = ndr_pull_init_blob(&blob, mem_ctx, lp_iconv_convenience(tctx->lp_ctx));
 102 
 103         torture_assert_ndr_success(tctx, ndr_check_string_terminator(ndr, 1, 2),
 104                                    "simple check_string_terminator test failed");
 105 
 106         torture_assert(tctx, ndr->offset == 0,
 107                 "check_string_terminator did not reset offset");
 108 
 109         if (NDR_ERR_CODE_IS_SUCCESS(ndr_check_string_terminator(ndr, 1, 3))) {
 110                 torture_fail(tctx, "check_string_terminator checked beyond string boundaries");
 111         }
 112 
 113         torture_assert(tctx, ndr->offset == 0, 
 114                 "check_string_terminator did not reset offset");
 115 
 116         talloc_free(ndr);
 117 
 118         blob = strhex_to_data_blob(tctx, "11220000");
 119         ndr = ndr_pull_init_blob(&blob, mem_ctx, lp_iconv_convenience(tctx->lp_ctx));
 120 
 121         torture_assert_ndr_success(tctx,
 122                 ndr_check_string_terminator(ndr, 4, 1),
 123                 "check_string_terminator failed to recognize terminator");
 124 
 125         torture_assert_ndr_success(tctx,
 126                 ndr_check_string_terminator(ndr, 3, 1),
 127                 "check_string_terminator failed to recognize terminator");
 128 
 129         if (NDR_ERR_CODE_IS_SUCCESS(ndr_check_string_terminator(ndr, 2, 1))) {
 130                 torture_fail(tctx, "check_string_terminator erroneously reported terminator");
 131         }
 132 
 133         torture_assert(tctx, ndr->offset == 0,
 134                 "check_string_terminator did not reset offset");
 135         return true;
 136 }
 137 
 138 static bool test_guid_from_string_valid(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 139 {
 140         /* FIXME */
 141         return true;
 142 }
 143 
 144 static bool test_guid_from_string_null(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 145 {
 146         struct GUID guid;
 147         torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, 
 148                                                                   GUID_from_string(NULL, &guid), 
 149                                                                   "NULL failed");
 150         return true;
 151 }
 152 
 153 static bool test_guid_from_string_invalid(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 154 {
 155         struct GUID g1;
 156         torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, 
 157                                                                   GUID_from_string("bla", &g1),
 158                                                                   "parameter not invalid");
 159         return true;
 160 }       
 161 
 162 static bool test_guid_from_string(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 163 {
 164         struct GUID g1, exp;
 165         torture_assert_ntstatus_ok(tctx,
 166                                                            GUID_from_string("00000001-0002-0003-0405-060708090a0b", &g1),
 167                                                            "invalid return code");
 168         exp.time_low = 1;
 169         exp.time_mid = 2;
 170         exp.time_hi_and_version = 3;
 171         exp.clock_seq[0] = 4;
 172         exp.clock_seq[1] = 5;
 173         exp.node[0] = 6;
 174         exp.node[1] = 7;
 175         exp.node[2] = 8;
 176         exp.node[3] = 9;
 177         exp.node[4] = 10;
 178         exp.node[5] = 11;
 179         torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly");
 180         torture_assert_ntstatus_ok(tctx,
 181                                                            GUID_from_string("{00000001-0002-0003-0405-060708090a0b}", &g1),
 182                                                            "invalid return code");
 183         torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly");
 184 
 185         return true;
 186 }
 187 
 188 static bool test_guid_string_valid(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 189 {
 190         struct GUID g;
 191         g.time_low = 1;
 192         g.time_mid = 2;
 193         g.time_hi_and_version = 3;
 194         g.clock_seq[0] = 4;
 195         g.clock_seq[1] = 5;
 196         g.node[0] = 6;
 197         g.node[1] = 7;
 198         g.node[2] = 8;
 199         g.node[3] = 9;
 200         g.node[4] = 10;
 201         g.node[5] = 11;
 202         torture_assert_str_equal(tctx, "00000001-0002-0003-0405-060708090a0b", GUID_string(tctx, &g), 
 203                                                          "parsing guid failed");
 204         return true;
 205 }
 206 
 207 static bool test_guid_string2_valid(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 208 {
 209         struct GUID g;
 210         g.time_low = 1;
 211         g.time_mid = 2;
 212         g.time_hi_and_version = 3;
 213         g.clock_seq[0] = 4;
 214         g.clock_seq[1] = 5;
 215         g.node[0] = 6;
 216         g.node[1] = 7;
 217         g.node[2] = 8;
 218         g.node[3] = 9;
 219         g.node[4] = 10;
 220         g.node[5] = 11;
 221         torture_assert_str_equal(tctx, "{00000001-0002-0003-0405-060708090a0b}", GUID_string2(tctx, &g), 
 222                                                          "parsing guid failed");
 223         return true;
 224 }
 225 
 226 static bool test_compare_uuid(struct torture_context *tctx)
     /* [<][>][^][v][top][bottom][index][help] */
 227 {
 228         struct GUID g1, g2;
 229         ZERO_STRUCT(g1); ZERO_STRUCT(g2);
 230         torture_assert_int_equal(tctx, 0, GUID_compare(&g1, &g2), 
 231                                                          "GUIDs not equal");
 232         g1.time_low = 1;
 233         torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), 
 234                                                          "GUID diff invalid");
 235 
 236         g1.time_low = 10;
 237         torture_assert_int_equal(tctx, 10, GUID_compare(&g1, &g2), 
 238                                                          "GUID diff invalid");
 239 
 240         g1.time_low = 0;
 241         g1.clock_seq[1] = 20;
 242         torture_assert_int_equal(tctx, 20, GUID_compare(&g1, &g2), 
 243                                                          "GUID diff invalid");
 244         return true;
 245 }
 246 
 247 struct torture_suite *torture_local_ndr(TALLOC_CTX *mem_ctx)
     /* [<][>][^][v][top][bottom][index][help] */
 248 {
 249         struct torture_suite *suite = torture_suite_create(mem_ctx, "NDR");
 250 
 251         torture_suite_add_suite(suite, ndr_winreg_suite(suite));
 252         torture_suite_add_suite(suite, ndr_atsvc_suite(suite));
 253         torture_suite_add_suite(suite, ndr_lsa_suite(suite));
 254         torture_suite_add_suite(suite, ndr_epmap_suite(suite));
 255         torture_suite_add_suite(suite, ndr_dfs_suite(suite));
 256         torture_suite_add_suite(suite, ndr_netlogon_suite(suite));
 257         torture_suite_add_suite(suite, ndr_drsuapi_suite(suite));
 258         torture_suite_add_suite(suite, ndr_spoolss_suite(suite));
 259         torture_suite_add_suite(suite, ndr_samr_suite(suite));
 260 
 261         torture_suite_add_simple_test(suite, "string terminator", 
 262                                                                    test_check_string_terminator);
 263 
 264         torture_suite_add_simple_test(suite, "guid_from_string_null", 
 265                                                                    test_guid_from_string_null);
 266 
 267         torture_suite_add_simple_test(suite, "guid_from_string", 
 268                                                                    test_guid_from_string);
 269 
 270         torture_suite_add_simple_test(suite, "guid_from_string_invalid", 
 271                                                                    test_guid_from_string_invalid);
 272 
 273         torture_suite_add_simple_test(suite, "guid_string_valid", 
 274                                                                    test_guid_string_valid);
 275 
 276         torture_suite_add_simple_test(suite, "guid_string2_valid", 
 277                                                                    test_guid_string2_valid);
 278 
 279         torture_suite_add_simple_test(suite, "guid_from_string_valid", 
 280                                                                    test_guid_from_string_valid);
 281 
 282         torture_suite_add_simple_test(suite, "compare_uuid", 
 283                                                                    test_compare_uuid);
 284 
 285         return suite;
 286 }
 287 

/* [<][>][^][v][top][bottom][index][help] */