1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors. 4*9507f98cSAndroid Build Coastguard Worker 5*9507f98cSAndroid Build Coastguard Worker #include "util/arena.h" 6*9507f98cSAndroid Build Coastguard Worker 7*9507f98cSAndroid Build Coastguard Worker #include "gtest/gtest.h" 8*9507f98cSAndroid Build Coastguard Worker #include "util/random.h" 9*9507f98cSAndroid Build Coastguard Worker 10*9507f98cSAndroid Build Coastguard Worker namespace leveldb { 11*9507f98cSAndroid Build Coastguard Worker TEST(ArenaTest,Empty)12*9507f98cSAndroid Build Coastguard WorkerTEST(ArenaTest, Empty) { Arena arena; } 13*9507f98cSAndroid Build Coastguard Worker TEST(ArenaTest,Simple)14*9507f98cSAndroid Build Coastguard WorkerTEST(ArenaTest, Simple) { 15*9507f98cSAndroid Build Coastguard Worker std::vector<std::pair<size_t, char*>> allocated; 16*9507f98cSAndroid Build Coastguard Worker Arena arena; 17*9507f98cSAndroid Build Coastguard Worker const int N = 100000; 18*9507f98cSAndroid Build Coastguard Worker size_t bytes = 0; 19*9507f98cSAndroid Build Coastguard Worker Random rnd(301); 20*9507f98cSAndroid Build Coastguard Worker for (int i = 0; i < N; i++) { 21*9507f98cSAndroid Build Coastguard Worker size_t s; 22*9507f98cSAndroid Build Coastguard Worker if (i % (N / 10) == 0) { 23*9507f98cSAndroid Build Coastguard Worker s = i; 24*9507f98cSAndroid Build Coastguard Worker } else { 25*9507f98cSAndroid Build Coastguard Worker s = rnd.OneIn(4000) 26*9507f98cSAndroid Build Coastguard Worker ? rnd.Uniform(6000) 27*9507f98cSAndroid Build Coastguard Worker : (rnd.OneIn(10) ? rnd.Uniform(100) : rnd.Uniform(20)); 28*9507f98cSAndroid Build Coastguard Worker } 29*9507f98cSAndroid Build Coastguard Worker if (s == 0) { 30*9507f98cSAndroid Build Coastguard Worker // Our arena disallows size 0 allocations. 31*9507f98cSAndroid Build Coastguard Worker s = 1; 32*9507f98cSAndroid Build Coastguard Worker } 33*9507f98cSAndroid Build Coastguard Worker char* r; 34*9507f98cSAndroid Build Coastguard Worker if (rnd.OneIn(10)) { 35*9507f98cSAndroid Build Coastguard Worker r = arena.AllocateAligned(s); 36*9507f98cSAndroid Build Coastguard Worker } else { 37*9507f98cSAndroid Build Coastguard Worker r = arena.Allocate(s); 38*9507f98cSAndroid Build Coastguard Worker } 39*9507f98cSAndroid Build Coastguard Worker 40*9507f98cSAndroid Build Coastguard Worker for (size_t b = 0; b < s; b++) { 41*9507f98cSAndroid Build Coastguard Worker // Fill the "i"th allocation with a known bit pattern 42*9507f98cSAndroid Build Coastguard Worker r[b] = i % 256; 43*9507f98cSAndroid Build Coastguard Worker } 44*9507f98cSAndroid Build Coastguard Worker bytes += s; 45*9507f98cSAndroid Build Coastguard Worker allocated.push_back(std::make_pair(s, r)); 46*9507f98cSAndroid Build Coastguard Worker ASSERT_GE(arena.MemoryUsage(), bytes); 47*9507f98cSAndroid Build Coastguard Worker if (i > N / 10) { 48*9507f98cSAndroid Build Coastguard Worker ASSERT_LE(arena.MemoryUsage(), bytes * 1.10); 49*9507f98cSAndroid Build Coastguard Worker } 50*9507f98cSAndroid Build Coastguard Worker } 51*9507f98cSAndroid Build Coastguard Worker for (size_t i = 0; i < allocated.size(); i++) { 52*9507f98cSAndroid Build Coastguard Worker size_t num_bytes = allocated[i].first; 53*9507f98cSAndroid Build Coastguard Worker const char* p = allocated[i].second; 54*9507f98cSAndroid Build Coastguard Worker for (size_t b = 0; b < num_bytes; b++) { 55*9507f98cSAndroid Build Coastguard Worker // Check the "i"th allocation for the known bit pattern 56*9507f98cSAndroid Build Coastguard Worker ASSERT_EQ(int(p[b]) & 0xff, i % 256); 57*9507f98cSAndroid Build Coastguard Worker } 58*9507f98cSAndroid Build Coastguard Worker } 59*9507f98cSAndroid Build Coastguard Worker } 60*9507f98cSAndroid Build Coastguard Worker 61*9507f98cSAndroid Build Coastguard Worker } // namespace leveldb 62*9507f98cSAndroid Build Coastguard Worker 63