/* t-g13tuple.c - Module test for g13tuple.c * Copyright (C) 2016 Werner Koch * * This file is part of GnuPG. * * GnuPG is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * GnuPG is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include #include #include #include "../common/util.h" #include "keyblob.h" #include "g13tuple.h" #define PGM "t-g13tuple" static int verbose; static int debug; static int errcount; /* Test for the functions append_tuple_uint and find_tuple_unit. */ static void test_tuple_uint (void) { static struct { int tag; int len; char *data; unsigned long long val; gpg_err_code_t ec; } tv[] = { { 1, 0, "", 0, GPG_ERR_ERANGE }, { 2, 1, "\x00", 0, 0}, { 3, 1, "\x7f", 127ull, 0}, { 4, 1, "\x80", 0, GPG_ERR_ERANGE }, { 5, 1, "\x81", 0, GPG_ERR_ERANGE }, { 6, 2, "\x80\x01", 0, GPG_ERR_ERANGE }, { 7, 2, "\x00\x80", 128ull, 0 }, { 8, 1, "\x01", 1, 0 }, { 9, 1, "\x40", 64, 0 }, { 10, 2, "\x40\x00", 16384, 0 }, { 11, 8, "\x7f\xff\xff\xff\xff\xff\xff\xff", 0x7fffffffffffffffull, 0 }, { 12, 9, "\x00\xff\xff\xff\xff\xff\xff\xff\xff", 0xffffffffffffffffull, 0}, { 13, 9, "\x01\xff\xff\xff\xff\xff\xff\xff\xff", 0, GPG_ERR_ERANGE } }; int tidx; gpg_error_t err; membuf_t mb, mb2; void *p; const void *s; size_t n; tupledesc_t tuples; tupledesc_t tuples2; unsigned long long value; int i; init_membuf (&mb, 512); init_membuf (&mb2, 512); append_tuple (&mb, KEYBLOB_TAG_BLOBVERSION, "\x01", 1); append_tuple (&mb2, KEYBLOB_TAG_BLOBVERSION, "\x01", 1); for (tidx=0; tidx < DIM (tv); tidx++) { append_tuple (&mb, tv[tidx].tag, tv[tidx].data, tv[tidx].len); if (!tv[tidx].ec) append_tuple_uint (&mb2, tv[tidx].tag, tv[tidx].val); } p = get_membuf (&mb, &n); if (!p) { err = gpg_error_from_syserror (); fprintf (stderr, PGM ":%s: get_membuf failed: %s\n", __func__, gpg_strerror (err)); exit (1); } err = create_tupledesc (&tuples, p, n); if (err) { fprintf (stderr, PGM ":%s: create_tupledesc failed: %s\n", __func__, gpg_strerror (err)); exit (1); } p = get_membuf (&mb2, &n); if (!p) { err = gpg_error_from_syserror (); fprintf (stderr, PGM ":%s: get_membuf failed: %s\n", __func__, gpg_strerror (err)); exit (1); } err = create_tupledesc (&tuples2, p, n); if (err) { fprintf (stderr, PGM ":%s: create_tupledesc failed: %s\n", __func__, gpg_strerror (err)); exit (1); } for (tidx=0; tidx < DIM (tv); tidx++) { err = find_tuple_uint (tuples, tv[tidx].tag, &value); if (tv[tidx].ec != gpg_err_code (err)) { fprintf (stderr, PGM ":%s:tidx=%d: wrong error returned; " "expected(%s) got(%s)\n", __func__, tidx, gpg_strerror (tv[tidx].ec), gpg_strerror (err)); errcount++; } else if (!err && tv[tidx].val != value) { fprintf (stderr, PGM ":%s:tidx=%d: wrong value returned; " "expected(%llx) got(%llx)\n", __func__, tidx, tv[tidx].val, value); errcount++; } err = find_tuple_uint (tuples2, tv[tidx].tag, &value); if (gpg_err_code (err) == GPG_ERR_NOT_FOUND) { if (!tv[tidx].ec) { fprintf (stderr, PGM ":%s:tidx=%d: find_tuple failed: %s\n", __func__, tidx, gpg_strerror (err)); errcount++; } } else if (tv[tidx].ec != gpg_err_code (err)) { fprintf (stderr, PGM ":%s:tidx=%d: wrong error returned (2); " "expected(%s) got(%s)\n", __func__, tidx, gpg_strerror (tv[tidx].ec), gpg_strerror (err)); errcount++; } else if (!err && tv[tidx].val != value) { fprintf (stderr, PGM ":%s:tidx=%d: wrong value returned (2); " "expected(%llx) got(%llx)\n", __func__, tidx, tv[tidx].val, value); errcount++; } s = find_tuple (tuples2, tv[tidx].tag, &n); if (!s) ; else if (tv[tidx].len != n) { fprintf (stderr, PGM ":%s:tidx=%d: wrong string length returned; " "expected(%d) got(%zu)\n", __func__, tidx, tv[tidx].len, n); errcount++; } else if (memcmp (tv[tidx].data, s, n)) { fprintf (stderr, PGM ":%s:tidx=%d: wrong string returned:", __func__, tidx); for (i=0; i < n; i++) fprintf (stderr, " %02x", ((unsigned char*)s)[i]); fputc ('\n', stderr); errcount++; } } destroy_tupledesc (tuples); destroy_tupledesc (tuples2); } int main (int argc, char **argv) { int last_argc = -1; gpgrt_init (); if (argc) { argc--; argv++; } while (argc && last_argc != argc ) { last_argc = argc; if (!strcmp (*argv, "--")) { argc--; argv++; break; } else if (!strcmp (*argv, "--verbose")) { verbose++; argc--; argv++; } else if (!strcmp (*argv, "--debug")) { verbose += 2; debug++; argc--; argv++; } else if (!strncmp (*argv, "--", 2)) { fprintf (stderr, PGM ": unknown option '%s'\n", *argv); exit (1); } } test_tuple_uint (); return !!errcount; }