summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreehugger Robot2018-01-31 11:35:29 -0600
committerGerrit Code Review2018-01-31 11:35:29 -0600
commitdd218e6c8476368ca8733b046b93005d7cb25ee6 (patch)
tree18d8f8682b20e9d89786e049662965706df9c5de /libcutils
parent0e239bbd8b205d4441aef5fa3643bef23ada3955 (diff)
parent276758dab8e24b29be0abb1b6bdadd7c897e8701 (diff)
downloadplatform-system-core-dd218e6c8476368ca8733b046b93005d7cb25ee6.tar.gz
platform-system-core-dd218e6c8476368ca8733b046b93005d7cb25ee6.tar.xz
platform-system-core-dd218e6c8476368ca8733b046b93005d7cb25ee6.zip
Merge "libcutils: test: increase use of ashmem_valid(fd)"
Diffstat (limited to 'libcutils')
-rw-r--r--libcutils/tests/AshmemTest.cpp70
1 files changed, 48 insertions, 22 deletions
diff --git a/libcutils/tests/AshmemTest.cpp b/libcutils/tests/AshmemTest.cpp
index a87e23e30..b37d020fb 100644
--- a/libcutils/tests/AshmemTest.cpp
+++ b/libcutils/tests/AshmemTest.cpp
@@ -14,11 +14,18 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17#include <errno.h>
18#include <linux/fs.h>
19#include <stdint.h>
20#include <string.h>
21#include <sys/mman.h>
22#include <sys/types.h>
23#include <unistd.h>
24
25#include <android-base/macros.h>
17#include <android-base/unique_fd.h> 26#include <android-base/unique_fd.h>
18#include <cutils/ashmem.h> 27#include <cutils/ashmem.h>
19#include <gtest/gtest.h> 28#include <gtest/gtest.h>
20#include <linux/fs.h>
21#include <sys/mman.h>
22 29
23using android::base::unique_fd; 30using android::base::unique_fd;
24 31
@@ -31,15 +38,21 @@ void TestCreateRegion(size_t size, unique_fd &fd, int prot) {
31} 38}
32 39
33void TestMmap(const unique_fd& fd, size_t size, int prot, void** region, off_t off = 0) { 40void TestMmap(const unique_fd& fd, size_t size, int prot, void** region, off_t off = 0) {
41 ASSERT_TRUE(fd >= 0);
42 ASSERT_TRUE(ashmem_valid(fd));
34 *region = mmap(nullptr, size, prot, MAP_SHARED, fd, off); 43 *region = mmap(nullptr, size, prot, MAP_SHARED, fd, off);
35 ASSERT_NE(MAP_FAILED, *region); 44 ASSERT_NE(MAP_FAILED, *region);
36} 45}
37 46
38void TestProtDenied(const unique_fd &fd, size_t size, int prot) { 47void TestProtDenied(const unique_fd &fd, size_t size, int prot) {
48 ASSERT_TRUE(fd >= 0);
49 ASSERT_TRUE(ashmem_valid(fd));
39 EXPECT_EQ(MAP_FAILED, mmap(nullptr, size, prot, MAP_SHARED, fd, 0)); 50 EXPECT_EQ(MAP_FAILED, mmap(nullptr, size, prot, MAP_SHARED, fd, 0));
40} 51}
41 52
42void TestProtIs(const unique_fd& fd, int prot) { 53void TestProtIs(const unique_fd& fd, int prot) {
54 ASSERT_TRUE(fd >= 0);
55 ASSERT_TRUE(ashmem_valid(fd));
43 EXPECT_EQ(prot, ioctl(fd, ASHMEM_GET_PROT_MASK)); 56 EXPECT_EQ(prot, ioctl(fd, ASHMEM_GET_PROT_MASK));
44} 57}
45 58
@@ -86,18 +99,23 @@ TEST(AshmemTest, ForkTest) {
86 ASSERT_EQ(0, memcmp(region1, &data, size)); 99 ASSERT_EQ(0, memcmp(region1, &data, size));
87 EXPECT_EQ(0, munmap(region1, size)); 100 EXPECT_EQ(0, munmap(region1, size));
88 101
89 ASSERT_EXIT({ 102 ASSERT_EXIT(
90 void *region2 = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 103 {
91 if (region2 == MAP_FAILED) { 104 if (!ashmem_valid(fd)) {
92 _exit(1); 105 _exit(3);
93 } 106 }
94 if (memcmp(region2, &data, size) != 0) { 107 void* region2 = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
95 _exit(2); 108 if (region2 == MAP_FAILED) {
96 } 109 _exit(1);
97 memset(region2, 0, size); 110 }
98 munmap(region2, size); 111 if (memcmp(region2, &data, size) != 0) {
99 _exit(0); 112 _exit(2);
100 }, ::testing::ExitedWithCode(0),""); 113 }
114 memset(region2, 0, size);
115 munmap(region2, size);
116 _exit(0);
117 },
118 ::testing::ExitedWithCode(0), "");
101 119
102 memset(&data, 0, size); 120 memset(&data, 0, size);
103 void *region2; 121 void *region2;
@@ -146,6 +164,7 @@ TEST(AshmemTest, FileOperationsTest) {
146 }; 164 };
147 for (const auto& cfg : seeks) { 165 for (const auto& cfg : seeks) {
148 errno = 0; 166 errno = 0;
167 ASSERT_TRUE(ashmem_valid(fd));
149 auto off = lseek(fd, cfg.offset, cfg.whence); 168 auto off = lseek(fd, cfg.offset, cfg.whence);
150 ASSERT_EQ(cfg.ret, off) << "lseek(" << cfg.offset << ", " << cfg.whence << ") failed" 169 ASSERT_EQ(cfg.ret, off) << "lseek(" << cfg.offset << ", " << cfg.whence << ") failed"
151 << (errno ? ": " : "") << (errno ? strerror(errno) : ""); 170 << (errno ? ": " : "") << (errno ? strerror(errno) : "");
@@ -196,15 +215,19 @@ TEST(AshmemTest, ForkProtTest) {
196 constexpr size_t size = PAGE_SIZE; 215 constexpr size_t size = PAGE_SIZE;
197 216
198 int protFlags[] = { PROT_READ, PROT_WRITE }; 217 int protFlags[] = { PROT_READ, PROT_WRITE };
199 for (int i = 0; i < 2; i++) { 218 for (size_t i = 0; i < arraysize(protFlags); i++) {
200 ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE)); 219 ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE));
201 ASSERT_EXIT({ 220 ASSERT_EXIT(
202 if (ashmem_set_prot_region(fd, protFlags[i]) >= 0) { 221 {
203 _exit(0); 222 if (!ashmem_valid(fd)) {
204 } else { 223 _exit(3);
205 _exit(1); 224 } else if (ashmem_set_prot_region(fd, protFlags[i]) >= 0) {
206 } 225 _exit(0);
207 }, ::testing::ExitedWithCode(0), ""); 226 } else {
227 _exit(1);
228 }
229 },
230 ::testing::ExitedWithCode(0), "");
208 ASSERT_NO_FATAL_FAILURE(TestProtDenied(fd, size, protFlags[1-i])); 231 ASSERT_NO_FATAL_FAILURE(TestProtDenied(fd, size, protFlags[1-i]));
209 } 232 }
210} 233}
@@ -227,6 +250,9 @@ TEST(AshmemTest, ForkMultiRegionTest) {
227 250
228 ASSERT_EXIT({ 251 ASSERT_EXIT({
229 for (int i = 0; i < nRegions; i++) { 252 for (int i = 0; i < nRegions; i++) {
253 if (!ashmem_valid(fd[i])) {
254 _exit(3);
255 }
230 void *region = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0); 256 void *region = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0);
231 if (region == MAP_FAILED) { 257 if (region == MAP_FAILED) {
232 _exit(1); 258 _exit(1);