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(§ion_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(§ion_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 }