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