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