From 4c952ad9277c8bc98e857fec73888e17c59b4d2a Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Tue, 9 Jul 2013 12:32:47 +0200 Subject: [PATCH] added unit tests --- UnitTests/Philadelphia/files-test.cpp | 45 +++++++++++++ UnitTests/Philadelphia/string-buffer-test.cpp | 66 +++++++++++++++++++ lib/BasicsC/files.c | 50 ++++++++++---- lib/BasicsC/string-buffer.c | 2 +- 4 files changed, 148 insertions(+), 15 deletions(-) diff --git a/UnitTests/Philadelphia/files-test.cpp b/UnitTests/Philadelphia/files-test.cpp index 57aa88e994..5708b202db 100644 --- a/UnitTests/Philadelphia/files-test.cpp +++ b/UnitTests/Philadelphia/files-test.cpp @@ -29,6 +29,7 @@ #include "Basics/StringBuffer.h" #include "BasicsC/files.h" +#include "BasicsC/json.h" using namespace triagens::basics; @@ -183,6 +184,50 @@ BOOST_AUTO_TEST_CASE (tst_absolute_paths) { TRI_Free(TRI_UNKNOWN_MEM_ZONE, path); } +//////////////////////////////////////////////////////////////////////////////// +/// @brief test slurp file +//////////////////////////////////////////////////////////////////////////////// + +BOOST_AUTO_TEST_CASE (tst_slurp) { + size_t length; + char* path; + char* filename; + char* result; + + path = TRI_GetTempPath(); + filename = TRI_Concatenate2File(path, "files-unittest.tmp"); + + // remove file if it exists + TRI_UnlinkFile(filename); + + // non-existing file + result = TRI_SlurpFile(TRI_CORE_MEM_ZONE, filename, &length); + BOOST_CHECK_EQUAL((char*) 0, result); + + TRI_json_t* json = TRI_JsonString(TRI_CORE_MEM_ZONE, "{ \"this\" : true, \"is\" : [ \"a\", \"test\" ] }"); + bool ok = TRI_SaveJson(filename, json, false); + BOOST_CHECK_EQUAL(true, ok); + + // file exists now + result = TRI_SlurpFile(TRI_CORE_MEM_ZONE, filename, &length); + + BOOST_CHECK_EQUAL(0, strcmp("{\"this\":true,\"is\":[\"a\",\"test\"]}\n", result)); + BOOST_CHECK_EQUAL(length, strlen("{\"this\":true,\"is\":[\"a\",\"test\"]}\n")); + TRI_Free(TRI_CORE_MEM_ZONE, result); + + // test without length + length = 42; + result = TRI_SlurpFile(TRI_CORE_MEM_ZONE, filename, 0); + + BOOST_CHECK_EQUAL(0, strcmp("{\"this\":true,\"is\":[\"a\",\"test\"]}\n", result)); + BOOST_CHECK_EQUAL(42, length); + TRI_Free(TRI_CORE_MEM_ZONE, result); + + TRI_FreeJson(TRI_CORE_MEM_ZONE, json); + TRI_Free(TRI_CORE_MEM_ZONE, filename); + TRI_Free(TRI_CORE_MEM_ZONE, path); +} + //////////////////////////////////////////////////////////////////////////////// /// @brief generate tests //////////////////////////////////////////////////////////////////////////////// diff --git a/UnitTests/Philadelphia/string-buffer-test.cpp b/UnitTests/Philadelphia/string-buffer-test.cpp index 57cdd285df..3e229cb2a9 100644 --- a/UnitTests/Philadelphia/string-buffer-test.cpp +++ b/UnitTests/Philadelphia/string-buffer-test.cpp @@ -468,6 +468,72 @@ BOOST_AUTO_TEST_CASE (tst_length) { TRI_DestroyStringBuffer(&sb); } +//////////////////////////////////////////////////////////////////////////////// +/// @brief tst_last_char +//////////////////////////////////////////////////////////////////////////////// + +BOOST_AUTO_TEST_CASE (tst_last_char) { + TRI_string_buffer_t sb; + + TRI_InitStringBuffer(&sb, TRI_CORE_MEM_ZONE); + + BOOST_CHECK_EQUAL('\0', TRI_LastCharStringBuffer(&sb)); + + TRI_AppendStringStringBuffer(&sb, "f"); + BOOST_CHECK_EQUAL('f', TRI_LastCharStringBuffer(&sb)); + + TRI_AppendCharStringBuffer(&sb, '1'); + BOOST_CHECK_EQUAL('1', TRI_LastCharStringBuffer(&sb)); + + TRI_AppendCharStringBuffer(&sb, '\n'); + BOOST_CHECK_EQUAL('\n', TRI_LastCharStringBuffer(&sb)); + + TRI_ClearStringBuffer(&sb); + BOOST_CHECK_EQUAL('\0', TRI_LastCharStringBuffer(&sb)); + + for (size_t i = 0; i < 100; ++i) { + TRI_AppendStringStringBuffer(&sb, "the quick brown fox jumped over the lazy dog"); + BOOST_CHECK_EQUAL('g', TRI_LastCharStringBuffer(&sb)); + } + TRI_AppendCharStringBuffer(&sb, '.'); + BOOST_CHECK_EQUAL('.', TRI_LastCharStringBuffer(&sb)); + + TRI_AnnihilateStringBuffer(&sb); + BOOST_CHECK_EQUAL('\0', TRI_LastCharStringBuffer(&sb)); + + TRI_DestroyStringBuffer(&sb); +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief tst_reserve +//////////////////////////////////////////////////////////////////////////////// + +BOOST_AUTO_TEST_CASE (tst_reserve) { + TRI_string_buffer_t sb; + + TRI_InitStringBuffer(&sb, TRI_CORE_MEM_ZONE); + BOOST_CHECK_EQUAL(0, TRI_LengthStringBuffer(&sb)); + + TRI_ReserveStringBuffer(&sb, 0); + BOOST_CHECK_EQUAL(0, TRI_LengthStringBuffer(&sb)); + + TRI_ReserveStringBuffer(&sb, 1000); + BOOST_CHECK_EQUAL(0, TRI_LengthStringBuffer(&sb)); + + TRI_AppendStringStringBuffer(&sb, "f"); + BOOST_CHECK_EQUAL(1, TRI_LengthStringBuffer(&sb)); + + for (size_t i = 0; i < 5000; ++i) { + TRI_AppendCharStringBuffer(&sb, '.'); + } + BOOST_CHECK_EQUAL(5001, TRI_LengthStringBuffer(&sb)); + + TRI_ReserveStringBuffer(&sb, 1000); + BOOST_CHECK_EQUAL(5001, TRI_LengthStringBuffer(&sb)); + + TRI_DestroyStringBuffer(&sb); +} + //////////////////////////////////////////////////////////////////////////////// /// @brief tst_timing //////////////////////////////////////////////////////////////////////////////// diff --git a/lib/BasicsC/files.c b/lib/BasicsC/files.c index 48695e5d36..7df66f58c5 100644 --- a/lib/BasicsC/files.c +++ b/lib/BasicsC/files.c @@ -52,6 +52,25 @@ #include #endif +// ----------------------------------------------------------------------------- +// --SECTION-- private defines +// ----------------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////////////////////// +/// @addtogroup Files +/// @{ +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +/// @brief read buffer size (used for bulk file reading) +//////////////////////////////////////////////////////////////////////////////// + +#define READBUFFER_SIZE 8192 + +//////////////////////////////////////////////////////////////////////////////// +/// @} +//////////////////////////////////////////////////////////////////////////////// + // ----------------------------------------------------------------------------- // --SECTION-- private variables // ----------------------------------------------------------------------------- @@ -845,11 +864,11 @@ bool TRI_fsync (int fd) { /// @brief slurps in a file //////////////////////////////////////////////////////////////////////////////// -char* TRI_SlurpFile (TRI_memory_zone_t* zone, char const* filename, size_t* length) { +char* TRI_SlurpFile (TRI_memory_zone_t* zone, + char const* filename, + size_t* length) { TRI_string_buffer_t result; - char buffer[10240]; int fd; - int res; fd = TRI_OPEN(filename, O_RDONLY); @@ -861,9 +880,20 @@ char* TRI_SlurpFile (TRI_memory_zone_t* zone, char const* filename, size_t* leng TRI_InitStringBuffer(&result, zone); while (true) { + int res; ssize_t n; - n = TRI_READ(fd, buffer, sizeof(buffer)); + res = TRI_ReserveStringBuffer(&result, READBUFFER_SIZE); + + if (res != TRI_ERROR_NO_ERROR) { + TRI_CLOSE(fd); + TRI_AnnihilateStringBuffer(&result); + + TRI_set_errno(TRI_ERROR_SYS_ERROR); + return NULL; + } + + n = TRI_READ(fd, (void*) TRI_EndStringBuffer(&result), READBUFFER_SIZE); if (n == 0) { break; @@ -877,16 +907,8 @@ char* TRI_SlurpFile (TRI_memory_zone_t* zone, char const* filename, size_t* leng TRI_set_errno(TRI_ERROR_SYS_ERROR); return NULL; } - - res = TRI_AppendString2StringBuffer(&result, buffer, n); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_CLOSE(fd); - - TRI_AnnihilateStringBuffer(&result); - - return NULL; - } + + TRI_IncreaseLengthStringBuffer(&result, (size_t) n); } if (length != NULL) { diff --git a/lib/BasicsC/string-buffer.c b/lib/BasicsC/string-buffer.c index fe395f9b44..dcd476d4e0 100644 --- a/lib/BasicsC/string-buffer.c +++ b/lib/BasicsC/string-buffer.c @@ -206,10 +206,10 @@ void TRI_DestroyStringBuffer (TRI_string_buffer_t * self) { void TRI_AnnihilateStringBuffer (TRI_string_buffer_t * self) { if (self->_buffer != NULL) { - // somewhat paranoid? don't ask me memset(self->_buffer, 0, self->_len); TRI_Free(self->_memoryZone, self->_buffer); + self->_buffer = NULL; } }