1 #include <gtest/gtest.h>
2 #include <stdio.h>
3 #include <list>
4
5 #include <pin_utils.h>
6
7 using namespace std;
8
TEST(pintool_test,pinlist_matches_memranges)9 TEST(pintool_test, pinlist_matches_memranges) {
10 vector<VmaRange> vma_ranges;
11 unsigned int page_size = sysconf(_SC_PAGESIZE);
12 vma_ranges.push_back(VmaRange(0, 500));
13 vma_ranges.push_back(VmaRange(5000, 5500));
14 vma_ranges.push_back(VmaRange(21000, 13000));
15 vma_ranges.push_back(VmaRange(50000, 35000));
16
17 string test_file = "/data/local/tmp/pintool_test";
18 write_pinlist_file(test_file, vma_ranges);
19
20 vector<VmaRange> read_ranges;
21 read_pinlist_file(test_file, read_ranges);
22
23 EXPECT_EQ(vma_ranges.size(), read_ranges.size());
24 for (size_t i = 0; i < vma_ranges.size(); ++i) {
25 // We expect to write pinlists that are page-aligned, so
26 // we compare against page aligned offsets.
27 uint64_t unaligned_bytes = vma_ranges[i].offset % page_size;
28 EXPECT_EQ(vma_ranges[i].offset - unaligned_bytes, read_ranges[i].offset);
29 EXPECT_EQ(vma_ranges[i].length + unaligned_bytes, read_ranges[i].length);
30 }
31
32 remove(test_file.c_str());
33 }
34
TEST(pintool_test,pinlist_quota_applied)35 TEST(pintool_test, pinlist_quota_applied) {
36 vector<VmaRange> vma_ranges;
37 unsigned int page_size = sysconf(_SC_PAGESIZE);
38 vma_ranges.push_back(VmaRange(0, 100));
39 vma_ranges.push_back(VmaRange(page_size, 500));
40 vma_ranges.push_back(VmaRange(page_size * 2, 300));
41 vma_ranges.push_back(VmaRange(page_size * 3, 200));
42
43 const int ranges_to_write = 700;
44 string test_file = "/data/local/tmp/pintool_test";
45 write_pinlist_file(test_file, vma_ranges, ranges_to_write);
46
47 vector<VmaRange> read_ranges;
48 read_pinlist_file(test_file, read_ranges);
49
50 int total_length = 0;
51 for (size_t i = 0; i < read_ranges.size(); ++i) {
52 total_length += read_ranges[i].length;
53 }
54 EXPECT_EQ(total_length, ranges_to_write);
55
56 remove(test_file.c_str());
57 }
58
TEST(pintool_test,pinconfig_filter_coverage_matches)59 TEST(pintool_test, pinconfig_filter_coverage_matches) {
60 VmaRangeGroup* probe = new VmaRangeGroup();
61 probe->ranges.push_back(VmaRange(0, 500));
62 probe->ranges.push_back(VmaRange(1000, 5000));
63
64 ZipMemInspector* inspector = new ZipMemInspector("");
65
66 // Probed Resident Memory Offset ranges:
67 // [0,500],[1000,6000]
68 probe->compute_total_size();
69 inspector->set_existing_probe(probe);
70
71 // Emulate reading some files from the zip to compute their coverages
72 // fake1 memory offset ranges [100,400]
73 ZipEntryInfo info;
74 info.name = "fake1";
75 info.offset_in_zip = 100;
76 info.file_size_bytes = 300;
77 inspector->add_file_info(info);
78
79 // fake2 memory offset ranges [600,3000]
80 ZipEntryInfo info2;
81 info2.name = "fake2";
82 info2.offset_in_zip = 600;
83 info2.file_size_bytes = 2400;
84 inspector->add_file_info(info2);
85
86 ZipEntryInfo info3;
87 info2.name = "fake3";
88 info2.offset_in_zip = 3100;
89 info2.file_size_bytes = 200;
90 inspector->add_file_info(info3);
91
92 // Create a fake pinconfig file
93 PinConfig* pinconfig = new PinConfig();
94
95 // First file we want it entirely so don't provide ranges
96 PinConfigFile pinconfig_file_1;
97 pinconfig_file_1.filename = "fake1";
98 pinconfig->files_.push_back(pinconfig_file_1);
99
100 // Add a partially matched file
101 PinConfigFile pinconfig_file_2;
102 pinconfig_file_2.filename = "fake2";
103 pinconfig_file_2.ranges.push_back(VmaRange(100, 500));
104 pinconfig_file_2.ranges.push_back(VmaRange(800, 200));
105 pinconfig->files_.push_back(pinconfig_file_2);
106
107 // Add a file that does not exist
108 PinConfigFile pinconfig_file_3;
109 pinconfig_file_3.filename = "fake4";
110 pinconfig_file_3.ranges.push_back(VmaRange(0, 1000));
111 pinconfig->files_.push_back(pinconfig_file_3);
112
113 PinTool pintool("");
114 pintool.set_custom_zip_inspector(inspector);
115 pintool.compute_zip_entry_coverages();
116 pintool.filter_zip_entry_coverages(pinconfig);
117
118 std::vector<ZipEntryCoverage> filtered = pintool.get_filtered_zip_entries();
119
120 // We only matched 2 files, one should not have matched to any filter.
121 EXPECT_EQ(filtered.size(), (unsigned long)2);
122 EXPECT_EQ(filtered[0].info.name, "fake1");
123 EXPECT_EQ(filtered[0].coverage.ranges[0].offset, (unsigned long)100);
124 EXPECT_EQ(filtered[0].coverage.ranges[0].length, (unsigned long)300);
125
126 // Probe Resident has [0,500],[1000,6000].
127 // fake2 file lives within [600,3000]
128 // fake2 relative offsets from pinconfig [100,600],[800,1000]
129 // fake2 absolute zip offsets are [700,1200],[1400,1600]
130 // then matching absolute offsets against resident yields [1000,1200],[1400,1600]
131 EXPECT_EQ(filtered[1].info.name, "fake2");
132 EXPECT_EQ(filtered[1].info.offset_in_zip, (unsigned long)600);
133 EXPECT_EQ(filtered[1].coverage.ranges[0].offset, (unsigned long)1000);
134 EXPECT_EQ(filtered[1].coverage.ranges[0].length, (unsigned long)200);
135 EXPECT_EQ(filtered[1].coverage.ranges[1].offset, (unsigned long)1400);
136 EXPECT_EQ(filtered[1].coverage.ranges[1].length, (unsigned long)200);
137 }