|  | /* | 
|  | * Copyright (C) 2013 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 <sys/mman.h> | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | #include <ion/ion.h> | 
|  |  | 
|  | #include "ion_test_fixture.h" | 
|  |  | 
|  | class InvalidValues : public IonAllHeapsTest { | 
|  | public: | 
|  | virtual void SetUp(); | 
|  | virtual void TearDown(); | 
|  | ion_user_handle_t m_validHandle; | 
|  | int m_validShareFd; | 
|  | ion_user_handle_t const m_badHandle = -1; | 
|  | }; | 
|  |  | 
|  | void InvalidValues::SetUp() | 
|  | { | 
|  | IonAllHeapsTest::SetUp(); | 
|  | ASSERT_EQ(0, ion_alloc(m_ionFd, 4096, 0, m_firstHeap, 0, &m_validHandle)) | 
|  | << m_ionFd << " " << m_firstHeap; | 
|  | ASSERT_TRUE(m_validHandle != 0); | 
|  | ASSERT_EQ(0, ion_share(m_ionFd, m_validHandle, &m_validShareFd)); | 
|  | } | 
|  |  | 
|  | void InvalidValues::TearDown() | 
|  | { | 
|  | ASSERT_EQ(0, ion_free(m_ionFd, m_validHandle)); | 
|  | ASSERT_EQ(0, close(m_validShareFd)); | 
|  | m_validHandle = 0; | 
|  | IonAllHeapsTest::TearDown(); | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_close) | 
|  | { | 
|  | EXPECT_EQ(-EBADF, ion_close(-1)); | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_alloc) | 
|  | { | 
|  | ion_user_handle_t handle; | 
|  | /* invalid ion_fd */ | 
|  | int ret = ion_alloc(0, 4096, 0, m_firstHeap, 0, &handle); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion_fd */ | 
|  | EXPECT_EQ(-EBADF, ion_alloc(-1, 4096, 0, m_firstHeap, 0, &handle)); | 
|  | /* no heaps */ | 
|  | EXPECT_EQ(-ENODEV, ion_alloc(m_ionFd, 4096, 0, 0, 0, &handle)); | 
|  | for (unsigned int heapMask : m_allHeaps) { | 
|  | SCOPED_TRACE(::testing::Message() << "heap " << heapMask); | 
|  | /* zero size */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc(m_ionFd, 0, 0, heapMask, 0, &handle)); | 
|  | /* too large size */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc(m_ionFd, -1, 0, heapMask, 0, &handle)); | 
|  | /* bad alignment */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc(m_ionFd, 4096, -1, heapMask, 0, &handle)); | 
|  | /* NULL handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc(m_ionFd, 4096, 0, heapMask, 0, NULL)); | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_alloc_fd) | 
|  | { | 
|  | int fd; | 
|  | /* invalid ion_fd */ | 
|  | int ret = ion_alloc_fd(0, 4096, 0, m_firstHeap, 0, &fd); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion_fd */ | 
|  | EXPECT_EQ(-EBADF, ion_alloc_fd(-1, 4096, 0, m_firstHeap, 0, &fd)); | 
|  | /* no heaps */ | 
|  | EXPECT_EQ(-ENODEV, ion_alloc_fd(m_ionFd, 4096, 0, 0, 0, &fd)); | 
|  | for (unsigned int heapMask : m_allHeaps) { | 
|  | SCOPED_TRACE(::testing::Message() << "heap " << heapMask); | 
|  | /* zero size */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc_fd(m_ionFd, 0, 0, heapMask, 0, &fd)); | 
|  | /* too large size */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc_fd(m_ionFd, -1, 0, heapMask, 0, &fd)); | 
|  | /* bad alignment */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc_fd(m_ionFd, 4096, -1, heapMask, 0, &fd)); | 
|  | /* NULL handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_alloc_fd(m_ionFd, 4096, 0, heapMask, 0, NULL)); | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_free) | 
|  | { | 
|  | /* invalid ion fd */ | 
|  | int ret = ion_free(0, m_validHandle); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion fd */ | 
|  | EXPECT_EQ(-EBADF, ion_free(-1, m_validHandle)); | 
|  | /* zero handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_free(m_ionFd, 0)); | 
|  | /* bad handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_free(m_ionFd, m_badHandle)); | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_map) | 
|  | { | 
|  | int map_fd; | 
|  | unsigned char *ptr; | 
|  |  | 
|  | /* invalid ion fd */ | 
|  | int ret = ion_map(0, m_validHandle, 4096, PROT_READ, 0, 0, &ptr, &map_fd); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion fd */ | 
|  | EXPECT_EQ(-EBADF, ion_map(-1, m_validHandle, 4096, PROT_READ, 0, 0, &ptr, &map_fd)); | 
|  | /* zero handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, 0, 4096, PROT_READ, 0, 0, &ptr, &map_fd)); | 
|  | /* bad handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, m_badHandle, 4096, PROT_READ, 0, 0, &ptr, &map_fd)); | 
|  | /* zero length */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, m_validHandle, 0, PROT_READ, 0, 0, &ptr, &map_fd)); | 
|  | /* bad prot */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, m_validHandle, 4096, -1, 0, 0, &ptr, &map_fd)); | 
|  | /* bad offset */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, m_validHandle, 4096, PROT_READ, 0, -1, &ptr, &map_fd)); | 
|  | /* NULL ptr */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, m_validHandle, 4096, PROT_READ, 0, 0, NULL, &map_fd)); | 
|  | /* NULL map_fd */ | 
|  | EXPECT_EQ(-EINVAL, ion_map(m_ionFd, m_validHandle, 4096, PROT_READ, 0, 0, &ptr, NULL)); | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_share) | 
|  | { | 
|  | int share_fd; | 
|  |  | 
|  | /* invalid ion fd */ | 
|  | int ret = ion_share(0, m_validHandle, &share_fd); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion fd */ | 
|  | EXPECT_EQ(-EBADF, ion_share(-1, m_validHandle, &share_fd)); | 
|  | /* zero handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_share(m_ionFd, 0, &share_fd)); | 
|  | /* bad handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_share(m_ionFd, m_badHandle, &share_fd)); | 
|  | /* NULL share_fd */ | 
|  | EXPECT_EQ(-EINVAL, ion_share(m_ionFd, m_validHandle, NULL)); | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_import) | 
|  | { | 
|  | ion_user_handle_t handle; | 
|  |  | 
|  | /* invalid ion fd */ | 
|  | int ret = ion_import(0, m_validShareFd, &handle); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion fd */ | 
|  | EXPECT_EQ(-EBADF, ion_import(-1, m_validShareFd, &handle)); | 
|  | /* bad share_fd */ | 
|  | EXPECT_EQ(-EINVAL, ion_import(m_ionFd, 0, &handle)); | 
|  | /* invalid share_fd */ | 
|  | EXPECT_EQ(-EBADF, ion_import(m_ionFd, -1, &handle)); | 
|  | /* NULL handle */ | 
|  | EXPECT_EQ(-EINVAL, ion_import(m_ionFd, m_validShareFd, NULL)); | 
|  | } | 
|  |  | 
|  | TEST_F(InvalidValues, ion_sync_fd) | 
|  | { | 
|  | /* invalid ion fd */ | 
|  | int ret = ion_sync_fd(0, m_validShareFd); | 
|  | EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); | 
|  | /* invalid ion fd */ | 
|  | EXPECT_EQ(-EBADF, ion_sync_fd(-1, m_validShareFd)); | 
|  | /* bad share_fd */ | 
|  | EXPECT_EQ(-EINVAL, ion_sync_fd(m_ionFd, 0)); | 
|  | /* invalid share_fd */ | 
|  | EXPECT_EQ(-EBADF, ion_sync_fd(m_ionFd, -1)); | 
|  | } |