Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: base/android/library_loader/library_prefetcher_unittest.cc

Issue 1001343002: Prefetch the native library from native code by parsing /proc/pid/maps. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Typo. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/android/library_loader/library_prefetcher.h"
6
7 #include <string>
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace base {
11 namespace android {
12
13 class ProcMapsIteratorTest : public NativeLibraryPrefetcher {
14 class FakeFileLineIterator
15 : public NativeLibraryPrefetcher::FileLineIterator {
16 public:
17 FakeFileLineIterator(const char* lines[]) : lines_(lines), index_(0) {}
18
19 virtual bool NextLine(std::string* line) override {
20 const char* line_str = lines_[index_++];
21 if (!line_str)
22 return false;
23 *line = std::string(line_str);
24 return true;
25 }
26
27 private:
28 const char* const* lines_;
29 size_t index_;
30 };
31
32 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest, TestParseLine32Bits);
33 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest, TestParseLine64Bits);
34 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest, TestParseLineNoFile);
35 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest, TestFindRangeNoRange);
36 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest,
37 TestFindRangeSkipUnreadableRange);
38 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest, TestFindRangeSkipSharedRange);
39 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest,
40 TestFindRangeFindLibChromeRange);
41 FRIEND_TEST_ALL_PREFIXES(ProcMapsIteratorTest,
42 TestFindRangeFindBaseApkRanges);
43 };
44
45 TEST(ProcMapsIteratorTest, TestParseLine32Bits) {
46 const char* lines[] = {
47 "b6e62000-b6e64000 r-xp 00000000 b3:15 1204 /lib/libstdc++.so\n",
48 nullptr};
49 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
50 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
51 NativeLibraryPrefetcher::ProcMapsIterator::Mapping mapping;
52 ASSERT_TRUE(maps_iterator.Next(&mapping));
53 EXPECT_EQ(mapping.start, 0xb6e62000ULL);
54 EXPECT_EQ(mapping.end, 0xb6e64000ULL);
55 EXPECT_EQ(mapping.flags, "r-xp");
56 EXPECT_EQ(mapping.offset, 0ULL);
57 EXPECT_EQ(mapping.device, "b3:15");
58 EXPECT_EQ(mapping.inode, 1204LL);
59 EXPECT_EQ(mapping.filename, "/lib/libstdc++.so");
60 ASSERT_FALSE(maps_iterator.Next(&mapping));
61 }
62
63 TEST(ProcMapsIteratorTest, TestParseLine64Bits) {
64 const char* lines[] = {
65 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 libstdc++.so\n",
66 nullptr};
67 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
68 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
69 NativeLibraryPrefetcher::ProcMapsIterator::Mapping mapping;
70 ASSERT_TRUE(maps_iterator.Next(&mapping));
71 EXPECT_EQ(mapping.start, 0x800000b6e62000ULL);
72 EXPECT_EQ(mapping.end, 0x800000b6e64000ULL);
73 EXPECT_EQ(mapping.flags, "r-xp");
74 EXPECT_EQ(mapping.offset, 0ULL);
75 EXPECT_EQ(mapping.device, "b3:15");
76 EXPECT_EQ(mapping.inode, 1204LL);
77 EXPECT_EQ(mapping.filename, "libstdc++.so");
78 ASSERT_FALSE(maps_iterator.Next(&mapping));
79 }
80
81 TEST(ProcMapsIteratorTest, TestParseLineNoFile) {
82 const char* lines[] = {"b6e62000-b6e64000 r-xp 00000000 b3:15 1204 \n",
83 nullptr};
84 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
85 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
86 NativeLibraryPrefetcher::ProcMapsIterator::Mapping mapping;
87 ASSERT_TRUE(maps_iterator.Next(&mapping));
88 EXPECT_EQ(mapping.start, 0xb6e62000ULL);
89 EXPECT_EQ(mapping.end, 0xb6e64000ULL);
90 EXPECT_EQ(mapping.flags, "r-xp");
91 EXPECT_EQ(mapping.offset, 0ULL);
92 EXPECT_EQ(mapping.device, "b3:15");
93 EXPECT_EQ(mapping.inode, 1204LL);
94 EXPECT_EQ(mapping.filename, "");
95 ASSERT_FALSE(maps_iterator.Next(&mapping));
96 }
97
98 TEST(ProcMapsIteratorTest, TestFindRangeNoRange) {
99 const char* lines[] = {
100 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 \n",
101 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 foo\n",
102 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 foobar.apk\n",
103 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 libchromium.so\n",
104 nullptr};
105 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
106 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
107 std::vector<std::pair<uint64_t, uint64_t>> ranges =
108 NativeLibraryPrefetcher::ProcMapsIterator::FindRanges(
109 &file_line_iterator);
110 EXPECT_EQ(ranges.size(), 0ULL);
111 }
112
113 TEST(ProcMapsIteratorTest, TestFindRangeSkipUnreadableRange) {
114 const char* lines[] = {
115 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 \n",
116 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 foo\n",
117 "800000b6e62000-800000b6e64000 --xp 00000000 b3:15 1204 base.apk\n",
118 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 libchromium.so\n",
119 nullptr};
120 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
121 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
122 std::vector<std::pair<uint64_t, uint64_t>> ranges =
123 NativeLibraryPrefetcher::ProcMapsIterator::FindRanges(
124 &file_line_iterator);
125 EXPECT_EQ(ranges.size(), 0ULL);
126 }
127
128 TEST(ProcMapsIteratorTest, TestFindRangeSkipSharedRange) {
129 const char* lines[] = {
130 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 \n",
131 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 foo\n",
132 "800000b6e62000-800000b6e64000 r-xs 00000000 b3:15 1204 base.apk\n",
133 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 libchromium.so\n",
134 nullptr};
135 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
136 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
137 std::vector<std::pair<uint64_t, uint64_t>> ranges =
138 NativeLibraryPrefetcher::ProcMapsIterator::FindRanges(
139 &file_line_iterator);
140 EXPECT_EQ(ranges.size(), 0ULL);
141 }
142
143 TEST(ProcMapsIteratorTest, TestFindRangeFindLibChromeRange) {
144 const char* lines[] = {
145 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 \n",
146 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 foo\n",
147 "800000b6e62000-800000b6e64000 --xp 00000000 b3:15 1204 base-ish.apk\n",
148 "42-43 r-xp 00000000 b3:15 42 libchrome.so\n",
149 nullptr};
150 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
151 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
152 std::vector<std::pair<uint64_t, uint64_t>> ranges =
153 NativeLibraryPrefetcher::ProcMapsIterator::FindRanges(
154 &file_line_iterator);
155 EXPECT_EQ(ranges.size(), 1ULL);
156 EXPECT_EQ(ranges[0].first, 0x42ULL);
157 EXPECT_EQ(ranges[0].second, 0x43ULL);
158 }
159
160 TEST(ProcMapsIteratorTest, TestFindRangeFindBaseApkRanges) {
161 const char* lines[] = {
162 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 \n",
163 "800000b6e62000-800000b6e64000 r-xp 00000000 b3:15 1204 foo\n",
164 "42-43 rw-p 00000000 b3:15 1204 base.apk\n",
165 "64-1000 r-xp 00000000 b3:15 42 base.apk\n",
166 nullptr};
167 ProcMapsIteratorTest::FakeFileLineIterator file_line_iterator(lines);
168 NativeLibraryPrefetcher::ProcMapsIterator maps_iterator(&file_line_iterator);
169 std::vector<std::pair<uint64_t, uint64_t>> ranges =
170 NativeLibraryPrefetcher::ProcMapsIterator::FindRanges(
171 &file_line_iterator);
172 EXPECT_EQ(ranges.size(), 2ULL);
173 EXPECT_EQ(ranges[0].first, 0x42ULL);
174 EXPECT_EQ(ranges[0].second, 0x43ULL);
175 EXPECT_EQ(ranges[1].first, 0x64ULL);
176 EXPECT_EQ(ranges[1].second, 0x1000ULL);
177 }
178
179 } // namespace android
180 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698