Permalink
Browse files

Added test for MallocAllocator and hopefully fixed memory accounting …

…bug.
  • Loading branch information...
1 parent 7eec421 commit dce34bae919fbece317bbec56644bc911a713c6e cjdelisle committed Feb 16, 2012
Showing with 78 additions and 2 deletions.
  1. +1 −1 memory/CMakeLists.txt
  2. +1 −1 memory/MallocAllocator.c
  3. +30 −0 memory/test/CMakeLists.txt
  4. +46 −0 memory/test/MallocAllocator_test.c
View
@@ -20,4 +20,4 @@ add_library(cjdmemory
# Everything must be tested.
enable_testing()
-#add_subdirectory(test) later
+add_subdirectory(test)
View
@@ -219,7 +219,7 @@ static struct Allocator* childAllocator(const struct Allocator* allocator)
struct Allocator* childAlloc = MallocAllocator_new(0);
- *(context->spaceAvailable) -= sizeof(struct FirstContext);
+ *(context->spaceAvailable) -= (sizeof(struct FirstContext) + sizeof(struct Allocation));
struct Context* child = (struct Context*) childAlloc->context;
child->maxSpace = context->maxSpace;
View
@@ -0,0 +1,30 @@
+# You may redistribute this program and/or modify it under the terms of
+# the GNU General Public License as published by the Free Software Foundation,
+# either version 3 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+cmake_minimum_required(VERSION 2.4)
+
+string(REGEX REPLACE "^.*/" "" main_dir_name ${CMAKE_SOURCE_DIR})
+string(REPLACE ${CMAKE_SOURCE_DIR} ${main_dir_name} this_dir ${CMAKE_CURRENT_SOURCE_DIR})
+message("-- Tests to run for " ${this_dir})
+add_definitions(-g)
+
+# Anything in this dir which ends with "test.c" is considered a test.
+file(GLOB tests "*test.c")
+foreach(test_source_fullpath ${tests})
+ string(REGEX REPLACE "^.*/" "" test_source ${test_source_fullpath})
+ string(REPLACE "test.c" "test" test_bin ${test_source})
+ message(" " ${test_source})
+ add_executable(${test_bin} ${test_source})
+ target_link_libraries(${test_bin} cjdmemory)
+ add_test(${test_bin} ${test_bin})
+endforeach()
+# Add an empty line after tests.
+message("")
@@ -0,0 +1,46 @@
+/*
+ * You may redistribute this program and/or modify it under the terms of
+ * the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include <assert.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "memory/Allocator.h"
+#include "memory/MallocAllocator.h"
+
+#define ALLOCATION_SIZE ((size_t)16)
+#define ALLOCATOR_SIZE ((size_t)128)
+
+int main()
+{
+ struct Allocator* alloc = MallocAllocator_new(2048);
+ size_t bytesUsed;
+ assert((bytesUsed = MallocAllocator_bytesAllocated(alloc)) == 0);
+ alloc->malloc(25, alloc);
+ bytesUsed += 25 + ALLOCATION_SIZE;
+ assert(MallocAllocator_bytesAllocated(alloc) == bytesUsed);
+
+ struct Allocator* child = alloc->child(alloc);
+ bytesUsed += ALLOCATION_SIZE + ALLOCATOR_SIZE;
+ assert(MallocAllocator_bytesAllocated(alloc) == bytesUsed);
+
+ child->malloc(30, child);
+ bytesUsed += 30 + ALLOCATION_SIZE;
+ assert(MallocAllocator_bytesAllocated(alloc) == bytesUsed);
+
+ child->free(child);
+ bytesUsed -= 30 + ALLOCATION_SIZE;
+ bytesUsed -= ALLOCATION_SIZE + ALLOCATOR_SIZE;
+ assert(MallocAllocator_bytesAllocated(alloc) == bytesUsed);
+}

0 comments on commit dce34ba

Please sign in to comment.