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);
 

Reply via email to