/* vim: set expandtab ts=4 sw=4: */ /* * 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 . */ #include "crypto/random/Random.h" #include "memory/MallocAllocator.h" #include "benc/String.h" #include "util/Assert.h" #include "util/events/Time.h" #include "util/log/FileWriterLog.h" #define Map_NAME OfLongsByInteger #define Map_KEY_TYPE uint32_t #define Map_VALUE_TYPE uint64_t #define Map_ENABLE_HANDLES #include "util/Map.h" #include #include // Increase this number to make the fuzz test run longer. #define QUICK_CYCLES 5 #define SLOW_CYCLES 1000 int main(int argc, char* argv[]) { int cycles = QUICK_CYCLES; for (int i = 0; i < argc; i++) { if (!CString_strcmp("--fuzz", argv[i])) { cycles = SLOW_CYCLES; break; } } // This test is too slow to run with the normal battery of tests if (cycles == QUICK_CYCLES) { return 0; } struct Allocator* mainAlloc = MallocAllocator_new(1<<18); struct Random* rand = Random_new(mainAlloc, NULL, NULL); struct Log* logger = FileWriterLog_new(stdout, mainAlloc); for (int cycle = 0; cycle < cycles; cycle++) { struct Allocator* alloc = MallocAllocator_new(1<<24); struct Map_OfLongsByInteger* map = Map_OfLongsByInteger_new(alloc); uint32_t size; Random_bytes(rand, (uint8_t*) &size, 4); size = size % 4096; uint32_t* keys = Allocator_malloc(alloc, sizeof(uint32_t) * size); uint64_t* vals = Allocator_malloc(alloc, sizeof(uint64_t) * size); uint32_t key = 3; uint64_t val = 4; int64_t begin = Time_hrtime(); for (uint32_t i = 0; i < size; i++) { keys[i] = key; vals[i] = val; Map_OfLongsByInteger_put(&key, &val, map); key += ((val >> 13 ^ size << 19) & 0x000fffff) + 1; //Log_debug(logger, "%u", (val >> 13 ^ size << 19) & 0x000fffff); Assert_true(key > keys[i]); val += key >> 19 ^ i << 13; } int64_t timeUsed = Time_hrtime() - begin; Log_debug(logger, "cycle %d Map put %u values used %lu ms.\n", cycle, size, (unsigned long)(timeUsed / 1000000)); // check all keys there for (uint32_t i = 0; i < size; ++i) { int index = Map_OfLongsByInteger_indexForKey(&keys[i], map); Assert_true(map->values[index] == vals[i]); } Allocator_free(alloc); } Log_debug(logger, "===+++=== Completed Ok ===++++==="); Allocator_free(mainAlloc); return 0; }