diff options
Diffstat (limited to 'libotr/libotr-4.1.1/tests/unit/test_b64.c')
-rw-r--r-- | libotr/libotr-4.1.1/tests/unit/test_b64.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/libotr/libotr-4.1.1/tests/unit/test_b64.c b/libotr/libotr-4.1.1/tests/unit/test_b64.c new file mode 100644 index 0000000..6d55992 --- /dev/null +++ b/libotr/libotr-4.1.1/tests/unit/test_b64.c @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2014 - Julien Voisin <julien.voisin@dustri.org> + * David Goulet <dgoulet@ev0ke.net> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program 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, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include <stdlib.h> +#include <string.h> +#include <pthread.h> + +#include <b64.h> +#include <tap/tap.h> +#include <proto.h> + +GCRY_THREAD_OPTION_PTHREAD_IMPL; + +#define NUM_TESTS 10 + +const char *alphanum_encoded = + "?OTR:" "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwCg==" "."; +const char *alphanum_decoded = + "abcdefghijklmnopqrstuvwxyz1234567890\n"; + +static void test_otrl_base64_otr_decode(void) +{ + int ret; + unsigned char *bufp = NULL; + size_t len = 0; + + /* + * Invalid decoding. + */ + + ok(otrl_base64_otr_decode("hello", NULL, NULL) == -2, + "Call with no prefix returned an error"); + ok(otrl_base64_otr_decode("?OTR:" "MTIzNAo=", NULL, NULL) == -2, + "Call with no suffix returned an error"); + /* Message of size 0. */ + ret = otrl_base64_otr_decode("", &bufp, &len); + ok(ret == -2 && bufp == NULL && len == 0, + "Decode b64 with message of len 0"); + /* + * Valid decoding. + */ + + /* Invalid chars are ignored */ + ok(otrl_base64_otr_decode("?OTR:invalid_base64_thing.", &bufp, &len) == 0 + && len == 12, "Invalid b64 data"); + free(bufp); + bufp = NULL; + len = 0; + + ok(otrl_base64_otr_decode(alphanum_encoded, &bufp, &len) == 0, + "Call with valid data successfull"); + ok(strcmp((const char*)bufp, alphanum_decoded) == 0 + && len == 37, "Decoded valid b64 test vector with success"); + free(bufp); + bufp = NULL; + len = 0; + + /* Invalid base64 char. */ + ret = otrl_base64_otr_decode("?OTR:_*&?!!*\"().", &bufp, &len); + ok(ret == 0 && bufp != NULL && len == 0, + "Decode b64 with invalid b64 characters"); + free(bufp); + bufp = NULL; + len = 0; + +} + +static void test_otrl_base64_otr_encode(void) +{ + unsigned char *bufp = NULL; + size_t len = 0; + char *encoded; + + encoded = otrl_base64_otr_encode((const unsigned char *) alphanum_decoded, + strlen(alphanum_decoded)); + + ok(strcmp(encoded, alphanum_encoded) == 0, + "Encoded b64 test vector with success"); + ok(otrl_base64_otr_decode(encoded, &bufp, &len) == 0, + "Decoded previously encoded test vector"); + ok(memcmp(bufp, alphanum_decoded, len) == 0 + && len == strlen(alphanum_decoded), + "Decoded value is exact"); + free(bufp); + free(encoded); +} + +int main(int argc, char** argv) +{ + plan_tests(NUM_TESTS); + + gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); + OTRL_INIT; + + test_otrl_base64_otr_decode(); + test_otrl_base64_otr_encode(); + + return 0; +} |