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