This is an automated email from the ASF dual-hosted git repository. zwoop pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit d6d35100b9eb5cc71db3a1b908395062986484cf Author: Masaori Koshiba <[email protected]> AuthorDate: Fri Aug 23 15:06:03 2019 +0900 Add unit tests for MIOBuffer:write() (cherry picked from commit 6751fd0d41f083d6481a1387b89bb55f0d4c7261) --- iocore/eventsystem/unit_tests/test_IOBuffer.cc | 159 ++++++++++++++++++++++--- 1 file changed, 143 insertions(+), 16 deletions(-) diff --git a/iocore/eventsystem/unit_tests/test_IOBuffer.cc b/iocore/eventsystem/unit_tests/test_IOBuffer.cc index d3fd5d3..f380bf0 100644 --- a/iocore/eventsystem/unit_tests/test_IOBuffer.cc +++ b/iocore/eventsystem/unit_tests/test_IOBuffer.cc @@ -24,30 +24,154 @@ #define CATCH_CONFIG_MAIN #include "catch.hpp" -#include "I_EventSystem.h" #include "tscore/I_Layout.h" +#include "I_EventSystem.h" +#include "RecordsConfig.h" + #include "diags.i" #define TEST_THREADS 1 TEST_CASE("MIOBuffer", "[iocore]") { - for (unsigned i = 0; i < 100; ++i) { - MIOBuffer *b1 = new_MIOBuffer(default_small_iobuffer_size); - int64_t len1 = b1->write_avail(); - IOBufferReader *b1reader = b1->alloc_reader(); - b1->fill(len1); - CHECK(b1reader->read_avail() == len1); - - MIOBuffer *b2 = new_MIOBuffer(default_large_iobuffer_size); - int64_t len2 = b1->write_avail(); - IOBufferReader *b2reader = b2->alloc_reader(); - b2->fill(len2); - CHECK(b2reader->read_avail() == len2); - - free_MIOBuffer(b2); - free_MIOBuffer(b1); + // These value could be tweaked by `ink_event_system_init()` using `proxy.config.io.max_buffer_size` + REQUIRE(default_small_iobuffer_size == DEFAULT_SMALL_BUFFER_SIZE); + REQUIRE(default_large_iobuffer_size == DEFAULT_LARGE_BUFFER_SIZE); + + REQUIRE(BUFFER_SIZE_FOR_INDEX(default_small_iobuffer_size) == 512); + REQUIRE(BUFFER_SIZE_FOR_INDEX(default_large_iobuffer_size) == 4096); + + SECTION("new_MIOBuffer 100 times") + { + int64_t read_avail_len1 = 0; + int64_t read_avail_len2 = 0; + + for (unsigned i = 0; i < 100; ++i) { + MIOBuffer *b1 = new_MIOBuffer(default_small_iobuffer_size); + int64_t len1 = b1->write_avail(); + IOBufferReader *b1reader = b1->alloc_reader(); + b1->fill(len1); + read_avail_len1 += b1reader->read_avail(); + + MIOBuffer *b2 = new_MIOBuffer(default_large_iobuffer_size); + int64_t len2 = b2->write_avail(); + IOBufferReader *b2reader = b2->alloc_reader(); + b2->fill(len2); + read_avail_len2 += b2reader->read_avail(); + + free_MIOBuffer(b2); + free_MIOBuffer(b1); + } + + CHECK(read_avail_len1 == 100 * BUFFER_SIZE_FOR_INDEX(default_small_iobuffer_size)); + CHECK(read_avail_len2 == 100 * BUFFER_SIZE_FOR_INDEX(default_large_iobuffer_size)); + } + + SECTION("write") + { + MIOBuffer *miob = new_MIOBuffer(); + IOBufferReader *miob_r = miob->alloc_reader(); + const IOBufferBlock *block = miob->first_write_block(); + + SECTION("initial state") + { + CHECK(miob->size_index == default_large_iobuffer_size); + CHECK(miob->water_mark == 0); + CHECK(miob->first_write_block() != nullptr); + CHECK(miob->block_size() == 4096); + CHECK(miob->block_write_avail() == 4096); + CHECK(miob->current_write_avail() == 4096); + CHECK(miob->write_avail() == 4096); + + CHECK(miob->max_read_avail() == 0); + CHECK(miob_r->read_avail() == 0); + } + + SECTION("write(const void *rbuf, int64_t nbytes)") + { + SECTION("1K") + { + uint8_t buf[1024]; + memset(buf, 0xAA, sizeof(buf)); + + int64_t written = miob->write(buf, sizeof(buf)); + + REQUIRE(written == sizeof(buf)); + + CHECK(miob->block_size() == 4096); + CHECK(miob->block_write_avail() == 3072); + CHECK(miob->current_write_avail() == 3072); + CHECK(miob->write_avail() == 3072); + + CHECK(miob->first_write_block() == block); + + CHECK(miob->max_read_avail() == sizeof(buf)); + CHECK(miob_r->read_avail() == sizeof(buf)); + } + + SECTION("4K") + { + uint8_t buf[4096]; + memset(buf, 0xAA, sizeof(buf)); + + int64_t written = miob->write(buf, sizeof(buf)); + + REQUIRE(written == sizeof(buf)); + + CHECK(miob->block_size() == 4096); + CHECK(miob->block_write_avail() == 0); + CHECK(miob->current_write_avail() == 0); + CHECK(miob->write_avail() == 0); + + CHECK(miob->first_write_block() == block); + + CHECK(miob->max_read_avail() == sizeof(buf)); + CHECK(miob_r->read_avail() == sizeof(buf)); + } + + SECTION("5K") + { + uint8_t buf[5120]; + memset(buf, 0xAA, sizeof(buf)); + + int64_t written = miob->write(buf, sizeof(buf)); + + REQUIRE(written == sizeof(buf)); + + CHECK(miob->block_size() == 4096); + CHECK(miob->block_write_avail() == 3072); + CHECK(miob->current_write_avail() == 3072); + CHECK(miob->write_avail() == 3072); + + CHECK(miob->first_write_block() != block); + + CHECK(miob->max_read_avail() == sizeof(buf)); + CHECK(miob_r->read_avail() == sizeof(buf)); + } + + SECTION("8K") + { + uint8_t buf[8192]; + memset(buf, 0xAA, sizeof(buf)); + + int64_t written = miob->write(buf, sizeof(buf)); + + REQUIRE(written == sizeof(buf)); + + CHECK(miob->block_size() == 4096); + CHECK(miob->block_write_avail() == 0); + CHECK(miob->current_write_avail() == 0); + CHECK(miob->write_avail() == 0); + + CHECK(miob->first_write_block() != block); + + CHECK(miob->max_read_avail() == sizeof(buf)); + CHECK(miob_r->read_avail() == sizeof(buf)); + } + } + + free_MIOBuffer(miob); } } @@ -61,6 +185,9 @@ struct EventProcessorListener : Catch::TestEventListenerBase { init_diags("", nullptr); RecProcessInit(RECM_STAND_ALONE); + // Initialize LibRecordsConfig for `proxy.config.io.max_buffer_size` (32K) + LibRecordsConfigInit(); + ink_event_system_init(EVENT_SYSTEM_MODULE_PUBLIC_VERSION); eventProcessor.start(TEST_THREADS);
