blob: d9d292ad662f06c49078c634f4b6200ea8ac37f3 [file] [log] [blame]
Andrew Jefferyc63f63a2023-02-24 22:29:33 +10301/* Test pldm_msgbuf_extract() separately because we can't do _Generic() in C++
2 * code, i.e. gtest */
3
4#include <endian.h>
5#include <float.h>
6#include <stdio.h>
7#include <stdlib.h>
8
9/* We're exercising the implementation so disable the asserts for now */
10#ifndef NDEBUG
11#define NDEBUG 1
12#endif
13#include "msgbuf.h"
14
15/* Given we disabled asserts above, set up our own expectation framework */
16#define expect(cond) __expect(__func__, __LINE__, (cond))
17#define __expect(fn, line, cond) \
18 do \
19 { \
20 if (!(cond)) \
21 { \
22 fprintf(stderr, "%s:%d: failed expectation: %s\n", fn, line, \
23 #cond); \
24 exit(EXIT_FAILURE); \
25 } \
26 } while (0)
27
28static void test_msgbuf_extract_generic_uint8(void)
29{
30 struct pldm_msgbuf _ctx;
31 struct pldm_msgbuf* ctx = &_ctx;
32 uint8_t buf[1] = {0xa5};
33 uint8_t val;
34
35 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
36 PLDM_SUCCESS);
37 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
38 expect(val == 0xa5);
39 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
40}
41
42static void test_msgbuf_extract_generic_int8(void)
43{
44 struct pldm_msgbuf _ctx;
45 struct pldm_msgbuf* ctx = &_ctx;
46 int8_t buf[1] = {-1};
47 int8_t val;
48
49 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
50 PLDM_SUCCESS);
51 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
52 expect(val == -1);
53 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
54}
55
56static void test_msgbuf_extract_generic_uint16(void)
57{
58 struct pldm_msgbuf _ctx;
59 struct pldm_msgbuf* ctx = &_ctx;
60 uint16_t buf[1] = {0x5aa5};
61 uint16_t val;
62
63 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
64 PLDM_SUCCESS);
65 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
66 expect(val == 0x5aa5);
67 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
68}
69
70static void test_msgbuf_extract_generic_int16(void)
71{
72 struct pldm_msgbuf _ctx;
73 struct pldm_msgbuf* ctx = &_ctx;
74 int16_t buf[1] = {(int16_t)(htole16((uint16_t)INT16_MIN))};
75 int16_t val;
76
77 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
78 PLDM_SUCCESS);
79 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
80 expect(val == INT16_MIN);
81 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
82}
83
84static void test_msgbuf_extract_generic_uint32(void)
85{
86 struct pldm_msgbuf _ctx;
87 struct pldm_msgbuf* ctx = &_ctx;
88 uint32_t buf[1] = {0x5a00ffa5};
89 uint32_t val;
90
91 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
92 PLDM_SUCCESS);
93 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
94 expect(val == 0x5a00ffa5);
95 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
96}
97
98static void test_msgbuf_extract_generic_int32(void)
99{
100 struct pldm_msgbuf _ctx;
101 struct pldm_msgbuf* ctx = &_ctx;
102 int32_t buf[1] = {(int32_t)(htole32((uint32_t)INT32_MIN))};
103 int32_t val;
104
105 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
106 PLDM_SUCCESS);
107 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
108 expect(val == INT32_MIN);
109 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
110}
111
112static void test_msgbuf_extract_generic_real32(void)
113{
114 struct pldm_msgbuf _ctx;
115 struct pldm_msgbuf* ctx = &_ctx;
116 uint32_t buf[1];
117 uint32_t xform;
118 real32_t val;
119
120 val = FLT_MAX;
121 memcpy(&xform, &val, sizeof(val));
122 buf[0] = htole32(xform);
123 val = 0;
124
125 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
126 PLDM_SUCCESS);
127 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS);
128 expect(val == FLT_MAX);
129 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
130}
131
Andrew Jeffery369b1212023-04-20 15:44:48 +0930132static void test_msgbuf_extract_array_generic_uint8(void)
133{
134 struct pldm_msgbuf _ctx;
135 struct pldm_msgbuf* ctx = &_ctx;
136 uint32_t buf[1] = {0};
137 uint8_t arr[1];
138
139 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) ==
140 PLDM_SUCCESS);
141 expect(pldm_msgbuf_extract_array(ctx, arr, 1) == PLDM_SUCCESS);
142 expect(arr[0] == 0);
143 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS);
144}
145
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030146typedef void (*testfn)(void);
147
Andrew Jeffery369b1212023-04-20 15:44:48 +0930148static const testfn tests[] = {test_msgbuf_extract_generic_uint8,
149 test_msgbuf_extract_generic_int8,
150 test_msgbuf_extract_generic_uint16,
151 test_msgbuf_extract_generic_int16,
152 test_msgbuf_extract_generic_uint32,
153 test_msgbuf_extract_generic_int32,
154 test_msgbuf_extract_generic_real32,
155 test_msgbuf_extract_array_generic_uint8,
156 NULL};
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030157
158int main(void)
159{
160 testfn const* testp = &tests[0];
161
162 while (*testp)
163 {
164 (*testp)();
165 testp++;
166 }
167
168 return 0;
169}