| /* | |
| * Copyright (C) 2019 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #include <dlfcn.h> | |
| #include <binder/IServiceManager.h> | |
| #include <gtest/gtest.h> | |
| #include <linux/ashmem.h> | |
| #include <sys/mman.h> | |
| #include <android/ashmemd/IAshmemDeviceService.h> | |
| using android::IBinder; | |
| using android::IServiceManager; | |
| using android::String16; | |
| using android::ashmemd::IAshmemDeviceService; | |
| using android::os::ParcelFileDescriptor; | |
| namespace android { | |
| namespace ashmemd { | |
| class AshmemdTest : public ::testing::Test { | |
| public: | |
| virtual void SetUp() override { | |
| sp<IServiceManager> sm = android::defaultServiceManager(); | |
| sp<IBinder> binder = sm->getService(String16("ashmem_device_service")); | |
| ASSERT_NE(binder, nullptr); | |
| ashmemService = android::interface_cast<IAshmemDeviceService>(binder); | |
| ASSERT_NE(ashmemService, nullptr); | |
| } | |
| void openFd(ParcelFileDescriptor* fd) { | |
| auto status = ashmemService->open(fd); | |
| ASSERT_TRUE(status.isOk()); | |
| ASSERT_GE(fd->get(), 0); | |
| } | |
| sp<IAshmemDeviceService> ashmemService; | |
| }; | |
| TEST_F(AshmemdTest, OpenFd) { | |
| ParcelFileDescriptor fd; | |
| openFd(&fd); | |
| } | |
| TEST_F(AshmemdTest, OpenMultipleFds) { | |
| ParcelFileDescriptor fd1; | |
| ParcelFileDescriptor fd2; | |
| openFd(&fd1); | |
| openFd(&fd2); | |
| ASSERT_NE(fd1.get(), fd2.get()); | |
| } | |
| TEST_F(AshmemdTest, MmapFd) { | |
| ParcelFileDescriptor pfd; | |
| openFd(&pfd); | |
| int fd = pfd.get(); | |
| size_t testSize = 2097152; | |
| ASSERT_EQ(ioctl(fd, ASHMEM_SET_NAME, "AshmemdTest"), 0); | |
| ASSERT_EQ(ioctl(fd, ASHMEM_SET_SIZE, testSize), 0); | |
| void* data = mmap(NULL, testSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); | |
| ASSERT_NE(data, MAP_FAILED) << "Failed to mmap() ashmem fd"; | |
| ASSERT_EQ(munmap(data, testSize), 0) << "Failed to munmap() ashmem fd"; | |
| } | |
| TEST(LibAshmemdClientTest, OpenFd) { | |
| void* handle = dlopen("libashmemd_client.so", RTLD_NOW); | |
| ASSERT_NE(handle, nullptr) << "Failed to dlopen() libashmemd_client.so: " << dlerror(); | |
| auto function = (int (*)())dlsym(handle, "openAshmemdFd"); | |
| ASSERT_NE(function, nullptr) << "Failed to dlsym() openAshmemdFd() function: " << dlerror(); | |
| int fd = function(); | |
| ASSERT_GE(fd, 0) << "Failed to open /dev/ashmem"; | |
| } | |
| } // namespace ashmemd | |
| } // namespace android |