#include #include #include #include using namespace std; TEST(pintool_test, pinlist_matches_memranges) { vector vma_ranges; unsigned int page_size = sysconf(_SC_PAGESIZE); vma_ranges.push_back(VmaRange(0, 500)); vma_ranges.push_back(VmaRange(5000, 5500)); vma_ranges.push_back(VmaRange(21000, 13000)); vma_ranges.push_back(VmaRange(50000, 35000)); string test_file = "/data/local/tmp/pintool_test"; write_pinlist_file(test_file, vma_ranges); vector read_ranges; read_pinlist_file(test_file, read_ranges); EXPECT_EQ(vma_ranges.size(), read_ranges.size()); for (size_t i = 0; i < vma_ranges.size(); ++i) { // We expect to write pinlists that are page-aligned, so // we compare against page aligned offsets. uint64_t unaligned_bytes = vma_ranges[i].offset % page_size; EXPECT_EQ(vma_ranges[i].offset - unaligned_bytes, read_ranges[i].offset); EXPECT_EQ(vma_ranges[i].length + unaligned_bytes, read_ranges[i].length); } remove(test_file.c_str()); } TEST(pintool_test, pinlist_quota_applied) { vector vma_ranges; unsigned int page_size = sysconf(_SC_PAGESIZE); vma_ranges.push_back(VmaRange(0, 100)); vma_ranges.push_back(VmaRange(page_size, 500)); vma_ranges.push_back(VmaRange(page_size * 2, 300)); vma_ranges.push_back(VmaRange(page_size * 3, 200)); const int ranges_to_write = 700; string test_file = "/data/local/tmp/pintool_test"; write_pinlist_file(test_file, vma_ranges, ranges_to_write); vector read_ranges; read_pinlist_file(test_file, read_ranges); int total_length = 0; for (size_t i = 0; i < read_ranges.size(); ++i) { total_length += read_ranges[i].length; } EXPECT_EQ(total_length, ranges_to_write); remove(test_file.c_str()); } TEST(pintool_test, pinconfig_filter_coverage_matches) { VmaRangeGroup* probe = new VmaRangeGroup(); probe->ranges.push_back(VmaRange(0, 500)); probe->ranges.push_back(VmaRange(1000, 5000)); ZipMemInspector* inspector = new ZipMemInspector(""); // Probed Resident Memory Offset ranges: // [0,500],[1000,6000] probe->compute_total_size(); inspector->set_existing_probe(probe); // Emulate reading some files from the zip to compute their coverages // fake1 memory offset ranges [100,400] ZipEntryInfo info; info.name = "fake1"; info.offset_in_zip = 100; info.file_size_bytes = 300; inspector->add_file_info(info); // fake2 memory offset ranges [600,3000] ZipEntryInfo info2; info2.name = "fake2"; info2.offset_in_zip = 600; info2.file_size_bytes = 2400; inspector->add_file_info(info2); ZipEntryInfo info3; info2.name = "fake3"; info2.offset_in_zip = 3100; info2.file_size_bytes = 200; inspector->add_file_info(info3); // Create a fake pinconfig file PinConfig* pinconfig = new PinConfig(); // First file we want it entirely so don't provide ranges PinConfigFile pinconfig_file_1; pinconfig_file_1.filename = "fake1"; pinconfig->files_.push_back(pinconfig_file_1); // Add a partially matched file PinConfigFile pinconfig_file_2; pinconfig_file_2.filename = "fake2"; pinconfig_file_2.ranges.push_back(VmaRange(100, 500)); pinconfig_file_2.ranges.push_back(VmaRange(800, 200)); pinconfig->files_.push_back(pinconfig_file_2); // Add a file that does not exist PinConfigFile pinconfig_file_3; pinconfig_file_3.filename = "fake4"; pinconfig_file_3.ranges.push_back(VmaRange(0, 1000)); pinconfig->files_.push_back(pinconfig_file_3); PinTool pintool(""); pintool.set_custom_zip_inspector(inspector); pintool.compute_zip_entry_coverages(); pintool.filter_zip_entry_coverages(pinconfig); std::vector filtered = pintool.get_filtered_zip_entries(); // We only matched 2 files, one should not have matched to any filter. EXPECT_EQ(filtered.size(), (unsigned long)2); EXPECT_EQ(filtered[0].info.name, "fake1"); EXPECT_EQ(filtered[0].coverage.ranges[0].offset, (unsigned long)100); EXPECT_EQ(filtered[0].coverage.ranges[0].length, (unsigned long)300); // Probe Resident has [0,500],[1000,6000]. // fake2 file lives within [600,3000] // fake2 relative offsets from pinconfig [100,600],[800,1000] // fake2 absolute zip offsets are [700,1200],[1400,1600] // then matching absolute offsets against resident yields [1000,1200],[1400,1600] EXPECT_EQ(filtered[1].info.name, "fake2"); EXPECT_EQ(filtered[1].info.offset_in_zip, (unsigned long)600); EXPECT_EQ(filtered[1].coverage.ranges[0].offset, (unsigned long)1000); EXPECT_EQ(filtered[1].coverage.ranges[0].length, (unsigned long)200); EXPECT_EQ(filtered[1].coverage.ranges[1].offset, (unsigned long)1400); EXPECT_EQ(filtered[1].coverage.ranges[1].length, (unsigned long)200); }