| /* | |
| * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>. | |
| * | |
| * This program 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 2 of the | |
| * License, or (at your option) any later version. | |
| * | |
| * 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. | |
| * | |
| * You can also choose to distribute this program under the terms of | |
| * the Unmodified Binary Distribution Licence (as given in the file | |
| * COPYING.UBDL), provided that you have satisfied its requirements. | |
| */ | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| /** @file | |
| * | |
| * Base16 tests | |
| * | |
| */ | |
| /* Forcibly enable assertions */ | |
| #undef NDEBUG | |
| #include <stdint.h> | |
| #include <string.h> | |
| #include <ipxe/base16.h> | |
| #include <ipxe/test.h> | |
| /** A Base16 test */ | |
| struct base16_test { | |
| /** Raw data */ | |
| const void *data; | |
| /** Length of raw data */ | |
| size_t len; | |
| /** Base16-encoded data */ | |
| const char *encoded; | |
| }; | |
| /** Define inline data */ | |
| #define DATA(...) { __VA_ARGS__ } | |
| /** Define a base16 test */ | |
| #define BASE16( name, DATA, ENCODED ) \ | |
| static const uint8_t name ## _data[] = DATA; \ | |
| static struct base16_test name = { \ | |
| .data = name ## _data, \ | |
| .len = sizeof ( name ## _data ), \ | |
| .encoded = ENCODED, \ | |
| } | |
| /** Empty data test */ | |
| BASE16 ( empty_test, DATA(), "" ); | |
| /** "Hello world" test */ | |
| BASE16 ( hw_test, | |
| DATA ( 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' ), | |
| "48656c6c6f20776f726c64" ); | |
| /** Random data test */ | |
| BASE16 ( random_test, | |
| DATA ( 0x8b, 0x1a, 0xa2, 0x6c, 0xa9, 0x38, 0x43, 0xb8, 0x81, 0xf8, | |
| 0x30, 0x44, 0xb2, 0x32, 0x6e, 0x82, 0xfe, 0x0f, 0x84, 0x91 ), | |
| "8b1aa26ca93843b881f83044b2326e82fe0f8491" ); | |
| /** | |
| * Report a base16 encoding test result | |
| * | |
| * @v test Base16 test | |
| * @v file Test code file | |
| * @v line Test code line | |
| */ | |
| static void base16_encode_okx ( struct base16_test *test, const char *file, | |
| unsigned int line ) { | |
| size_t len = base16_encoded_len ( test->len ); | |
| char buf[ len + 1 /* NUL */ ]; | |
| size_t check_len; | |
| okx ( len == strlen ( test->encoded ), file, line ); | |
| check_len = base16_encode ( test->data, test->len, buf, sizeof ( buf )); | |
| okx ( check_len == len, file, line ); | |
| okx ( strcmp ( test->encoded, buf ) == 0, file, line ); | |
| } | |
| #define base16_encode_ok( test ) base16_encode_okx ( test, __FILE__, __LINE__ ) | |
| /** | |
| * Report a base16 decoding test result | |
| * | |
| * @v test Base16 test | |
| * @v file Test code file | |
| * @v line Test code line | |
| */ | |
| static void base16_decode_okx ( struct base16_test *test, const char *file, | |
| unsigned int line ) { | |
| size_t max_len = base16_decoded_max_len ( test->encoded ); | |
| uint8_t buf[max_len]; | |
| int len; | |
| len = base16_decode ( test->encoded, buf, sizeof ( buf ) ); | |
| okx ( len >= 0, file, line ); | |
| okx ( ( size_t ) len <= max_len, file, line ); | |
| okx ( ( size_t ) len == test->len, file, line ); | |
| okx ( memcmp ( test->data, buf, len ) == 0, file, line ); | |
| } | |
| #define base16_decode_ok( test ) base16_decode_okx ( test, __FILE__, __LINE__ ) | |
| /** | |
| * Perform Base16 self-tests | |
| * | |
| */ | |
| static void base16_test_exec ( void ) { | |
| base16_encode_ok ( &empty_test ); | |
| base16_decode_ok ( &empty_test ); | |
| base16_encode_ok ( &hw_test ); | |
| base16_decode_ok ( &hw_test ); | |
| base16_encode_ok ( &random_test ); | |
| base16_decode_ok ( &random_test ); | |
| } | |
| /** Base16 self-test */ | |
| struct self_test base16_test __self_test = { | |
| .name = "base16", | |
| .exec = base16_test_exec, | |
| }; |