• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }