Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <sys/mman.h>
     18 
     19 #include <gtest/gtest.h>
     20 
     21 #include <ion/ion.h>
     22 
     23 #include "ion_test_fixture.h"
     24 
     25 class Exit : public IonAllHeapsTest {
     26 };
     27 
     28 TEST_F(Exit, WithAlloc)
     29 {
     30     static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
     31     for (unsigned int heapMask : m_allHeaps) {
     32         for (size_t size : allocationSizes) {
     33             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
     34             SCOPED_TRACE(::testing::Message() << "size " << size);
     35             EXPECT_EXIT({
     36                 ion_user_handle_t handle = 0;
     37 
     38                 ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, 0, &handle));
     39                 ASSERT_TRUE(handle != 0);
     40                 exit(0);
     41             }, ::testing::ExitedWithCode(0), "");
     42         }
     43     }
     44 }
     45 
     46 TEST_F(Exit, WithAllocFd)
     47 {
     48     static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
     49     for (unsigned int heapMask : m_allHeaps) {
     50         for (size_t size : allocationSizes) {
     51             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
     52             SCOPED_TRACE(::testing::Message() << "size " << size);
     53             EXPECT_EXIT({
     54                 int handle_fd = -1;
     55 
     56                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &handle_fd));
     57                 ASSERT_NE(-1, handle_fd);
     58                 exit(0);
     59             }, ::testing::ExitedWithCode(0), "");
     60         }
     61     }
     62 }
     63 
     64 TEST_F(Exit, WithRepeatedAllocFd)
     65 {
     66     static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
     67     for (unsigned int heapMask : m_allHeaps) {
     68         for (size_t size : allocationSizes) {
     69             for (unsigned int i = 0; i < 1024; i++) {
     70                 SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
     71                 SCOPED_TRACE(::testing::Message() << "size " << size);
     72                 ASSERT_EXIT({
     73                     int handle_fd = -1;
     74 
     75                     ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &handle_fd));
     76                     ASSERT_NE(-1, handle_fd);
     77                     exit(0);
     78                 }, ::testing::ExitedWithCode(0), "")
     79                         << "failed on heap " << heapMask
     80                         << " and size " << size
     81                         << " on iteration " << i;
     82             }
     83         }
     84     }
     85 }
     86 
     87 
     88 TEST_F(Exit, WithMapping)
     89 {
     90     static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
     91     for (unsigned int heapMask : m_allHeaps) {
     92         for (size_t size : allocationSizes) {
     93             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
     94             SCOPED_TRACE(::testing::Message() << "size " << size);
     95             EXPECT_EXIT({
     96                 int map_fd = -1;
     97 
     98                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &map_fd));
     99                 ASSERT_GE(map_fd, 0);
    100 
    101                 void *ptr;
    102                 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
    103                 ASSERT_TRUE(ptr != NULL);
    104                 exit(0);
    105             }, ::testing::ExitedWithCode(0), "");
    106         }
    107     }
    108 
    109 }
    110 
    111 TEST_F(Exit, WithPartialMapping)
    112 {
    113     static const size_t allocationSizes[] = {64*1024, 1024*1024, 2*1024*1024};
    114     for (unsigned int heapMask : m_allHeaps) {
    115         for (size_t size : allocationSizes) {
    116             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
    117             SCOPED_TRACE(::testing::Message() << "size " << size);
    118             EXPECT_EXIT({
    119                 int map_fd = -1;
    120 
    121                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &map_fd));
    122                 ASSERT_GE(map_fd, 0);
    123 
    124                 void *ptr;
    125                 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
    126                 ASSERT_TRUE(ptr != NULL);
    127 
    128                 ASSERT_EQ(0, munmap(ptr, size / 2));
    129                 exit(0);
    130             }, ::testing::ExitedWithCode(0), "");
    131         }
    132     }
    133 }
    134 
    135 TEST_F(Exit, WithMappingCached)
    136 {
    137     static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
    138     for (unsigned int heapMask : m_allHeaps) {
    139         for (size_t size : allocationSizes) {
    140             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
    141             SCOPED_TRACE(::testing::Message() << "size " << size);
    142             EXPECT_EXIT({
    143                 int map_fd = -1;
    144 
    145                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, ION_FLAG_CACHED, &map_fd));
    146                 ASSERT_GE(map_fd, 0);
    147 
    148                 void *ptr;
    149                 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
    150                 ASSERT_TRUE(ptr != NULL);
    151                 exit(0);
    152             }, ::testing::ExitedWithCode(0), "");
    153         }
    154     }
    155 
    156 }
    157 
    158 TEST_F(Exit, WithPartialMappingCached)
    159 {
    160     static const size_t allocationSizes[] = {64*1024, 1024*1024, 2*1024*1024};
    161     for (unsigned int heapMask : m_allHeaps) {
    162         for (size_t size : allocationSizes) {
    163             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
    164             SCOPED_TRACE(::testing::Message() << "size " << size);
    165             EXPECT_EXIT({
    166                 int map_fd = -1;
    167 
    168                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, ION_FLAG_CACHED, &map_fd));
    169                 ASSERT_GE(map_fd, 0);
    170 
    171                 void *ptr;
    172                 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
    173                 ASSERT_TRUE(ptr != NULL);
    174 
    175                 ASSERT_EQ(0, munmap(ptr, size / 2));
    176                 exit(0);
    177             }, ::testing::ExitedWithCode(0), "");
    178         }
    179     }
    180 }
    181 
    182 TEST_F(Exit, WithMappingNeedsSync)
    183 {
    184     static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
    185     for (unsigned int heapMask : m_allHeaps) {
    186         for (size_t size : allocationSizes) {
    187             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
    188             SCOPED_TRACE(::testing::Message() << "size " << size);
    189             EXPECT_EXIT({
    190                 int map_fd = -1;
    191 
    192                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC, &map_fd));
    193                 ASSERT_GE(map_fd, 0);
    194 
    195                 void *ptr;
    196                 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
    197                 ASSERT_TRUE(ptr != NULL);
    198                 exit(0);
    199             }, ::testing::ExitedWithCode(0), "");
    200         }
    201     }
    202 
    203 }
    204 
    205 TEST_F(Exit, WithPartialMappingNeedsSync)
    206 {
    207     static const size_t allocationSizes[] = {64*1024, 1024*1024, 2*1024*1024};
    208     for (unsigned int heapMask : m_allHeaps) {
    209         for (size_t size : allocationSizes) {
    210             SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
    211             SCOPED_TRACE(::testing::Message() << "size " << size);
    212             EXPECT_EXIT({
    213                 int map_fd = -1;
    214 
    215                 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC, &map_fd));
    216                 ASSERT_GE(map_fd, 0);
    217 
    218                 void *ptr;
    219                 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
    220                 ASSERT_TRUE(ptr != NULL);
    221 
    222                 ASSERT_EQ(0, munmap(ptr, size / 2));
    223                 exit(0);
    224             }, ::testing::ExitedWithCode(0), "");
    225         }
    226     }
    227 }
    228