xref: /openbmc/libcper/tests/ir-tests.cpp (revision e407b4c8)
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.
21d34f2b11SLawrence Tang void single_section_ir_test(const char *section_name)
22d34f2b11SLawrence Tang {
23cd505205SLawrence Tang 	//Generate CPER record for the given type.
24d34f2b11SLawrence Tang 	char *buf;
25d34f2b11SLawrence Tang 	size_t size;
26d34f2b11SLawrence Tang 	FILE *record = generate_record_memstream(&section_name, 1, &buf, &size);
27d34f2b11SLawrence Tang 
28d34f2b11SLawrence Tang 	//Convert to IR, free resources.
29d34f2b11SLawrence Tang 	json_object *ir = cper_to_ir(record);
30d34f2b11SLawrence Tang 	fclose(record);
31d34f2b11SLawrence Tang 	free(buf);
32d34f2b11SLawrence Tang 
33d34f2b11SLawrence Tang 	//Validate against schema.
34d34f2b11SLawrence Tang 	char error_message[JSON_ERROR_MSG_MAX_LEN] = { 0 };
35*e407b4c8SLawrence Tang 	int valid = validate_schema_from_file("./specification/cper-json.json",
36*e407b4c8SLawrence Tang 					      ir, error_message);
37d34f2b11SLawrence Tang 	ASSERT_TRUE(valid) << error_message;
38d34f2b11SLawrence Tang }
39d34f2b11SLawrence Tang 
40cd505205SLawrence Tang //Checks for binary round-trip equality for a given randomly generated CPER record.
41cd505205SLawrence Tang void single_section_binary_test(const char *section_name)
42cd505205SLawrence Tang {
43cd505205SLawrence Tang 	//Generate CPER record for the given type.
44cd505205SLawrence Tang 	char *buf;
45cd505205SLawrence Tang 	size_t size;
46cd505205SLawrence Tang 	FILE *record = generate_record_memstream(&section_name, 1, &buf, &size);
47cd505205SLawrence Tang 
48cd505205SLawrence Tang 	//Convert to IR, then back to binary, getting a stream out.
49cd505205SLawrence Tang 	json_object *ir = cper_to_ir(record);
50cd505205SLawrence Tang 	char *cper_buf;
51cd505205SLawrence Tang 	size_t cper_buf_size;
52cd505205SLawrence Tang 	FILE *stream = open_memstream(&cper_buf, &cper_buf_size);
53cd505205SLawrence Tang 	ir_to_cper(ir, stream);
54aacf0e26SLawrence Tang 	size_t cper_len = ftell(stream);
55cd505205SLawrence Tang 	fclose(stream);
56cd505205SLawrence Tang 
57cd505205SLawrence Tang 	//Validate the two are identical.
58aacf0e26SLawrence Tang 	ASSERT_GE(size, cper_len);
59*e407b4c8SLawrence Tang 	ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0)
60*e407b4c8SLawrence Tang 		<< "Binary output was not identical to input.";
61cd505205SLawrence Tang 
62cd505205SLawrence Tang 	//Free everything up.
63cd505205SLawrence Tang 	fclose(record);
64cd505205SLawrence Tang 	free(buf);
65cd505205SLawrence Tang 	free(cper_buf);
66cd505205SLawrence Tang }
67cd505205SLawrence Tang 
68d34f2b11SLawrence Tang /*
69d34f2b11SLawrence Tang * Single section tests.
70d34f2b11SLawrence Tang */
71cd505205SLawrence Tang //Generic processor tests.
72*e407b4c8SLawrence Tang TEST(GenericProcessorTests, IRValid)
73*e407b4c8SLawrence Tang {
74d34f2b11SLawrence Tang 	single_section_ir_test("generic");
75d34f2b11SLawrence Tang }
76*e407b4c8SLawrence Tang TEST(GenericProcessorTests, BinaryEqual)
77*e407b4c8SLawrence Tang {
78cd505205SLawrence Tang 	single_section_binary_test("generic");
79cd505205SLawrence Tang }
80cd505205SLawrence Tang 
81cd505205SLawrence Tang //IA32/x64 tests.
82*e407b4c8SLawrence Tang TEST(IA32x64Tests, IRValid)
83*e407b4c8SLawrence Tang {
84d34f2b11SLawrence Tang 	single_section_ir_test("ia32x64");
85d34f2b11SLawrence Tang }
86*e407b4c8SLawrence Tang TEST(IA32x64Tests, BinaryEqual)
87*e407b4c8SLawrence Tang {
88cd505205SLawrence Tang 	single_section_binary_test("ia32x64");
89cd505205SLawrence Tang }
90cd505205SLawrence Tang 
91d34f2b11SLawrence Tang // TEST(IPFTests, IRValid) {
92d34f2b11SLawrence Tang //     single_section_ir_test("ipf");
93d34f2b11SLawrence Tang // }
94cd505205SLawrence Tang 
95cd505205SLawrence Tang //ARM tests.
96*e407b4c8SLawrence Tang TEST(ArmTests, IRValid)
97*e407b4c8SLawrence Tang {
98d34f2b11SLawrence Tang 	single_section_ir_test("arm");
99d34f2b11SLawrence Tang }
100*e407b4c8SLawrence Tang TEST(ArmTests, BinaryEqual)
101*e407b4c8SLawrence Tang {
102cd505205SLawrence Tang 	single_section_binary_test("arm");
103cd505205SLawrence Tang }
104cd505205SLawrence Tang 
105cd505205SLawrence Tang //Memory tests.
106*e407b4c8SLawrence Tang TEST(MemoryTests, IRValid)
107*e407b4c8SLawrence Tang {
108d34f2b11SLawrence Tang 	single_section_ir_test("memory");
109d34f2b11SLawrence Tang }
110*e407b4c8SLawrence Tang TEST(MemoryTests, BinaryEqual)
111*e407b4c8SLawrence Tang {
112cd505205SLawrence Tang 	single_section_binary_test("memory");
113cd505205SLawrence Tang }
114cd505205SLawrence Tang 
115cd505205SLawrence Tang //Memory 2 tests.
116*e407b4c8SLawrence Tang TEST(Memory2Tests, IRValid)
117*e407b4c8SLawrence Tang {
118d34f2b11SLawrence Tang 	single_section_ir_test("memory2");
119d34f2b11SLawrence Tang }
120*e407b4c8SLawrence Tang TEST(Memory2Tests, BinaryEqual)
121*e407b4c8SLawrence Tang {
122cd505205SLawrence Tang 	single_section_binary_test("memory2");
123cd505205SLawrence Tang }
124cd505205SLawrence Tang 
125cd505205SLawrence Tang //PCIe tests.
126*e407b4c8SLawrence Tang TEST(PCIeTests, IRValid)
127*e407b4c8SLawrence Tang {
128d34f2b11SLawrence Tang 	single_section_ir_test("pcie");
129d34f2b11SLawrence Tang }
130*e407b4c8SLawrence Tang TEST(PCIeTests, BinaryEqual)
131*e407b4c8SLawrence Tang {
132cd505205SLawrence Tang 	single_section_binary_test("pcie");
133cd505205SLawrence Tang }
134cd505205SLawrence Tang 
135cd505205SLawrence Tang //Firmware tests.
136*e407b4c8SLawrence Tang TEST(FirmwareTests, IRValid)
137*e407b4c8SLawrence Tang {
138d34f2b11SLawrence Tang 	single_section_ir_test("firmware");
139d34f2b11SLawrence Tang }
140*e407b4c8SLawrence Tang TEST(FirmwareTests, BinaryEqual)
141*e407b4c8SLawrence Tang {
142cd505205SLawrence Tang 	single_section_binary_test("firmware");
143cd505205SLawrence Tang }
144cd505205SLawrence Tang 
145cd505205SLawrence Tang //PCI Bus tests.
146*e407b4c8SLawrence Tang TEST(PCIBusTests, IRValid)
147*e407b4c8SLawrence Tang {
148d34f2b11SLawrence Tang 	single_section_ir_test("pcibus");
149d34f2b11SLawrence Tang }
150*e407b4c8SLawrence Tang TEST(PCIBusTests, BinaryEqual)
151*e407b4c8SLawrence Tang {
152cd505205SLawrence Tang 	single_section_binary_test("pcibus");
153cd505205SLawrence Tang }
154cd505205SLawrence Tang 
155cd505205SLawrence Tang //PCI Device tests.
156*e407b4c8SLawrence Tang TEST(PCIDevTests, IRValid)
157*e407b4c8SLawrence Tang {
158d34f2b11SLawrence Tang 	single_section_ir_test("pcidev");
159d34f2b11SLawrence Tang }
160*e407b4c8SLawrence Tang TEST(PCIDevTests, BinaryEqual)
161*e407b4c8SLawrence Tang {
162cd505205SLawrence Tang 	single_section_binary_test("pcidev");
163cd505205SLawrence Tang }
164cd505205SLawrence Tang 
165cd505205SLawrence Tang //Generic DMAr tests.
166*e407b4c8SLawrence Tang TEST(DMArGenericTests, IRValid)
167*e407b4c8SLawrence Tang {
168d34f2b11SLawrence Tang 	single_section_ir_test("dmargeneric");
169d34f2b11SLawrence Tang }
170*e407b4c8SLawrence Tang TEST(DMArGenericTests, BinaryEqual)
171*e407b4c8SLawrence Tang {
172cd505205SLawrence Tang 	single_section_binary_test("dmargeneric");
173cd505205SLawrence Tang }
174cd505205SLawrence Tang 
175cd505205SLawrence Tang //VT-d DMAr tests.
176*e407b4c8SLawrence Tang TEST(DMArVtdTests, IRValid)
177*e407b4c8SLawrence Tang {
178d34f2b11SLawrence Tang 	single_section_ir_test("dmarvtd");
179d34f2b11SLawrence Tang }
180*e407b4c8SLawrence Tang TEST(DMArVtdTests, BinaryEqual)
181*e407b4c8SLawrence Tang {
182cd505205SLawrence Tang 	single_section_binary_test("dmarvtd");
183cd505205SLawrence Tang }
184cd505205SLawrence Tang 
185cd505205SLawrence Tang //IOMMU DMAr tests.
186*e407b4c8SLawrence Tang TEST(DMArIOMMUTests, IRValid)
187*e407b4c8SLawrence Tang {
188d34f2b11SLawrence Tang 	single_section_ir_test("dmariommu");
189d34f2b11SLawrence Tang }
190*e407b4c8SLawrence Tang TEST(DMArIOMMUTests, BinaryEqual)
191*e407b4c8SLawrence Tang {
192cd505205SLawrence Tang 	single_section_binary_test("dmariommu");
193cd505205SLawrence Tang }
194cd505205SLawrence Tang 
195cd505205SLawrence Tang //CCIX PER tests.
196*e407b4c8SLawrence Tang TEST(CCIXPERTests, IRValid)
197*e407b4c8SLawrence Tang {
198d34f2b11SLawrence Tang 	single_section_ir_test("ccixper");
199d34f2b11SLawrence Tang }
200*e407b4c8SLawrence Tang TEST(CCIXPERTests, BinaryEqual)
201*e407b4c8SLawrence Tang {
202cd505205SLawrence Tang 	single_section_binary_test("ccixper");
203cd505205SLawrence Tang }
204cd505205SLawrence Tang 
205cd505205SLawrence Tang //CXL Protocol tests.
206*e407b4c8SLawrence Tang TEST(CXLProtocolTests, IRValid)
207*e407b4c8SLawrence Tang {
208d34f2b11SLawrence Tang 	single_section_ir_test("cxlprotocol");
209d34f2b11SLawrence Tang }
210*e407b4c8SLawrence Tang TEST(CXLProtocolTests, BinaryEqual)
211*e407b4c8SLawrence Tang {
212cd505205SLawrence Tang 	single_section_binary_test("cxlprotocol");
213cd505205SLawrence Tang }
214cd505205SLawrence Tang 
215cd505205SLawrence Tang //CXL Component tests.
216*e407b4c8SLawrence Tang TEST(CXLComponentTests, IRValid)
217*e407b4c8SLawrence Tang {
218d34f2b11SLawrence Tang 	single_section_ir_test("cxlcomponent");
219d34f2b11SLawrence Tang }
220*e407b4c8SLawrence Tang TEST(CXLComponentTests, BinaryEqual)
221*e407b4c8SLawrence Tang {
222cd505205SLawrence Tang 	single_section_binary_test("cxlcomponent");
223cd505205SLawrence Tang }
224cd505205SLawrence Tang 
225cd505205SLawrence Tang //Unknown section tests.
226*e407b4c8SLawrence Tang TEST(UnknownSectionTests, IRValid)
227*e407b4c8SLawrence Tang {
228d34f2b11SLawrence Tang 	single_section_ir_test("unknown");
229d34f2b11SLawrence Tang }
230*e407b4c8SLawrence Tang TEST(UnknownSectionTests, BinaryEqual)
231*e407b4c8SLawrence Tang {
232cd505205SLawrence Tang 	single_section_binary_test("unknown");
233cd505205SLawrence Tang }
234d34f2b11SLawrence Tang 
235d34f2b11SLawrence Tang //Entrypoint for the testing program.
236d34f2b11SLawrence Tang int main()
237d34f2b11SLawrence Tang {
238d34f2b11SLawrence Tang 	testing::InitGoogleTest();
239d34f2b11SLawrence Tang 	return RUN_ALL_TESTS();
240d34f2b11SLawrence Tang }