/* * 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 #include #include #include #include #include "ion_test_fixture.h" class InvalidValues : public IonTest {}; TEST_F(InvalidValues, ion_close) { EXPECT_EQ(-EBADF, ion_close(-1)); } TEST_F(InvalidValues, ion_alloc_fd) { int fd; // no heaps EXPECT_EQ(-ENODEV, ion_alloc_fd(ionfd, 4096, 0, 0, 0, &fd)); for (const auto& heap : ion_heaps) { // invalid ion_fd EXPECT_EQ(-EBADF, ion_alloc_fd(-1, 4096, 0, (1 << heap.heap_id), 0, &fd)); SCOPED_TRACE(::testing::Message() << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); // zero size EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, 0, 0, (1 << heap.heap_id), 0, &fd)); // too large size int ret = ion_alloc_fd(ionfd, -1, 0, (1 << heap.heap_id), 0, &fd); EXPECT_TRUE(ret == -EINVAL || ret == -ENOMEM); // bad alignment // TODO: Current userspace and kernel code completely ignores alignment. So this // test is going to fail. We need to completely remove alignment from the API. // All memory by default is always page aligned. OR actually pass the alignment // down into the kernel and make kernel respect the alignment. // EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, 4096, -1, (1 << heap.heap_id), 0, &fd)); // NULL fd EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, 4096, 0, (1 << heap.heap_id), 0, nullptr)); } } TEST_F(InvalidValues, ion_query_heap_cnt) { // NULL count EXPECT_EQ(-EINVAL, ion_query_heap_cnt(ionfd, nullptr)); int heap_count; // bad fd EXPECT_EQ(-EBADF, ion_query_heap_cnt(-1, &heap_count)); } TEST_F(InvalidValues, ion_query_get_heaps) { int heap_count; ASSERT_EQ(0, ion_query_heap_cnt(ionfd, &heap_count)); ASSERT_GT(heap_count, 0); // nullptr buffers, still returns success but without // the ion_heap_data. EXPECT_EQ(0, ion_query_get_heaps(ionfd, heap_count, nullptr)); std::unique_ptr heaps = std::make_unique(heap_count); // bad fd EXPECT_EQ(-EBADF, ion_query_get_heaps(-1, heap_count, heaps.get())); // invalid heap data pointer EXPECT_EQ(-EFAULT, ion_query_get_heaps(ionfd, heap_count, reinterpret_cast(0xdeadf00d))); }