diff options
Diffstat (limited to 'pinner/tests/pintool_tests.cpp')
-rw-r--r-- | pinner/tests/pintool_tests.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/pinner/tests/pintool_tests.cpp b/pinner/tests/pintool_tests.cpp new file mode 100644 index 00000000..f351a90a --- /dev/null +++ b/pinner/tests/pintool_tests.cpp @@ -0,0 +1,137 @@ +#include <gtest/gtest.h> +#include <stdio.h> +#include <list> + +#include <pin_utils.h> + +using namespace std; + +TEST(pintool_test, pinlist_matches_memranges) { + vector<VmaRange> 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<VmaRange> 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<VmaRange> 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<VmaRange> 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<ZipEntryCoverage> 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); +}
\ No newline at end of file |