From e16b2bc4a9860937d479fda79a288919208f00d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 3 Sep 2004 16:05:44 +0000 Subject: [PATCH] Added a test application for the BlockMap class. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8827 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/tests/kernel/core/Jamfile | 1 + src/tests/kernel/core/cache/BlockMapTest.cpp | 143 +++++++++++++++++++ src/tests/kernel/core/cache/Jamfile | 15 ++ 3 files changed, 159 insertions(+) create mode 100644 src/tests/kernel/core/cache/BlockMapTest.cpp create mode 100644 src/tests/kernel/core/cache/Jamfile diff --git a/src/tests/kernel/core/Jamfile b/src/tests/kernel/core/Jamfile index a61e120f15..f8c3b4dc15 100644 --- a/src/tests/kernel/core/Jamfile +++ b/src/tests/kernel/core/Jamfile @@ -1,4 +1,5 @@ SubDir OBOS_TOP src tests kernel core ; +SubInclude OBOS_TOP src tests kernel core cache ; SubInclude OBOS_TOP src tests kernel core disk_device_manager ; SubInclude OBOS_TOP src tests kernel core util ; diff --git a/src/tests/kernel/core/cache/BlockMapTest.cpp b/src/tests/kernel/core/cache/BlockMapTest.cpp new file mode 100644 index 0000000000..92aba01786 --- /dev/null +++ b/src/tests/kernel/core/cache/BlockMapTest.cpp @@ -0,0 +1,143 @@ +/* +** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the Haiku License. +*/ + + +#include + +#include +#include +#include + + +static const off_t kSize = 262144; // 4096 * 262144 == 1 GB of file size +static const int32 kLoops = 4096; // 4096 * 4096 == 16 MB in cache (completely arbitrary which will never be the case) + + +int32 +offset_in_array(off_t *array, int32 maxSize, off_t offset) +{ + for (int32 i = 0; i < maxSize; i++) { + if (array[i] == offset) + return i; + } + + return B_ENTRY_NOT_FOUND; +} + + +int +main(int argc, char **argv) +{ + BlockMap map(kSize); + + status_t status = map.InitCheck(); + if (status != B_OK) { + fprintf(stderr, "map creation failed: %s\n", strerror(status)); + return 1; + } + + printf("Adding %ld offsets from 0 to %Ld...\n", kLoops, kSize); + + off_t offsets[kLoops]; + for (int32 i = 0; i < kLoops; i++) { + off_t offset; + do { + offset = rand() * kSize / RAND_MAX; + } while (offset_in_array(offsets, i, offset) >= B_OK); + + offsets[i] = offset; + map.Set(offsets[i], i + 1); + } + + printf("Testing all offsets in the map...\n"); + + for (off_t offset = 0; offset < kSize; offset++) { + // look for offset in array + int32 index = offset_in_array(offsets, kLoops, offset); + + addr_t address; + if (map.Get(offset, address) == B_OK) { + if (index >= 0) { + if (address != (uint32)index + 1) + fprintf(stderr, " offset %Ld contains wrong address %lx, should have been %lx\n", offset, address, index + 1); + } else + fprintf(stderr, " offset %Ld found in map but never added\n", offset); + } else { + if (index >= 0) + fprintf(stderr, " offset %Ld not found in map but should be there\n", offset); + } + } + + printf("Remove last offset...\n"); + + // remove last offset + map.Remove(offsets[kLoops - 1]); + addr_t address; + if (map.Get(offsets[kLoops - 1], address) == B_OK) + fprintf(stderr, " Removing offset %Ld failed (got address %lx)!\n", offsets[kLoops - 1], address); + + // remove offsets in the middle + off_t start = kSize / 4; + off_t num = kSize / 2; + off_t end = start + num; + + printf("Remove all offsets from %Ld to %Ld (and add bounds check offsets)...\n", start, end); + + bool startWall[3] = {false}; + for (int32 i = 0; i < 3; i++) { + if (offset_in_array(offsets, kLoops, start - 1 + i) < B_OK) { + startWall[i] = true; + map.Set(start - 1 + i, i + 1); + } + } + + bool endWall[3] = {false}; + for (int32 i = 0; i < 3; i++) { + if (offset_in_array(offsets, kLoops, end - 1 + i) < B_OK) { + endWall[i] = true; + map.Set(end - 1 + i, i + 1); + } + } + + map.Remove(start, num); + + printf("Testing all offsets in the map...\n"); + + for (off_t offset = 0; offset < kSize; offset++) { + // look for offset in array + int32 index = offset_in_array(offsets, kLoops - 1, offset); + + addr_t address; + if (map.Get(offset, address) == B_OK) { + if (offset >= start && offset < end) { + fprintf(stderr, " should not contain removed offset %Ld:%lx!\n", offset, address); + } else if (index >= 0) { + if (address != (uint32)index + 1) + fprintf(stderr, " offset %Ld contains wrong address %lx, should have been %lx\n", offset, address, index + 1); + } else { + if (offset >= start -1 && offset <= start + 1) { + // start && start + 1 must not be in the map anymore + if (offset >= start && offset <= start + 1) + fprintf(stderr, " start wall %Ld in map\n", offset); + } else if (offset >= end - 1 && offset <= end + 1) { + // end - 1 must not be in the map anymore + if (offset == end - 1) + fprintf(stderr, " end wall %Ld in map\n", offset); + } else + fprintf(stderr, " offset %Ld found in map but never added\n", offset); + } + } else { + if (index >= 0 && (offset < start || offset >= end)) + fprintf(stderr, " offset %Ld not found in map but should be there\n", offset); + + if (offset == start - 1 && startWall[offset - start - 1]) + fprintf(stderr, " start wall %Ld not in map\n", offset); + else if (offset >= end && offset <= end + 1 && endWall[offset - end - 1]) + fprintf(stderr, " end wall %Ld not in map\n", offset); + } + } + + return 0; +} diff --git a/src/tests/kernel/core/cache/Jamfile b/src/tests/kernel/core/cache/Jamfile new file mode 100644 index 0000000000..ce623c21e0 --- /dev/null +++ b/src/tests/kernel/core/cache/Jamfile @@ -0,0 +1,15 @@ +SubDir OBOS_TOP src tests kernel core cache ; + +SEARCH_SOURCE += [ FDirName $(OBOS_TOP) src kernel core cache ] ; +SEARCH_SOURCE += [ FDirName $(OBOS_TOP) src kernel core ] ; + +UsePrivateHeaders kernel ; +UseHeaders [ FDirName $(OBOS_TOP) src kernel core cache ] ; + +SimpleTest BlockMapTest : + BlockMapTest.cpp + BlockMap.cpp + khash.c + : libkernelland_emu.so + ; +