Merge "libcutils: test: increase use of ashmem_valid(fd)" am: dd218e6c84

am: 9f3a257536

Change-Id: I182f6535bca2d0c504408211f05877a95a9eac59
This commit is contained in:
Mark Salyzyn 2018-01-31 17:47:07 +00:00 committed by android-build-merger
commit 43f2c5cf38
1 changed files with 48 additions and 22 deletions

View File

@ -14,11 +14,18 @@
* limitations under the License.
*/
#include <errno.h>
#include <linux/fs.h>
#include <stdint.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <android-base/macros.h>
#include <android-base/unique_fd.h>
#include <cutils/ashmem.h>
#include <gtest/gtest.h>
#include <linux/fs.h>
#include <sys/mman.h>
using android::base::unique_fd;
@ -31,15 +38,21 @@ void TestCreateRegion(size_t size, unique_fd &fd, int prot) {
}
void TestMmap(const unique_fd& fd, size_t size, int prot, void** region, off_t off = 0) {
ASSERT_TRUE(fd >= 0);
ASSERT_TRUE(ashmem_valid(fd));
*region = mmap(nullptr, size, prot, MAP_SHARED, fd, off);
ASSERT_NE(MAP_FAILED, *region);
}
void TestProtDenied(const unique_fd &fd, size_t size, int prot) {
ASSERT_TRUE(fd >= 0);
ASSERT_TRUE(ashmem_valid(fd));
EXPECT_EQ(MAP_FAILED, mmap(nullptr, size, prot, MAP_SHARED, fd, 0));
}
void TestProtIs(const unique_fd& fd, int prot) {
ASSERT_TRUE(fd >= 0);
ASSERT_TRUE(ashmem_valid(fd));
EXPECT_EQ(prot, ioctl(fd, ASHMEM_GET_PROT_MASK));
}
@ -86,18 +99,23 @@ TEST(AshmemTest, ForkTest) {
ASSERT_EQ(0, memcmp(region1, &data, size));
EXPECT_EQ(0, munmap(region1, size));
ASSERT_EXIT({
void *region2 = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (region2 == MAP_FAILED) {
_exit(1);
}
if (memcmp(region2, &data, size) != 0) {
_exit(2);
}
memset(region2, 0, size);
munmap(region2, size);
_exit(0);
}, ::testing::ExitedWithCode(0),"");
ASSERT_EXIT(
{
if (!ashmem_valid(fd)) {
_exit(3);
}
void* region2 = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (region2 == MAP_FAILED) {
_exit(1);
}
if (memcmp(region2, &data, size) != 0) {
_exit(2);
}
memset(region2, 0, size);
munmap(region2, size);
_exit(0);
},
::testing::ExitedWithCode(0), "");
memset(&data, 0, size);
void *region2;
@ -146,6 +164,7 @@ TEST(AshmemTest, FileOperationsTest) {
};
for (const auto& cfg : seeks) {
errno = 0;
ASSERT_TRUE(ashmem_valid(fd));
auto off = lseek(fd, cfg.offset, cfg.whence);
ASSERT_EQ(cfg.ret, off) << "lseek(" << cfg.offset << ", " << cfg.whence << ") failed"
<< (errno ? ": " : "") << (errno ? strerror(errno) : "");
@ -196,15 +215,19 @@ TEST(AshmemTest, ForkProtTest) {
constexpr size_t size = PAGE_SIZE;
int protFlags[] = { PROT_READ, PROT_WRITE };
for (int i = 0; i < 2; i++) {
for (size_t i = 0; i < arraysize(protFlags); i++) {
ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE));
ASSERT_EXIT({
if (ashmem_set_prot_region(fd, protFlags[i]) >= 0) {
_exit(0);
} else {
_exit(1);
}
}, ::testing::ExitedWithCode(0), "");
ASSERT_EXIT(
{
if (!ashmem_valid(fd)) {
_exit(3);
} else if (ashmem_set_prot_region(fd, protFlags[i]) >= 0) {
_exit(0);
} else {
_exit(1);
}
},
::testing::ExitedWithCode(0), "");
ASSERT_NO_FATAL_FAILURE(TestProtDenied(fd, size, protFlags[1-i]));
}
}
@ -227,6 +250,9 @@ TEST(AshmemTest, ForkMultiRegionTest) {
ASSERT_EXIT({
for (int i = 0; i < nRegions; i++) {
if (!ashmem_valid(fd[i])) {
_exit(3);
}
void *region = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0);
if (region == MAP_FAILED) {
_exit(1);