1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci 3a8e1175bSopenharmony_ci/* The printf test functions take a format argument from the test data 4a8e1175bSopenharmony_ci * for several reasons: 5a8e1175bSopenharmony_ci * - For some tests, it makes sense to vary the format. 6a8e1175bSopenharmony_ci * - For all tests, it means we're testing the actual printf function 7a8e1175bSopenharmony_ci * that parses the format at runtime, and not a compiler optimization. 8a8e1175bSopenharmony_ci * (It may be useful to add tests that allow compiler optimizations. 9a8e1175bSopenharmony_ci * There aren't any yet at the time of writing.) 10a8e1175bSopenharmony_ci */ 11a8e1175bSopenharmony_ci 12a8e1175bSopenharmony_ci#include "mbedtls/platform.h" 13a8e1175bSopenharmony_ci 14a8e1175bSopenharmony_ci#include <stdio.h> 15a8e1175bSopenharmony_ci#include <stdlib.h> 16a8e1175bSopenharmony_ci#include <string.h> 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci#define NEWLINE_CHAR '\n' 19a8e1175bSopenharmony_ci#define SPACE_CHAR ' ' 20a8e1175bSopenharmony_ci#define DOUBLE_QUOTE_CHAR '"' 21a8e1175bSopenharmony_ci#define COLON_CHAR ':' 22a8e1175bSopenharmony_ci#define QUESTION_CHAR '?' 23a8e1175bSopenharmony_ci#define BACKSLASH_CHAR '\\' 24a8e1175bSopenharmony_ci#define LOWERCASE_N_CHAR 'n' 25a8e1175bSopenharmony_ci/* END_HEADER */ 26a8e1175bSopenharmony_ci 27a8e1175bSopenharmony_ci/* BEGIN_CASE */ 28a8e1175bSopenharmony_civoid printf_int(char *format, /* any format expecting one int argument, e.g. "%d" */ 29a8e1175bSopenharmony_ci int x, char *result) 30a8e1175bSopenharmony_ci{ 31a8e1175bSopenharmony_ci char *output = NULL; 32a8e1175bSopenharmony_ci const size_t n = strlen(result); 33a8e1175bSopenharmony_ci 34a8e1175bSopenharmony_ci /* Nominal case: buffer just large enough */ 35a8e1175bSopenharmony_ci TEST_CALLOC(output, n + 1); 36a8e1175bSopenharmony_ci TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, x)); 37a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(result, n + 1, output, n + 1); 38a8e1175bSopenharmony_ci mbedtls_free(output); 39a8e1175bSopenharmony_ci output = NULL; 40a8e1175bSopenharmony_ci 41a8e1175bSopenharmony_ciexit: 42a8e1175bSopenharmony_ci mbedtls_free(output); 43a8e1175bSopenharmony_ci} 44a8e1175bSopenharmony_ci/* END_CASE */ 45a8e1175bSopenharmony_ci 46a8e1175bSopenharmony_ci/* BEGIN_CASE */ 47a8e1175bSopenharmony_civoid printf_long_max(const char *format, /* "%lx" or longer type */ 48a8e1175bSopenharmony_ci long value) 49a8e1175bSopenharmony_ci{ 50a8e1175bSopenharmony_ci char *expected = NULL; 51a8e1175bSopenharmony_ci char *output = NULL; 52a8e1175bSopenharmony_ci /* 2 hex digits per byte */ 53a8e1175bSopenharmony_ci const size_t n = sizeof(value) * 2; 54a8e1175bSopenharmony_ci 55a8e1175bSopenharmony_ci /* We assume that long has no padding bits! */ 56a8e1175bSopenharmony_ci TEST_CALLOC(expected, n + 1); 57a8e1175bSopenharmony_ci expected[0] = '7'; 58a8e1175bSopenharmony_ci memset(expected + 1, 'f', sizeof(value) * 2 - 1); 59a8e1175bSopenharmony_ci 60a8e1175bSopenharmony_ci TEST_CALLOC(output, n + 1); 61a8e1175bSopenharmony_ci TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, value)); 62a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(expected, n + 1, output, n + 1); 63a8e1175bSopenharmony_ci mbedtls_free(output); 64a8e1175bSopenharmony_ci output = NULL; 65a8e1175bSopenharmony_ci 66a8e1175bSopenharmony_ciexit: 67a8e1175bSopenharmony_ci mbedtls_free(output); 68a8e1175bSopenharmony_ci mbedtls_free(expected); 69a8e1175bSopenharmony_ci} 70a8e1175bSopenharmony_ci/* END_CASE */ 71a8e1175bSopenharmony_ci 72a8e1175bSopenharmony_ci/* BEGIN_CASE */ 73a8e1175bSopenharmony_civoid printf_char2(char *format, /* "%c%c" */ 74a8e1175bSopenharmony_ci int arg1, int arg2, char *result) 75a8e1175bSopenharmony_ci{ 76a8e1175bSopenharmony_ci char *output = NULL; 77a8e1175bSopenharmony_ci const size_t n = strlen(result); 78a8e1175bSopenharmony_ci 79a8e1175bSopenharmony_ci /* Nominal case: buffer just large enough */ 80a8e1175bSopenharmony_ci TEST_CALLOC(output, n + 1); 81a8e1175bSopenharmony_ci TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, arg1, arg2)); 82a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(result, n + 1, output, n + 1); 83a8e1175bSopenharmony_ci mbedtls_free(output); 84a8e1175bSopenharmony_ci output = NULL; 85a8e1175bSopenharmony_ci 86a8e1175bSopenharmony_ciexit: 87a8e1175bSopenharmony_ci mbedtls_free(output); 88a8e1175bSopenharmony_ci} 89a8e1175bSopenharmony_ci/* END_CASE */ 90