blob.cpp

来自「About: hamsterdb is a database engine w」· C++ 代码 · 共 323 行

CPP
323
字号
/** * Copyright (C) 2005-2007 Christoph Rupp (chris@crupp.de). * All rights reserved. See file LICENSE for licence and copyright * information. * * unit tests for blob.h/blob.c * */#include <stdexcept>#include <cppunit/extensions/HelperMacros.h>#include <ham/hamsterdb.h>#include "../src/db.h"#include "../src/blob.h"#include "memtracker.h"class BlobTest : public CppUnit::TestFixture{    CPPUNIT_TEST_SUITE(BlobTest);    CPPUNIT_TEST      (structureTest);    CPPUNIT_TEST      (allocReadFreeTest);    CPPUNIT_TEST      (replaceTest);    CPPUNIT_TEST      (replaceWithBigTest);    CPPUNIT_TEST      (replaceWithSmallTest);    /* negative tests are not necessary, because hamsterdb asserts that     * blob-IDs actually exist */    //CPPUNIT_TEST      (negativeReadTest);    //CPPUNIT_TEST      (negativeFreeTest);    CPPUNIT_TEST      (multipleAllocReadFreeTest);    CPPUNIT_TEST      (hugeBlobTest);    CPPUNIT_TEST      (smallBlobTest);    CPPUNIT_TEST_SUITE_END();protected:    ham_db_t *m_db;    memtracker_t *m_alloc;    ham_bool_t m_inmemory;public:    BlobTest(ham_bool_t inmemory=HAM_FALSE)    :   m_db(0), m_alloc(0), m_inmemory(inmemory)    {    }    void setUp()    { #if WIN32        (void)DeleteFileA((LPCSTR)".test");#else        (void)unlink(".test");#endif        CPPUNIT_ASSERT((m_alloc=memtracker_new())!=0);        CPPUNIT_ASSERT_EQUAL(0, ham_new(&m_db));        db_set_allocator(m_db, (mem_allocator_t *)m_alloc);        CPPUNIT_ASSERT_EQUAL(0, ham_create(m_db, ".test",                     m_inmemory ? HAM_IN_MEMORY_DB : 0, 0));    }        void tearDown()     {         ham_close(m_db);        ham_delete(m_db);        CPPUNIT_ASSERT(!memtracker_get_leaks(m_alloc));    }    void structureTest(void)    {        blob_t b;        ::memset(&b, 0, sizeof(b));        blob_set_self(&b, (ham_offset_t)0x12345ull);        CPPUNIT_ASSERT_EQUAL((ham_offset_t)0x12345ull,                         blob_get_self(&b));        blob_set_alloc_size(&b, 0x789ull);        CPPUNIT_ASSERT_EQUAL((ham_u64_t)0x789ull, blob_get_alloc_size(&b));        blob_set_real_size(&b, 0xabcull);        CPPUNIT_ASSERT_EQUAL((ham_u64_t)0xabcull, blob_get_real_size(&b));        blob_set_user_size(&b, 0x123ull);        CPPUNIT_ASSERT_EQUAL((ham_u64_t)0x123ull, blob_get_user_size(&b));        blob_set_flags(&b, 0x13);        CPPUNIT_ASSERT_EQUAL((ham_u32_t)0x13, blob_get_flags(&b));    }    void allocReadFreeTest(void)    {        ham_u8_t buffer[64];        ham_offset_t blobid;        ham_record_t record;        ::memset(&record, 0, sizeof(record));        ::memset(&buffer, 0x12, sizeof(buffer));        CPPUNIT_ASSERT_EQUAL(0, blob_allocate(m_db, buffer,                                 (ham_size_t)sizeof(buffer), 0, &blobid));        CPPUNIT_ASSERT(blobid!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer));        CPPUNIT_ASSERT(0==::memcmp(buffer, record.data, record.size));        CPPUNIT_ASSERT_EQUAL(0, blob_free(m_db, blobid, 0));    }    void replaceTest(void)    {        ham_u8_t buffer[64], buffer2[64];        ham_offset_t blobid, blobid2;        ham_record_t record;        ::memset(&record,  0, sizeof(record));        ::memset(&buffer,  0x12, sizeof(buffer));        ::memset(&buffer2, 0x15, sizeof(buffer2));        CPPUNIT_ASSERT_EQUAL(0, blob_allocate(m_db, buffer,                                 (ham_size_t)sizeof(buffer), 0, &blobid));        CPPUNIT_ASSERT(blobid!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer));        CPPUNIT_ASSERT(0==::memcmp(buffer, record.data, record.size));        CPPUNIT_ASSERT_EQUAL(0, blob_replace(m_db, blobid, buffer2,                     sizeof(buffer2), 0, &blobid2));        CPPUNIT_ASSERT(blobid2!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid2,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer2));        CPPUNIT_ASSERT(0==::memcmp(buffer2, record.data, record.size));        CPPUNIT_ASSERT_EQUAL(0, blob_free(m_db, blobid2, 0));    }    void replaceWithBigTest(void)    {        ham_u8_t buffer[64], buffer2[128];        ham_offset_t blobid, blobid2;        ham_record_t record;        ::memset(&record,  0, sizeof(record));        ::memset(&buffer,  0x12, sizeof(buffer));        ::memset(&buffer2, 0x15, sizeof(buffer2));        CPPUNIT_ASSERT_EQUAL(0, blob_allocate(m_db, buffer,                                 (ham_size_t)sizeof(buffer), 0, &blobid));        CPPUNIT_ASSERT(blobid!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer));        CPPUNIT_ASSERT(0==::memcmp(buffer, record.data, record.size));        CPPUNIT_ASSERT_EQUAL(0, blob_replace(m_db, blobid, buffer2,                     sizeof(buffer2), 0, &blobid2));        CPPUNIT_ASSERT(blobid2!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid2,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer2));        CPPUNIT_ASSERT(0==::memcmp(buffer2, record.data, record.size));        CPPUNIT_ASSERT_EQUAL(0, blob_free(m_db, blobid2, 0));    }    void replaceWithSmallTest(void)    {        ham_u8_t buffer[128], buffer2[64];        ham_offset_t blobid, blobid2;        ham_record_t record;        ::memset(&record,  0, sizeof(record));        ::memset(&buffer,  0x12, sizeof(buffer));        ::memset(&buffer2, 0x15, sizeof(buffer2));        CPPUNIT_ASSERT_EQUAL(0, blob_allocate(m_db, buffer,                                 (ham_size_t)sizeof(buffer), 0, &blobid));        CPPUNIT_ASSERT(blobid!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer));        CPPUNIT_ASSERT(0==::memcmp(buffer, record.data, record.size));        CPPUNIT_ASSERT_EQUAL(0, blob_replace(m_db, blobid, buffer2,                     sizeof(buffer2), 0, &blobid2));        CPPUNIT_ASSERT(blobid2!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid2,                                 &record, 0));        CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer2));        CPPUNIT_ASSERT(0==::memcmp(buffer2, record.data, record.size));        /* make sure that at least 64bit are in the freelist */        CPPUNIT_ASSERT(freel_alloc_area(m_db, 64)!=0);        CPPUNIT_ASSERT_EQUAL(0, blob_free(m_db, blobid2, 0));        /* and now another 64bit should be in the freelist */        CPPUNIT_ASSERT(freel_alloc_area(m_db, 64)!=0);    }    void negativeReadTest(void)    {        ham_offset_t blobid=64ull*12;        ham_record_t record;        ::memset(&record, 0, sizeof(record));        CPPUNIT_ASSERT_EQUAL(HAM_BLOB_NOT_FOUND, blob_read(m_db, blobid,                                 &record, 0));    }    void negativeFreeTest(void)    {        ham_offset_t blobid=64ull*12;        CPPUNIT_ASSERT_EQUAL(HAM_BLOB_NOT_FOUND, blob_free(m_db, blobid, 0));    }    void loopInsert(int loops, int factor)    {        ham_u8_t *buffer;        ham_offset_t blobid[loops];        ham_record_t record;        ::memset(&record, 0, sizeof(record));        ::memset(&buffer, 0x12, sizeof(buffer));        for (int i=0; i<loops; i++) {            buffer=(ham_u8_t *)::malloc((i+1)*factor);            CPPUNIT_ASSERT(buffer!=0);            ::memset(buffer, (char)i, (i+1)*factor);            CPPUNIT_ASSERT_EQUAL(0, blob_allocate(m_db, buffer,                                 (ham_size_t)((i+1)*factor), 0, &blobid[i]));            CPPUNIT_ASSERT(blobid[i]!=0);            ::free(buffer);        }        for (int i=0; i<loops; i++) {            buffer=(ham_u8_t *)::malloc((i+1)*factor);            CPPUNIT_ASSERT(buffer!=0);            ::memset(buffer, (char)i, (i+1)*factor);            CPPUNIT_ASSERT_EQUAL(0, blob_read(m_db, blobid[i],                                 &record, 0));            CPPUNIT_ASSERT_EQUAL(record.size, (ham_size_t)(i+1)*factor);            CPPUNIT_ASSERT(0==::memcmp(buffer, record.data, record.size));            ::free(buffer);        }        for (int i=0; i<loops; i++) {            CPPUNIT_ASSERT_EQUAL(0, blob_free(m_db, blobid[i], 0));        }    }    void multipleAllocReadFreeTest(void)    {        loopInsert(20, 2048);    }    void hugeBlobTest(void)    {        loopInsert(10, 1024*1024*4);    }    void smallBlobTest(void)    {        loopInsert(20, 64);    }};class FileBlobTest : public BlobTest{    CPPUNIT_TEST_SUITE(FileBlobTest);    CPPUNIT_TEST      (structureTest);    CPPUNIT_TEST      (allocReadFreeTest);    CPPUNIT_TEST      (replaceTest);    CPPUNIT_TEST      (replaceWithBigTest);    CPPUNIT_TEST      (replaceWithSmallTest);    /* negative tests are not necessary, because hamsterdb asserts that     * blob-IDs actually exist */    //CPPUNIT_TEST      (negativeReadTest);    //CPPUNIT_TEST      (negativeFreeTest);    CPPUNIT_TEST      (multipleAllocReadFreeTest);    CPPUNIT_TEST      (hugeBlobTest);    CPPUNIT_TEST      (smallBlobTest);    CPPUNIT_TEST_SUITE_END();public:    FileBlobTest()    : BlobTest(HAM_FALSE)    {    }};class InMemoryBlobTest : public BlobTest{    CPPUNIT_TEST_SUITE(InMemoryBlobTest);    CPPUNIT_TEST      (structureTest);    CPPUNIT_TEST      (allocReadFreeTest);    CPPUNIT_TEST      (replaceTest);    CPPUNIT_TEST      (replaceWithBigTest);    CPPUNIT_TEST      (replaceWithSmallTest);    CPPUNIT_TEST      (multipleAllocReadFreeTest);    CPPUNIT_TEST      (hugeBlobTest);    CPPUNIT_TEST      (smallBlobTest);    CPPUNIT_TEST_SUITE_END();public:    InMemoryBlobTest()    : BlobTest(HAM_FALSE)    {    }};CPPUNIT_TEST_SUITE_REGISTRATION(FileBlobTest);CPPUNIT_TEST_SUITE_REGISTRATION(InMemoryBlobTest);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?