| /* | |
| * QEMU base64 helper test | |
| * | |
| * Copyright (c) 2015 Red Hat, Inc. | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library 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 | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
| * | |
| */ | |
| #include "qemu/osdep.h" | |
| #include "qapi/error.h" | |
| #include "qemu/base64.h" | |
| static void test_base64_good(void) | |
| { | |
| const char input[] = | |
| "QmVjYXVzZSB3ZSBmb2N1c2VkIG9uIHRoZSBzbmFrZSwgd2UgbW\n" | |
| "lzc2VkIHRoZSBzY29ycGlvbi4="; | |
| const char expect[] = "Because we focused on the snake, " | |
| "we missed the scorpion."; | |
| size_t len; | |
| uint8_t *actual = qbase64_decode(input, | |
| -1, | |
| &len, | |
| &error_abort); | |
| g_assert(actual != NULL); | |
| g_assert_cmpint(len, ==, strlen(expect)); | |
| g_assert_cmpstr((char *)actual, ==, expect); | |
| g_free(actual); | |
| } | |
| static void test_base64_bad(const char *input, | |
| size_t input_len) | |
| { | |
| size_t len; | |
| Error *err = NULL; | |
| uint8_t *actual = qbase64_decode(input, | |
| input_len, | |
| &len, | |
| &err); | |
| error_free_or_abort(&err); | |
| g_assert(actual == NULL); | |
| g_assert_cmpint(len, ==, 0); | |
| } | |
| static void test_base64_embedded_nul(void) | |
| { | |
| /* We put a NUL character in the middle of the base64 | |
| * text which is invalid data, given the expected length */ | |
| const char input[] = | |
| "QmVjYXVzZSB3ZSBmb2N1c2VkIG9uIHRoZSBzbmFrZSwgd2UgbW\0" | |
| "lzc2VkIHRoZSBzY29ycGlvbi4="; | |
| test_base64_bad(input, G_N_ELEMENTS(input) - 1); | |
| } | |
| static void test_base64_not_nul_terminated(void) | |
| { | |
| const char input[] = | |
| "QmVjYXVzZSB3ZSBmb2N1c2VkIG9uIHRoZSBzbmFrZSwgd2UgbW\n" | |
| "lzc2VkIHRoZSBzY29ycGlvbi4="; | |
| /* Using '-2' to make us drop the trailing NUL, thus | |
| * creating an invalid base64 sequence for decoding */ | |
| test_base64_bad(input, G_N_ELEMENTS(input) - 2); | |
| } | |
| static void test_base64_invalid_chars(void) | |
| { | |
| /* We put a single quote character in the middle | |
| * of the base64 text which is invalid data */ | |
| const char input[] = | |
| "QmVjYXVzZSB3ZSBmb2N1c2VkIG9uIHRoZSBzbmFrZSwgd2UgbW'" | |
| "lzc2VkIHRoZSBzY29ycGlvbi4="; | |
| test_base64_bad(input, strlen(input)); | |
| } | |
| int main(int argc, char **argv) | |
| { | |
| g_test_init(&argc, &argv, NULL); | |
| g_test_add_func("/util/base64/good", test_base64_good); | |
| g_test_add_func("/util/base64/embedded-nul", test_base64_embedded_nul); | |
| g_test_add_func("/util/base64/not-nul-terminated", | |
| test_base64_not_nul_terminated); | |
| g_test_add_func("/util/base64/invalid-chars", test_base64_invalid_chars); | |
| return g_test_run(); | |
| } |