xref: /openbmc/libcper/tests/ir-tests.cpp (revision a10d910f)
1 /**
2  * Defines tests for validating CPER-JSON IR output from the cper-parse library.
3  *
4  * Author: Lawrence.Tang@arm.com
5  **/
6 
7 #include "gtest/gtest.h"
8 #include "test-utils.hpp"
9 extern "C" {
10 #include "json.h"
11 #include "../cper-parse.h"
12 #include "../json-schema.h"
13 #include "../generator/cper-generate.h"
14 }
15 
16 /*
17 * Test templates.
18 */
19 
20 //Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
21 void cper_log_section_ir_test(const char *section_name, int single_section)
22 {
23 	//Generate full CPER record for the given type.
24 	char *buf;
25 	size_t size;
26 	FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
27 						 single_section);
28 
29 	//Convert to IR, free resources.
30 	json_object *ir;
31 	if (single_section)
32 		ir = cper_single_section_to_ir(record);
33 	else
34 		ir = cper_to_ir(record);
35 	fclose(record);
36 	free(buf);
37 
38 	//Validate against schema.
39 	char error_message[JSON_ERROR_MSG_MAX_LEN] = { 0 };
40 	int valid = validate_schema_from_file("./specification/cper-json.json",
41 					      ir, error_message);
42 	ASSERT_TRUE(valid)
43 		<< "IR validation test failed (single section mode = "
44 		<< single_section << ") with message: " << error_message;
45 }
46 
47 //Checks for binary round-trip equality for a given randomly generated CPER record.
48 void cper_log_section_binary_test(const char *section_name, int single_section)
49 {
50 	//Generate CPER record for the given type.
51 	char *buf;
52 	size_t size;
53 	FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
54 						 single_section);
55 
56 	//Convert to IR.
57 	json_object *ir;
58 	if (single_section)
59 		ir = cper_single_section_to_ir(record);
60 	else
61 		ir = cper_to_ir(record);
62 
63 	//Now convert back to binary, and get a stream out.
64 	char *cper_buf;
65 	size_t cper_buf_size;
66 	FILE *stream = open_memstream(&cper_buf, &cper_buf_size);
67 	if (single_section)
68 		ir_single_section_to_cper(ir, stream);
69 	else
70 		ir_to_cper(ir, stream);
71 	size_t cper_len = ftell(stream);
72 	fclose(stream);
73 
74 	//Validate the two are identical.
75 	ASSERT_GE(size, cper_len);
76 	ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0)
77 		<< "Binary output was not identical to input (single section mode = "
78 		<< single_section << ").";
79 
80 	//Free everything up.
81 	fclose(record);
82 	free(buf);
83 	free(cper_buf);
84 }
85 
86 //Tests randomly generated CPER sections for IR validity of a given type, in both single section mode and full CPER log mode.
87 void cper_log_section_dual_ir_test(const char *section_name)
88 {
89 	cper_log_section_ir_test(section_name, 0);
90 	cper_log_section_ir_test(section_name, 1);
91 }
92 
93 //Tests randomly generated CPER sections for binary compatibility of a given type, in both single section mode and full CPER log mode.
94 void cper_log_section_dual_binary_test(const char *section_name)
95 {
96 	cper_log_section_binary_test(section_name, 0);
97 	cper_log_section_binary_test(section_name, 1);
98 }
99 
100 /*
101 * Single section tests.
102 */
103 
104 //Generic processor tests.
105 TEST(GenericProcessorTests, IRValid)
106 {
107 	cper_log_section_dual_ir_test("generic");
108 }
109 TEST(GenericProcessorTests, BinaryEqual)
110 {
111 	cper_log_section_dual_binary_test("generic");
112 }
113 
114 //IA32/x64 tests.
115 TEST(IA32x64Tests, IRValid)
116 {
117 	cper_log_section_dual_ir_test("ia32x64");
118 }
119 TEST(IA32x64Tests, BinaryEqual)
120 {
121 	cper_log_section_dual_binary_test("ia32x64");
122 }
123 
124 // TEST(IPFTests, IRValid) {
125 //     cper_log_section_dual_ir_test("ipf");
126 // }
127 
128 //ARM tests.
129 TEST(ArmTests, IRValid)
130 {
131 	cper_log_section_dual_ir_test("arm");
132 }
133 TEST(ArmTests, BinaryEqual)
134 {
135 	cper_log_section_dual_binary_test("arm");
136 }
137 
138 //Memory tests.
139 TEST(MemoryTests, IRValid)
140 {
141 	cper_log_section_dual_ir_test("memory");
142 }
143 TEST(MemoryTests, BinaryEqual)
144 {
145 	cper_log_section_dual_binary_test("memory");
146 }
147 
148 //Memory 2 tests.
149 TEST(Memory2Tests, IRValid)
150 {
151 	cper_log_section_dual_ir_test("memory2");
152 }
153 TEST(Memory2Tests, BinaryEqual)
154 {
155 	cper_log_section_dual_binary_test("memory2");
156 }
157 
158 //PCIe tests.
159 TEST(PCIeTests, IRValid)
160 {
161 	cper_log_section_dual_ir_test("pcie");
162 }
163 TEST(PCIeTests, BinaryEqual)
164 {
165 	cper_log_section_dual_binary_test("pcie");
166 }
167 
168 //Firmware tests.
169 TEST(FirmwareTests, IRValid)
170 {
171 	cper_log_section_dual_ir_test("firmware");
172 }
173 TEST(FirmwareTests, BinaryEqual)
174 {
175 	cper_log_section_dual_binary_test("firmware");
176 }
177 
178 //PCI Bus tests.
179 TEST(PCIBusTests, IRValid)
180 {
181 	cper_log_section_dual_ir_test("pcibus");
182 }
183 TEST(PCIBusTests, BinaryEqual)
184 {
185 	cper_log_section_dual_binary_test("pcibus");
186 }
187 
188 //PCI Device tests.
189 TEST(PCIDevTests, IRValid)
190 {
191 	cper_log_section_dual_ir_test("pcidev");
192 }
193 TEST(PCIDevTests, BinaryEqual)
194 {
195 	cper_log_section_dual_binary_test("pcidev");
196 }
197 
198 //Generic DMAr tests.
199 TEST(DMArGenericTests, IRValid)
200 {
201 	cper_log_section_dual_ir_test("dmargeneric");
202 }
203 TEST(DMArGenericTests, BinaryEqual)
204 {
205 	cper_log_section_dual_binary_test("dmargeneric");
206 }
207 
208 //VT-d DMAr tests.
209 TEST(DMArVtdTests, IRValid)
210 {
211 	cper_log_section_dual_ir_test("dmarvtd");
212 }
213 TEST(DMArVtdTests, BinaryEqual)
214 {
215 	cper_log_section_dual_binary_test("dmarvtd");
216 }
217 
218 //IOMMU DMAr tests.
219 TEST(DMArIOMMUTests, IRValid)
220 {
221 	cper_log_section_dual_ir_test("dmariommu");
222 }
223 TEST(DMArIOMMUTests, BinaryEqual)
224 {
225 	cper_log_section_dual_binary_test("dmariommu");
226 }
227 
228 //CCIX PER tests.
229 TEST(CCIXPERTests, IRValid)
230 {
231 	cper_log_section_dual_ir_test("ccixper");
232 }
233 TEST(CCIXPERTests, BinaryEqual)
234 {
235 	cper_log_section_dual_binary_test("ccixper");
236 }
237 
238 //CXL Protocol tests.
239 TEST(CXLProtocolTests, IRValid)
240 {
241 	cper_log_section_dual_ir_test("cxlprotocol");
242 }
243 TEST(CXLProtocolTests, BinaryEqual)
244 {
245 	cper_log_section_dual_binary_test("cxlprotocol");
246 }
247 
248 //CXL Component tests.
249 TEST(CXLComponentTests, IRValid)
250 {
251 	cper_log_section_dual_ir_test("cxlcomponent");
252 }
253 TEST(CXLComponentTests, BinaryEqual)
254 {
255 	cper_log_section_dual_binary_test("cxlcomponent");
256 }
257 
258 //Unknown section tests.
259 TEST(UnknownSectionTests, IRValid)
260 {
261 	cper_log_section_dual_ir_test("unknown");
262 }
263 TEST(UnknownSectionTests, BinaryEqual)
264 {
265 	cper_log_section_dual_binary_test("unknown");
266 }
267 
268 //Entrypoint for the testing program.
269 int main()
270 {
271 	testing::InitGoogleTest();
272 	return RUN_ALL_TESTS();
273 }