Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2016 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 <Allocator.h>
     18 
     19 #include <ScopedDisableMalloc.h>
     20 #include <gtest/gtest.h>
     21 
     22 namespace android {
     23 
     24 std::function<void()> ScopedAlarm::func_;
     25 
     26 class AllocatorTest : public testing::Test {
     27  protected:
     28   AllocatorTest() : heap(), disable_malloc_() {}
     29   virtual void SetUp() { heap_count = 0; }
     30   virtual void TearDown() {
     31     ASSERT_EQ(heap_count, 0);
     32     ASSERT_TRUE(heap.empty());
     33     ASSERT_FALSE(disable_malloc_.timed_out());
     34   }
     35   Heap heap;
     36 
     37  private:
     38   ScopedDisableMallocTimeout disable_malloc_;
     39 };
     40 
     41 TEST_F(AllocatorTest, simple) {
     42   Allocator<char[100]> allocator(heap);
     43   void* ptr = allocator.allocate();
     44   ASSERT_TRUE(ptr != NULL);
     45   allocator.deallocate(ptr);
     46 }
     47 
     48 TEST_F(AllocatorTest, multiple) {
     49   Allocator<char[100]> allocator(heap);
     50   void* ptr1 = allocator.allocate();
     51   ASSERT_TRUE(ptr1 != NULL);
     52   void* ptr2 = allocator.allocate();
     53   ASSERT_TRUE(ptr2 != NULL);
     54   ASSERT_NE(ptr1, ptr2);
     55   allocator.deallocate(ptr1);
     56   void* ptr3 = allocator.allocate();
     57   ASSERT_EQ(ptr1, ptr3);
     58   allocator.deallocate(ptr3);
     59   allocator.deallocate(ptr2);
     60 }
     61 
     62 TEST_F(AllocatorTest, many) {
     63   const int num = 4096;
     64   const int size = 128;
     65   Allocator<char[size]> allocator(heap);
     66   void* ptr[num];
     67   for (int i = 0; i < num; i++) {
     68     ptr[i] = allocator.allocate();
     69     memset(ptr[i], 0xaa, size);
     70     *(reinterpret_cast<unsigned char*>(ptr[i])) = i;
     71   }
     72 
     73   for (int i = 0; i < num; i++) {
     74     for (int j = 0; j < num; j++) {
     75       if (i != j) {
     76         ASSERT_NE(ptr[i], ptr[j]);
     77       }
     78     }
     79   }
     80 
     81   for (int i = 0; i < num; i++) {
     82     ASSERT_EQ(*(reinterpret_cast<unsigned char*>(ptr[i])), i & 0xFF);
     83     allocator.deallocate(ptr[i]);
     84   }
     85 }
     86 
     87 TEST_F(AllocatorTest, large) {
     88   const size_t size = 1024 * 1024;
     89   Allocator<char[size]> allocator(heap);
     90   void* ptr = allocator.allocate();
     91   memset(ptr, 0xaa, size);
     92   allocator.deallocate(ptr);
     93 }
     94 
     95 TEST_F(AllocatorTest, many_large) {
     96   const int num = 128;
     97   const int size = 1024 * 1024;
     98   Allocator<char[size]> allocator(heap);
     99   void* ptr[num];
    100   for (int i = 0; i < num; i++) {
    101     ptr[i] = allocator.allocate();
    102     memset(ptr[i], 0xaa, size);
    103     *(reinterpret_cast<unsigned char*>(ptr[i])) = i;
    104   }
    105 
    106   for (int i = 0; i < num; i++) {
    107     ASSERT_EQ(*(reinterpret_cast<unsigned char*>(ptr[i])), i & 0xFF);
    108     allocator.deallocate(ptr[i]);
    109   }
    110 }
    111 
    112 TEST_F(AllocatorTest, copy) {
    113   Allocator<char[100]> a(heap);
    114   Allocator<char[200]> b = a;
    115   Allocator<char[300]> c(b);
    116   Allocator<char[100]> d(a);
    117   Allocator<char[100]> e(heap);
    118 
    119   ASSERT_EQ(a, b);
    120   ASSERT_EQ(a, c);
    121   ASSERT_EQ(a, d);
    122   ASSERT_EQ(a, e);
    123 
    124   void* ptr1 = a.allocate();
    125   void* ptr2 = b.allocate();
    126   void* ptr3 = c.allocate();
    127   void* ptr4 = d.allocate();
    128 
    129   b.deallocate(ptr1);
    130   d.deallocate(ptr2);
    131   a.deallocate(ptr3);
    132   c.deallocate(ptr4);
    133 }
    134 
    135 TEST_F(AllocatorTest, stl_vector) {
    136   auto v = allocator::vector<int>(Allocator<int>(heap));
    137   for (int i = 0; i < 1024; i++) {
    138     v.push_back(i);
    139   }
    140   for (int i = 0; i < 1024; i++) {
    141     ASSERT_EQ(v[i], i);
    142   }
    143   v.clear();
    144 }
    145 
    146 TEST_F(AllocatorTest, stl_list) {
    147   auto v = allocator::list<int>(Allocator<int>(heap));
    148   for (int i = 0; i < 1024; i++) {
    149     v.push_back(i);
    150   }
    151   int i = 0;
    152   for (auto iter = v.begin(); iter != v.end(); iter++, i++) {
    153     ASSERT_EQ(*iter, i);
    154   }
    155   v.clear();
    156 }
    157 
    158 TEST_F(AllocatorTest, shared) {
    159   Allocator<int> allocator(heap);
    160 
    161   Allocator<int>::shared_ptr ptr = allocator.make_shared(0);
    162   {
    163     auto ptr2 = ptr;  // NOLINT, test copy of ptr
    164   }
    165   ASSERT_NE(ptr, nullptr);
    166 }
    167 
    168 TEST_F(AllocatorTest, unique) {
    169   Allocator<int> allocator(heap);
    170 
    171   Allocator<int>::unique_ptr ptr = allocator.make_unique(0);
    172 
    173   ASSERT_NE(ptr, nullptr);
    174 }
    175 
    176 }  // namespace android
    177