Mercurial > libbase64
view test/base64.c @ 24:90760aa2e7ed
base64: support binary data
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 26 Mar 2020 08:41:12 +0100 |
parents | 9205a516264d |
children | 3172e43c9b43 |
line wrap: on
line source
/* * base64.c -- main test file for base64 (C version) * * Copyright (c) 2013-2020 David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <errno.h> #define GREATEST_USE_ABBREVS 0 #include <greatest.h> #include <base64.h> GREATEST_TEST test_general_b64_lookup(void) { GREATEST_ASSERT(b64_lookup(0) == 'A'); GREATEST_ASSERT(b64_lookup(1) == 'B'); GREATEST_ASSERT(b64_lookup(2) == 'C'); GREATEST_ASSERT(b64_lookup(3) == 'D'); GREATEST_ASSERT(b64_lookup(4) == 'E'); GREATEST_ASSERT(b64_lookup(5) == 'F'); GREATEST_ASSERT(b64_lookup(6) == 'G'); GREATEST_ASSERT(b64_lookup(7) == 'H'); GREATEST_ASSERT(b64_lookup(8) == 'I'); GREATEST_ASSERT(b64_lookup(9) == 'J'); GREATEST_ASSERT(b64_lookup(10) == 'K'); GREATEST_ASSERT(b64_lookup(11) == 'L'); GREATEST_ASSERT(b64_lookup(12) == 'M'); GREATEST_ASSERT(b64_lookup(13) == 'N'); GREATEST_ASSERT(b64_lookup(14) == 'O'); GREATEST_ASSERT(b64_lookup(15) == 'P'); GREATEST_ASSERT(b64_lookup(16) == 'Q'); GREATEST_ASSERT(b64_lookup(17) == 'R'); GREATEST_ASSERT(b64_lookup(18) == 'S'); GREATEST_ASSERT(b64_lookup(19) == 'T'); GREATEST_ASSERT(b64_lookup(20) == 'U'); GREATEST_ASSERT(b64_lookup(21) == 'V'); GREATEST_ASSERT(b64_lookup(22) == 'W'); GREATEST_ASSERT(b64_lookup(23) == 'X'); GREATEST_ASSERT(b64_lookup(24) == 'Y'); GREATEST_ASSERT(b64_lookup(25) == 'Z'); GREATEST_ASSERT(b64_lookup(26) == 'a'); GREATEST_ASSERT(b64_lookup(27) == 'b'); GREATEST_ASSERT(b64_lookup(28) == 'c'); GREATEST_ASSERT(b64_lookup(29) == 'd'); GREATEST_ASSERT(b64_lookup(30) == 'e'); GREATEST_ASSERT(b64_lookup(31) == 'f'); GREATEST_ASSERT(b64_lookup(32) == 'g'); GREATEST_ASSERT(b64_lookup(33) == 'h'); GREATEST_ASSERT(b64_lookup(34) == 'i'); GREATEST_ASSERT(b64_lookup(35) == 'j'); GREATEST_ASSERT(b64_lookup(36) == 'k'); GREATEST_ASSERT(b64_lookup(37) == 'l'); GREATEST_ASSERT(b64_lookup(38) == 'm'); GREATEST_ASSERT(b64_lookup(39) == 'n'); GREATEST_ASSERT(b64_lookup(40) == 'o'); GREATEST_ASSERT(b64_lookup(41) == 'p'); GREATEST_ASSERT(b64_lookup(42) == 'q'); GREATEST_ASSERT(b64_lookup(43) == 'r'); GREATEST_ASSERT(b64_lookup(44) == 's'); GREATEST_ASSERT(b64_lookup(45) == 't'); GREATEST_ASSERT(b64_lookup(46) == 'u'); GREATEST_ASSERT(b64_lookup(47) == 'v'); GREATEST_ASSERT(b64_lookup(48) == 'w'); GREATEST_ASSERT(b64_lookup(49) == 'x'); GREATEST_ASSERT(b64_lookup(50) == 'y'); GREATEST_ASSERT(b64_lookup(51) == 'z'); GREATEST_ASSERT(b64_lookup(52) == '0'); GREATEST_ASSERT(b64_lookup(53) == '1'); GREATEST_ASSERT(b64_lookup(54) == '2'); GREATEST_ASSERT(b64_lookup(55) == '3'); GREATEST_ASSERT(b64_lookup(56) == '4'); GREATEST_ASSERT(b64_lookup(57) == '5'); GREATEST_ASSERT(b64_lookup(58) == '6'); GREATEST_ASSERT(b64_lookup(59) == '7'); GREATEST_ASSERT(b64_lookup(60) == '8'); GREATEST_ASSERT(b64_lookup(61) == '9'); GREATEST_ASSERT(b64_lookup(62) == '+'); GREATEST_ASSERT(b64_lookup(63) == '/'); GREATEST_PASS(); } GREATEST_TEST test_general_b64_rlookup(void) { GREATEST_ASSERT(b64_rlookup('A') == 0); GREATEST_ASSERT(b64_rlookup('B') == 1); GREATEST_ASSERT(b64_rlookup('C') == 2); GREATEST_ASSERT(b64_rlookup('D') == 3); GREATEST_ASSERT(b64_rlookup('E') == 4); GREATEST_ASSERT(b64_rlookup('F') == 5); GREATEST_ASSERT(b64_rlookup('G') == 6); GREATEST_ASSERT(b64_rlookup('H') == 7); GREATEST_ASSERT(b64_rlookup('I') == 8); GREATEST_ASSERT(b64_rlookup('J') == 9); GREATEST_ASSERT(b64_rlookup('K') == 10); GREATEST_ASSERT(b64_rlookup('L') == 11); GREATEST_ASSERT(b64_rlookup('M') == 12); GREATEST_ASSERT(b64_rlookup('N') == 13); GREATEST_ASSERT(b64_rlookup('O') == 14); GREATEST_ASSERT(b64_rlookup('P') == 15); GREATEST_ASSERT(b64_rlookup('Q') == 16); GREATEST_ASSERT(b64_rlookup('R') == 17); GREATEST_ASSERT(b64_rlookup('S') == 18); GREATEST_ASSERT(b64_rlookup('T') == 19); GREATEST_ASSERT(b64_rlookup('U') == 20); GREATEST_ASSERT(b64_rlookup('V') == 21); GREATEST_ASSERT(b64_rlookup('W') == 22); GREATEST_ASSERT(b64_rlookup('X') == 23); GREATEST_ASSERT(b64_rlookup('Y') == 24); GREATEST_ASSERT(b64_rlookup('Z') == 25); GREATEST_ASSERT(b64_rlookup('a') == 26); GREATEST_ASSERT(b64_rlookup('b') == 27); GREATEST_ASSERT(b64_rlookup('c') == 28); GREATEST_ASSERT(b64_rlookup('d') == 29); GREATEST_ASSERT(b64_rlookup('e') == 30); GREATEST_ASSERT(b64_rlookup('f') == 31); GREATEST_ASSERT(b64_rlookup('g') == 32); GREATEST_ASSERT(b64_rlookup('h') == 33); GREATEST_ASSERT(b64_rlookup('i') == 34); GREATEST_ASSERT(b64_rlookup('j') == 35); GREATEST_ASSERT(b64_rlookup('k') == 36); GREATEST_ASSERT(b64_rlookup('l') == 37); GREATEST_ASSERT(b64_rlookup('m') == 38); GREATEST_ASSERT(b64_rlookup('n') == 39); GREATEST_ASSERT(b64_rlookup('o') == 40); GREATEST_ASSERT(b64_rlookup('p') == 41); GREATEST_ASSERT(b64_rlookup('q') == 42); GREATEST_ASSERT(b64_rlookup('r') == 43); GREATEST_ASSERT(b64_rlookup('s') == 44); GREATEST_ASSERT(b64_rlookup('t') == 45); GREATEST_ASSERT(b64_rlookup('u') == 46); GREATEST_ASSERT(b64_rlookup('v') == 47); GREATEST_ASSERT(b64_rlookup('w') == 48); GREATEST_ASSERT(b64_rlookup('x') == 49); GREATEST_ASSERT(b64_rlookup('y') == 50); GREATEST_ASSERT(b64_rlookup('z') == 51); GREATEST_ASSERT(b64_rlookup('0') == 52); GREATEST_ASSERT(b64_rlookup('1') == 53); GREATEST_ASSERT(b64_rlookup('2') == 54); GREATEST_ASSERT(b64_rlookup('3') == 55); GREATEST_ASSERT(b64_rlookup('4') == 56); GREATEST_ASSERT(b64_rlookup('5') == 57); GREATEST_ASSERT(b64_rlookup('6') == 58); GREATEST_ASSERT(b64_rlookup('7') == 59); GREATEST_ASSERT(b64_rlookup('8') == 60); GREATEST_ASSERT(b64_rlookup('9') == 61); GREATEST_ASSERT(b64_rlookup('+') == 62); GREATEST_ASSERT(b64_rlookup('/') == 63); GREATEST_PASS(); } GREATEST_SUITE(suite_general) { GREATEST_RUN_TEST(test_general_b64_lookup); GREATEST_RUN_TEST(test_general_b64_rlookup); } GREATEST_TEST test_b64_encode_basic(void) { char buffer[BUFSIZ]; size_t r; r = b64_encode("a", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 4U); GREATEST_ASSERT_STR_EQ(buffer, "YQ=="); r = b64_encode("ab", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 4U); GREATEST_ASSERT_STR_EQ(buffer, "YWI="); r = b64_encode("abc", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 4U); GREATEST_ASSERT_STR_EQ(buffer, "YWJj"); r = b64_encode("hello", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 8U); GREATEST_ASSERT_STR_EQ(buffer, "aGVsbG8="); r = b64_encode("this is a long sentence", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 32U); GREATEST_ASSERT_STR_EQ(buffer, "dGhpcyBpcyBhIGxvbmcgc2VudGVuY2U="); GREATEST_PASS(); } GREATEST_TEST test_b64_encode_binary(void) { char buffer[BUFSIZ]; size_t r; r = b64_encode("a\0bc", 4, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 8U); GREATEST_ASSERT_STR_EQ(buffer, "YQBiYw=="); GREATEST_PASS(); } GREATEST_TEST test_b64_encode_toosmall(void) { char buffer[10]; size_t r; r = b64_encode("hello world", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, ERANGE); GREATEST_PASS(); } GREATEST_SUITE(suite_b64_encode) { GREATEST_RUN_TEST(test_b64_encode_basic); GREATEST_RUN_TEST(test_b64_encode_binary); GREATEST_RUN_TEST(test_b64_encode_toosmall); } GREATEST_TEST test_b64_encode_length_basic(void) { GREATEST_ASSERT_EQ(b64_encode_length(0, 1), 4U); GREATEST_ASSERT_EQ(b64_encode_length(0, 2), 4U); GREATEST_ASSERT_EQ(b64_encode_length(0, 3), 8U); GREATEST_ASSERT_EQ(b64_encode_length(0, 4), 8U); GREATEST_ASSERT_EQ(b64_encode_length(0, 5), 8U); GREATEST_ASSERT_EQ(b64_encode_length(0, 6), 12U); GREATEST_ASSERT_EQ(b64_encode_length(0, 7), 12U); GREATEST_ASSERT_EQ(b64_encode_length(0, 8), 12U); GREATEST_ASSERT_EQ(b64_encode_length("a", 0), 4U); GREATEST_ASSERT_EQ(b64_encode_length("ab", 0), 4U); GREATEST_ASSERT_EQ(b64_encode_length("abc", 0), 8U); GREATEST_ASSERT_EQ(b64_encode_length("abcd", 0), 8U); GREATEST_ASSERT_EQ(b64_encode_length("abcde", 0), 8U); GREATEST_ASSERT_EQ(b64_encode_length("abcdef", 0), 12U); GREATEST_ASSERT_EQ(b64_encode_length("abcdefg", 0), 12U); GREATEST_ASSERT_EQ(b64_encode_length("abcdefgh", 0), 12U); GREATEST_PASS(); } GREATEST_SUITE(suite_b64_encode_length) { GREATEST_RUN_TEST(test_b64_encode_length_basic); } GREATEST_TEST test_b64_decode_length_basic(void) { GREATEST_ASSERT_EQ(b64_decode_length(0, 4), 3U); GREATEST_ASSERT_EQ(b64_decode_length(0, 8), 6U); GREATEST_ASSERT_EQ(b64_decode_length(0, 12), 9U); GREATEST_ASSERT_EQ(b64_decode_length(0, 16), 12U); GREATEST_ASSERT_EQ(b64_decode_length(0, 20), 15U); GREATEST_ASSERT_EQ(b64_decode_length("XXXX", 4), 3U); GREATEST_ASSERT_EQ(b64_decode_length("XXXXXXXX", 8), 6U); GREATEST_ASSERT_EQ(b64_decode_length("XXXXXXXXXXXX", 12), 9U); GREATEST_ASSERT_EQ(b64_decode_length("XXXXXXXXXXXXXXXX", 16), 12U); GREATEST_ASSERT_EQ(b64_decode_length("XXXXXXXXXXXXXXXXXXXX", 20), 15U); GREATEST_PASS(); } GREATEST_SUITE(suite_b64_decode_length) { GREATEST_RUN_TEST(test_b64_decode_length_basic); } GREATEST_TEST test_b64_decode_basic(void) { char buffer[BUFSIZ]; size_t r; r = b64_decode("YQ==", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 1U); GREATEST_ASSERT_STR_EQ(buffer, "a"); r = b64_decode("YWI=", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 2U); GREATEST_ASSERT_STR_EQ(buffer, "ab"); r = b64_decode("YWJj", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 3U); GREATEST_ASSERT_STR_EQ(buffer, "abc"); r = b64_decode("aGVsbG8=", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 5U); GREATEST_ASSERT_STR_EQ(buffer, "hello"); r = b64_decode("dGhpcyBpcyBhIGxvbmcgc2VudGVuY2U=", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 23U); GREATEST_ASSERT_STR_EQ(buffer, "this is a long sentence"); r = b64_decode("V2VsY29tZSB0byBvdXIgc2VydmVyIGR1ZGU=", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 26U); GREATEST_ASSERT_STR_EQ(buffer, "Welcome to our server dude"); GREATEST_PASS(); } GREATEST_TEST test_b64_decode_sized(void) { char buffer[BUFSIZ]; size_t r; r = b64_decode("YQ== ", 4, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, 1U); GREATEST_ASSERT_STR_EQ(buffer, "a"); GREATEST_PASS(); } GREATEST_TEST test_b64_decode_invalid(void) { char buffer[BUFSIZ]; size_t r; r = b64_decode("YW=", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, EILSEQ); r = b64_decode("?!", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, EILSEQ); r = b64_decode("=ABC", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, EILSEQ); r = b64_decode("A=BC", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, EILSEQ); r = b64_decode("==BC", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, EILSEQ); r = b64_decode("AB=C", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, EILSEQ); GREATEST_PASS(); } GREATEST_TEST test_b64_decode_toosmall(void) { char buffer[10]; size_t r; r = b64_decode("V2VsY29tZSB0byBvdXIgc2VydmVyIGR1ZGU=", 0, buffer, sizeof (buffer)); GREATEST_ASSERT_EQ(r, (size_t)-1); GREATEST_ASSERT_EQ(errno, ERANGE); GREATEST_PASS(); } GREATEST_SUITE(suite_b64_decode) { GREATEST_RUN_TEST(test_b64_decode_basic); GREATEST_RUN_TEST(test_b64_decode_sized); GREATEST_RUN_TEST(test_b64_decode_invalid); GREATEST_RUN_TEST(test_b64_decode_toosmall); } GREATEST_MAIN_DEFS(); int main(int argc, char **argv) { GREATEST_MAIN_BEGIN(); GREATEST_RUN_SUITE(suite_general); GREATEST_RUN_SUITE(suite_b64_encode); GREATEST_RUN_SUITE(suite_b64_encode_length); GREATEST_RUN_SUITE(suite_b64_decode); GREATEST_RUN_SUITE(suite_b64_decode_length); GREATEST_MAIN_END(); }