| /* |
| * 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 |