This is an automated email from the ASF dual-hosted git repository.

masaori pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new ed16edfa2d Convert CacheVol regression tests into unit tests (#10649)
ed16edfa2d is described below

commit ed16edfa2d50e2cbd75b8455b9d4ba48ff7d1e01
Author: Masaori Koshiba <masa...@apache.org>
AuthorDate: Tue Oct 24 08:59:15 2023 +0900

    Convert CacheVol regression tests into unit tests (#10649)
---
 src/iocore/cache/CacheHosting.cc             | 330 ----------------------
 src/iocore/cache/Makefile.am                 |   8 +
 src/iocore/cache/unit_tests/storage.config   |   2 +-
 src/iocore/cache/unit_tests/test_CacheVol.cc | 396 +++++++++++++++++++++++++++
 src/tests/CMakeLists.txt                     |   1 +
 5 files changed, 406 insertions(+), 331 deletions(-)

diff --git a/src/iocore/cache/CacheHosting.cc b/src/iocore/cache/CacheHosting.cc
index ac28fcd1d5..e2c0ccbf79 100644
--- a/src/iocore/cache/CacheHosting.cc
+++ b/src/iocore/cache/CacheHosting.cc
@@ -27,11 +27,8 @@
 #include "tscore/Layout.h"
 #include "tscore/HostLookup.h"
 #include "tscore/Tokenizer.h"
-#include "tscore/Regression.h"
 #include "tscore/Filenames.h"
 
-extern int gndisks;
-
 namespace
 {
 
@@ -797,330 +794,3 @@ ConfigVolumes::BuildListFromString(char 
*config_file_path, char *file_buf)
 
   return;
 }
-
-/* Test the cache volume with different configurations */
-#define MEGS_128              (128 * 1024 * 1024)
-#define ROUND_TO_VOL_SIZE(_x) (((_x) + (MEGS_128 - 1)) & ~(MEGS_128 - 1))
-extern CacheDisk **gdisks;
-extern Queue<CacheVol> cp_list;
-extern int cp_list_len;
-extern ConfigVolumes config_volumes;
-
-extern void cplist_init();
-extern int cplist_reconfigure();
-static int configs = 4;
-
-Queue<CacheVol> saved_cp_list;
-int saved_cp_list_len;
-ConfigVolumes saved_config_volumes;
-int saved_gnvol;
-
-static int ClearConfigVol(ConfigVolumes *configp);
-static int ClearCacheVolList(Queue<CacheVol> *cpl, int len);
-static int create_config(RegressionTest *t, int i);
-static int execute_and_verify(RegressionTest *t);
-static void save_state();
-static void restore_state();
-
-EXCLUSIVE_REGRESSION_TEST(Cache_vol)(RegressionTest *t, int /* atype 
ATS_UNUSED */, int *status)
-{
-  save_state();
-  srand48(time(nullptr));
-  *status = REGRESSION_TEST_PASSED;
-  for (int i = 0; i < configs; i++) {
-    if (create_config(t, i)) {
-      if (execute_and_verify(t) == REGRESSION_TEST_FAILED) {
-        *status = REGRESSION_TEST_FAILED;
-      }
-    }
-  }
-  restore_state();
-  return;
-}
-
-int
-create_config(RegressionTest *t, int num)
-{
-  int i       = 0;
-  int vol_num = 1;
-  // clear all old configurations before adding new test cases
-  config_volumes.clear_all();
-  switch (num) {
-  case 0:
-    for (i = 0; i < gndisks; i++) {
-      CacheDisk *d = gdisks[i];
-      int blocks   = d->num_usable_blocks;
-      if (blocks < STORE_BLOCKS_PER_VOL) {
-        rprintf(t, "Cannot run Cache_vol regression: not enough disk space\n");
-        return 0;
-      }
-      /* create 128 MB volumes */
-      for (; blocks >= STORE_BLOCKS_PER_VOL; blocks -= STORE_BLOCKS_PER_VOL) {
-        if (vol_num > 255) {
-          break;
-        }
-        ConfigVol *cp  = new ConfigVol();
-        cp->number     = vol_num++;
-        cp->scheme     = CACHE_HTTP_TYPE;
-        cp->size       = 128;
-        cp->in_percent = false;
-        cp->cachep     = nullptr;
-        config_volumes.cp_queue.enqueue(cp);
-        config_volumes.num_volumes++;
-        config_volumes.num_http_volumes++;
-      }
-    }
-    rprintf(t, "%d 128 Megabyte Volumes\n", vol_num - 1);
-    break;
-
-  case 1: {
-    for (i = 0; i < gndisks; i++) {
-      gdisks[i]->delete_all_volumes();
-    }
-
-    // calculate the total free space
-    off_t total_space = 0;
-    for (i = 0; i < gndisks; i++) {
-      off_t vol_blocks = gdisks[i]->num_usable_blocks;
-      /* round down the blocks to the nearest
-         multiple of STORE_BLOCKS_PER_VOL */
-      vol_blocks   = (vol_blocks / STORE_BLOCKS_PER_VOL) * 
STORE_BLOCKS_PER_VOL;
-      total_space += vol_blocks;
-    }
-
-    // make sure we have at least 1280 M bytes
-    if (total_space < ((10 << 27) >> STORE_BLOCK_SHIFT)) {
-      rprintf(t, "Not enough space for 10 volume\n");
-      return 0;
-    }
-
-    vol_num = 1;
-    rprintf(t, "Cleared  disk\n");
-    for (i = 0; i < 10; i++) {
-      ConfigVol *cp  = new ConfigVol();
-      cp->number     = vol_num++;
-      cp->scheme     = CACHE_HTTP_TYPE;
-      cp->size       = 10;
-      cp->percent    = 10;
-      cp->in_percent = true;
-      cp->cachep     = nullptr;
-      config_volumes.cp_queue.enqueue(cp);
-      config_volumes.num_volumes++;
-      config_volumes.num_http_volumes++;
-    }
-    rprintf(t, "10 volume, 10 percent each\n");
-  } break;
-
-  case 2:
-  case 3:
-
-  {
-    /* calculate the total disk space */
-    InkRand *gen      = &this_ethread()->generator;
-    off_t total_space = 0;
-    vol_num           = 1;
-    if (num == 2) {
-      rprintf(t, "Random Volumes after clearing the disks\n");
-    } else {
-      rprintf(t, "Random Volumes without clearing the disks\n");
-    }
-
-    for (i = 0; i < gndisks; i++) {
-      off_t vol_blocks = gdisks[i]->num_usable_blocks;
-      /* round down the blocks to the nearest
-         multiple of STORE_BLOCKS_PER_VOL */
-      vol_blocks   = (vol_blocks / STORE_BLOCKS_PER_VOL) * 
STORE_BLOCKS_PER_VOL;
-      total_space += vol_blocks;
-
-      if (num == 2) {
-        gdisks[i]->delete_all_volumes();
-      } else {
-        gdisks[i]->cleared = 0;
-      }
-    }
-    while (total_space > 0) {
-      if (vol_num > 255) {
-        break;
-      }
-      off_t modu = MAX_VOL_SIZE;
-      if (total_space < (MAX_VOL_SIZE >> STORE_BLOCK_SHIFT)) {
-        modu = total_space * STORE_BLOCK_SIZE;
-      }
-
-      off_t random_size = (gen->random() % modu) + 1;
-      /* convert to 128 megs multiple */
-      CacheType scheme = (random_size % 2) ? CACHE_HTTP_TYPE : CACHE_RTSP_TYPE;
-      random_size      = ROUND_TO_VOL_SIZE(random_size);
-      off_t blocks     = random_size / STORE_BLOCK_SIZE;
-      ink_assert(blocks <= (int)total_space);
-      total_space -= blocks;
-
-      ConfigVol *cp = new ConfigVol();
-
-      cp->number     = vol_num++;
-      cp->scheme     = scheme;
-      cp->size       = random_size >> 20;
-      cp->percent    = 0;
-      cp->in_percent = false;
-      cp->cachep     = nullptr;
-      config_volumes.cp_queue.enqueue(cp);
-      config_volumes.num_volumes++;
-      if (cp->scheme == CACHE_HTTP_TYPE) {
-        config_volumes.num_http_volumes++;
-        rprintf(t, "volume=%d scheme=http size=%d\n", cp->number, cp->size);
-      } else {
-        // ToDo: Assert ?
-      }
-    }
-  } break;
-
-  default:
-    return 1;
-  }
-  return 1;
-}
-
-int
-execute_and_verify(RegressionTest *t)
-{
-  cplist_init();
-  cplist_reconfigure();
-
-  /* compare the volumes */
-  if (cp_list_len != config_volumes.num_volumes) {
-    return REGRESSION_TEST_FAILED;
-  }
-
-  /* check that the volumes and sizes
-     match the configuration */
-  int matched   = 0;
-  ConfigVol *cp = config_volumes.cp_queue.head;
-  CacheVol *cachep;
-
-  for (int i = 0; i < config_volumes.num_volumes; i++) {
-    cachep = cp_list.head;
-    while (cachep) {
-      if (cachep->vol_number == cp->number) {
-        if ((cachep->scheme != cp->scheme) || (cachep->size != (cp->size << 
(20 - STORE_BLOCK_SHIFT))) || (cachep != cp->cachep)) {
-          rprintf(t, "Configuration and Actual volumes don't match\n");
-          return REGRESSION_TEST_FAILED;
-        }
-
-        /* check that the number of volumes match the ones
-           on disk */
-        int d_no;
-        int m_vols = 0;
-        for (d_no = 0; d_no < gndisks; d_no++) {
-          if (cachep->disk_vols[d_no]) {
-            DiskVol *dp = cachep->disk_vols[d_no];
-            if (dp->vol_number != cachep->vol_number) {
-              rprintf(t, "DiskVols and CacheVols don't match\n");
-              return REGRESSION_TEST_FAILED;
-            }
-
-            /* check the diskvolblock queue */
-            DiskVolBlockQueue *dpbq = dp->dpb_queue.head;
-            while (dpbq) {
-              if (dpbq->b->number != cachep->vol_number) {
-                rprintf(t, "DiskVol and DiskVolBlocks don't match\n");
-                return REGRESSION_TEST_FAILED;
-              }
-              dpbq = dpbq->link.next;
-            }
-
-            m_vols += dp->num_volblocks;
-          }
-        }
-        if (m_vols != cachep->num_vols) {
-          rprintf(t, "Num volumes in CacheVol and DiskVol don't match\n");
-          return REGRESSION_TEST_FAILED;
-        }
-        matched++;
-        break;
-      }
-      cachep = cachep->link.next;
-    }
-  }
-
-  if (matched != config_volumes.num_volumes) {
-    rprintf(t, "Num of Volumes created and configured don't match\n");
-    return REGRESSION_TEST_FAILED;
-  }
-
-  ClearConfigVol(&config_volumes);
-
-  ClearCacheVolList(&cp_list, cp_list_len);
-
-  for (int i = 0; i < gndisks; i++) {
-    CacheDisk *d = gdisks[i];
-    if (dbg_ctl_cache_hosting.on()) {
-      Dbg(dbg_ctl_cache_hosting, "Disk: %d: Vol Blocks: %u: Free space: %" 
PRIu64, i, d->header->num_diskvol_blks, d->free_space);
-      for (int j = 0; j < static_cast<int>(d->header->num_volumes); j++) {
-        Dbg(dbg_ctl_cache_hosting, "\tVol: %d Size: %" PRIu64, 
d->disk_vols[j]->vol_number, d->disk_vols[j]->size);
-      }
-      for (int j = 0; j < static_cast<int>(d->header->num_diskvol_blks); j++) {
-        Dbg(dbg_ctl_cache_hosting, "\tBlock No: %d Size: %" PRIu64 " Free: 
%u", d->header->vol_info[j].number,
-            d->header->vol_info[j].len, d->header->vol_info[j].free);
-      }
-    }
-  }
-  return REGRESSION_TEST_PASSED;
-}
-
-int
-ClearConfigVol(ConfigVolumes *configp)
-{
-  int i         = 0;
-  ConfigVol *cp = nullptr;
-  while ((cp = configp->cp_queue.dequeue())) {
-    delete cp;
-    i++;
-  }
-  if (i != configp->num_volumes) {
-    Warning("failed");
-    return 0;
-  }
-  configp->num_volumes      = 0;
-  configp->num_http_volumes = 0;
-  return 1;
-}
-
-int
-ClearCacheVolList(Queue<CacheVol> *cpl, int len)
-{
-  int i        = 0;
-  CacheVol *cp = nullptr;
-  while ((cp = cpl->dequeue())) {
-    ats_free(cp->disk_vols);
-    ats_free(cp->vols);
-    delete (cp);
-    i++;
-  }
-
-  if (i != len) {
-    Warning("Failed");
-    return 0;
-  }
-  return 1;
-}
-
-void
-save_state()
-{
-  saved_cp_list     = cp_list;
-  saved_cp_list_len = cp_list_len;
-  memcpy(&saved_config_volumes, &config_volumes, sizeof(ConfigVolumes));
-  saved_gnvol = gnvol;
-  memset(static_cast<void *>(&cp_list), 0, sizeof(Queue<CacheVol>));
-  memset(static_cast<void *>(&config_volumes), 0, sizeof(ConfigVolumes));
-  gnvol = 0;
-}
-
-void
-restore_state()
-{
-  cp_list     = saved_cp_list;
-  cp_list_len = saved_cp_list_len;
-  memcpy(&config_volumes, &saved_config_volumes, sizeof(ConfigVolumes));
-  gnvol = saved_gnvol;
-}
diff --git a/src/iocore/cache/Makefile.am b/src/iocore/cache/Makefile.am
index ac8190f883..9085de7949 100644
--- a/src/iocore/cache/Makefile.am
+++ b/src/iocore/cache/Makefile.am
@@ -132,6 +132,7 @@ endif
 check_PROGRAMS = \
   test_Cache \
   test_CacheDir \
+  test_CacheVol \
   test_RWW \
   test_Alternate_L_to_S \
   test_Alternate_S_to_L \
@@ -319,6 +320,13 @@ test_CacheDir_SOURCES = \
   $(test_main_SOURCES) \
   ./test/test_CacheDir.cc
 
+test_CacheVol_CPPFLAGS = $(test_CPPFLAGS)
+test_CacheVol_LDFLAGS = @AM_LDFLAGS@
+test_CacheVol_LDADD = $(test_LDADD)
+test_CacheVol_SOURCES = \
+  $(test_main_SOURCES) \
+  ./test/test_CacheVol.cc
+
 test_RWW_CPPFLAGS = $(test_CPPFLAGS)
 test_RWW_LDFLAGS = @AM_LDFLAGS@
 test_RWW_LDADD = $(test_LDADD)
diff --git a/src/iocore/cache/unit_tests/storage.config 
b/src/iocore/cache/unit_tests/storage.config
index e3c34e9153..c10a663b1d 100644
--- a/src/iocore/cache/unit_tests/storage.config
+++ b/src/iocore/cache/unit_tests/storage.config
@@ -1,2 +1,2 @@
-var/trafficserver 32M
+var/trafficserver 256M
 var/trafficserver2 32M
diff --git a/src/iocore/cache/unit_tests/test_CacheVol.cc 
b/src/iocore/cache/unit_tests/test_CacheVol.cc
new file mode 100644
index 0000000000..b85cdd081f
--- /dev/null
+++ b/src/iocore/cache/unit_tests/test_CacheVol.cc
@@ -0,0 +1,396 @@
+/** @file
+
+  A brief file description
+
+  @section license License
+
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ */
+
+#include "main.h"
+
+#include "P_Cache.h"
+#include "P_CacheHosting.h"
+
+#include "tscore/Diags.h"
+#include "tscpp/util/PostScript.h"
+
+// Required by main.h
+int cache_vols            = 1;
+bool reuse_existing_cache = false;
+
+extern int gndisks;
+extern CacheDisk **gdisks;
+extern Queue<CacheVol> cp_list;
+extern int cp_list_len;
+extern ConfigVolumes config_volumes;
+
+extern void cplist_init();
+extern int cplist_reconfigure();
+
+namespace
+{
+
+DbgCtl dbg_ctl_cache_hosting{"cache_hosting"};
+DbgCtl dbg_ctl_matcher{"matcher"};
+DbgCtl dbg_ctl_cache_vol_test{"cache_vol_test"};
+
+/* Test the cache volume with different configurations */
+#define MEGS_128              (128 * 1024 * 1024)
+#define ROUND_TO_VOL_SIZE(_x) (((_x) + (MEGS_128 - 1)) & ~(MEGS_128 - 1))
+static int configs = 4;
+
+Queue<CacheVol> saved_cp_list;
+int saved_cp_list_len;
+ConfigVolumes saved_config_volumes;
+int saved_gnvol;
+
+int ClearConfigVol(ConfigVolumes *configp);
+int ClearCacheVolList(Queue<CacheVol> *cpl, int len);
+int create_config(int i);
+void execute_and_verify();
+void save_state();
+void restore_state();
+
+int
+create_config(int num)
+{
+  int i       = 0;
+  int vol_num = 1;
+  // clear all old configurations before adding new test cases
+  config_volumes.clear_all();
+  switch (num) {
+  case 0:
+    for (i = 0; i < gndisks; i++) {
+      CacheDisk *d = gdisks[i];
+      int blocks   = d->num_usable_blocks;
+      if (blocks < STORE_BLOCKS_PER_VOL) {
+        Warning("Cannot run Cache_vol regression: not enough disk space");
+        return 0;
+      }
+      /* create 128 MB volumes */
+      for (; blocks >= STORE_BLOCKS_PER_VOL; blocks -= STORE_BLOCKS_PER_VOL) {
+        if (vol_num > 255) {
+          break;
+        }
+        ConfigVol *cp  = new ConfigVol();
+        cp->number     = vol_num++;
+        cp->scheme     = CACHE_HTTP_TYPE;
+        cp->size       = 128;
+        cp->in_percent = false;
+        cp->cachep     = nullptr;
+        config_volumes.cp_queue.enqueue(cp);
+        config_volumes.num_volumes++;
+        config_volumes.num_http_volumes++;
+      }
+    }
+    Dbg(dbg_ctl_cache_vol_test, "%d 128 Megabyte Volumes", vol_num - 1);
+    break;
+
+  case 1: {
+    for (i = 0; i < gndisks; i++) {
+      gdisks[i]->delete_all_volumes();
+    }
+
+    // calculate the total free space
+    off_t total_space = 0;
+    for (i = 0; i < gndisks; i++) {
+      off_t vol_blocks = gdisks[i]->num_usable_blocks;
+      /* round down the blocks to the nearest
+         multiple of STORE_BLOCKS_PER_VOL */
+      vol_blocks   = (vol_blocks / STORE_BLOCKS_PER_VOL) * 
STORE_BLOCKS_PER_VOL;
+      total_space += vol_blocks;
+    }
+
+    // make sure we have at least 1280 M bytes
+    if (total_space < ((10 << 27) >> STORE_BLOCK_SHIFT)) {
+      // Skip this test case due to small space
+      Warning("Not enough space for 10 volume");
+      return 0;
+    }
+
+    vol_num = 1;
+    Dbg(dbg_ctl_cache_vol_test, "Cleared  disk");
+    for (i = 0; i < 10; i++) {
+      ConfigVol *cp  = new ConfigVol();
+      cp->number     = vol_num++;
+      cp->scheme     = CACHE_HTTP_TYPE;
+      cp->size       = 10;
+      cp->percent    = 10;
+      cp->in_percent = true;
+      cp->cachep     = nullptr;
+      config_volumes.cp_queue.enqueue(cp);
+      config_volumes.num_volumes++;
+      config_volumes.num_http_volumes++;
+    }
+    Dbg(dbg_ctl_cache_vol_test, "10 volume, 10 percent each");
+  } break;
+
+  case 2:
+  case 3:
+
+  {
+    /* calculate the total disk space */
+    InkRand *gen      = &this_ethread()->generator;
+    off_t total_space = 0;
+    vol_num           = 1;
+    if (num == 2) {
+      Dbg(dbg_ctl_cache_vol_test, "Random Volumes after clearing the disks");
+    } else {
+      Dbg(dbg_ctl_cache_vol_test, "Random Volumes without clearing the disks");
+    }
+
+    for (i = 0; i < gndisks; i++) {
+      off_t vol_blocks = gdisks[i]->num_usable_blocks;
+      /* round down the blocks to the nearest
+         multiple of STORE_BLOCKS_PER_VOL */
+      vol_blocks   = (vol_blocks / STORE_BLOCKS_PER_VOL) * 
STORE_BLOCKS_PER_VOL;
+      total_space += vol_blocks;
+
+      if (num == 2) {
+        gdisks[i]->delete_all_volumes();
+      } else {
+        gdisks[i]->cleared = 0;
+      }
+    }
+
+    if (total_space == 0) {
+      Warning("Not enough space to test");
+      return 0;
+    }
+
+    while (total_space > 0) {
+      if (vol_num > 255) {
+        break;
+      }
+      off_t modu = MAX_VOL_SIZE;
+      if (total_space < (MAX_VOL_SIZE >> STORE_BLOCK_SHIFT)) {
+        modu = total_space * STORE_BLOCK_SIZE;
+      }
+
+      off_t random_size = (gen->random() % modu) + 1;
+      /* convert to 128 megs multiple */
+      CacheType scheme = (random_size % 2) ? CACHE_HTTP_TYPE : CACHE_RTSP_TYPE;
+      random_size      = ROUND_TO_VOL_SIZE(random_size);
+      off_t blocks     = random_size / STORE_BLOCK_SIZE;
+      ink_assert(blocks <= (int)total_space);
+      total_space -= blocks;
+
+      ConfigVol *cp = new ConfigVol();
+
+      cp->number     = vol_num++;
+      cp->scheme     = scheme;
+      cp->size       = random_size >> 20;
+      cp->percent    = 0;
+      cp->in_percent = false;
+      cp->cachep     = nullptr;
+      config_volumes.cp_queue.enqueue(cp);
+      config_volumes.num_volumes++;
+      if (cp->scheme == CACHE_HTTP_TYPE) {
+        config_volumes.num_http_volumes++;
+        Dbg(dbg_ctl_cache_vol_test, "volume=%d scheme=http size=%zd", 
cp->number, static_cast<size_t>(cp->size));
+      } else {
+        // ToDo: Assert ?
+      }
+    }
+  } break;
+
+  default:
+    return 1;
+  }
+  return 1;
+}
+
+void
+execute_and_verify()
+{
+  ts::PostScript clear([&]() -> void {
+    ClearConfigVol(&config_volumes);
+    ClearCacheVolList(&cp_list, cp_list_len);
+  });
+
+  cplist_init();
+
+  if (cplist_reconfigure() < 0) {
+    Warning("reconfigure failed");
+    return;
+  }
+
+  /* compare the volumes */
+  REQUIRE(cp_list_len == config_volumes.num_volumes);
+
+  /* check that the volumes and sizes
+     match the configuration */
+  int matched   = 0;
+  ConfigVol *cp = config_volumes.cp_queue.head;
+  CacheVol *cachep;
+
+  for (int i = 0; i < config_volumes.num_volumes; i++) {
+    cachep = cp_list.head;
+    while (cachep) {
+      if (cachep->vol_number == cp->number) {
+        // Configuration and Actual volumes should match
+        REQUIRE(cachep->scheme == cp->scheme);
+        REQUIRE(cachep->size == (cp->size << (20 - STORE_BLOCK_SHIFT)));
+        REQUIRE(cachep == cp->cachep);
+
+        /* check that the number of volumes match the ones
+           on disk */
+        int d_no;
+        int m_vols = 0;
+        for (d_no = 0; d_no < gndisks; d_no++) {
+          if (cachep->disk_vols[d_no]) {
+            DiskVol *dp = cachep->disk_vols[d_no];
+            // DiskVols and CacheVols should match
+            REQUIRE(dp->vol_number == cachep->vol_number);
+
+            /* check the diskvolblock queue */
+            DiskVolBlockQueue *dpbq = dp->dpb_queue.head;
+            while (dpbq) {
+              // DiskVol and DiskVolBlocks should match
+              REQUIRE(dpbq->b->number == cachep->vol_number);
+              dpbq = dpbq->link.next;
+            }
+
+            m_vols += dp->num_volblocks;
+          }
+        }
+        // Num volumes in CacheVol and DiskVol should match
+        REQUIRE(m_vols == cachep->num_vols);
+
+        matched++;
+        break;
+      }
+      cachep = cachep->link.next;
+    }
+  }
+
+  // Num of Volumes created and configured should match
+  REQUIRE(matched == config_volumes.num_volumes);
+
+  for (int i = 0; i < gndisks; i++) {
+    CacheDisk *d = gdisks[i];
+    if (dbg_ctl_cache_hosting.on()) {
+      Dbg(dbg_ctl_cache_hosting, "Disk: %d: Vol Blocks: %u: Free space: %" 
PRIu64, i, d->header->num_diskvol_blks, d->free_space);
+      for (int j = 0; j < static_cast<int>(d->header->num_volumes); j++) {
+        Dbg(dbg_ctl_cache_hosting, "\tVol: %d Size: %" PRIu64, 
d->disk_vols[j]->vol_number, d->disk_vols[j]->size);
+      }
+      for (int j = 0; j < static_cast<int>(d->header->num_diskvol_blks); j++) {
+        Dbg(dbg_ctl_cache_hosting, "\tBlock No: %d Size: %" PRIu64 " Free: 
%u", d->header->vol_info[j].number,
+            d->header->vol_info[j].len, d->header->vol_info[j].free);
+      }
+    }
+  }
+}
+
+int
+ClearConfigVol(ConfigVolumes *configp)
+{
+  int i         = 0;
+  ConfigVol *cp = nullptr;
+  while ((cp = configp->cp_queue.dequeue())) {
+    delete cp;
+    i++;
+  }
+  if (i != configp->num_volumes) {
+    Warning("failed");
+    return 0;
+  }
+  configp->num_volumes      = 0;
+  configp->num_http_volumes = 0;
+  return 1;
+}
+
+int
+ClearCacheVolList(Queue<CacheVol> *cpl, int len)
+{
+  int i        = 0;
+  CacheVol *cp = nullptr;
+  while ((cp = cpl->dequeue())) {
+    ats_free(cp->disk_vols);
+    ats_free(cp->vols);
+    delete (cp);
+    i++;
+  }
+
+  if (i != len) {
+    Warning("Failed");
+    return 0;
+  }
+  return 1;
+}
+
+void
+save_state()
+{
+  saved_cp_list     = cp_list;
+  saved_cp_list_len = cp_list_len;
+  memcpy(&saved_config_volumes, &config_volumes, sizeof(ConfigVolumes));
+  saved_gnvol = gnvol;
+  memset(static_cast<void *>(&cp_list), 0, sizeof(Queue<CacheVol>));
+  memset(static_cast<void *>(&config_volumes), 0, sizeof(ConfigVolumes));
+  gnvol = 0;
+}
+
+void
+restore_state()
+{
+  cp_list     = saved_cp_list;
+  cp_list_len = saved_cp_list_len;
+  memcpy(&config_volumes, &saved_config_volumes, sizeof(ConfigVolumes));
+  gnvol = saved_gnvol;
+}
+} // end anonymous namespace
+
+class CacheVolTest : public CacheInit
+{
+public:
+  int
+  cache_init_success_callback(int event, void *e) override
+  {
+    // Test
+    save_state();
+    srand48(time(nullptr));
+
+    for (int i = 0; i < configs; i++) {
+      Dbg(dbg_ctl_cache_vol_test, "config case = %d", i);
+
+      if (create_config(i)) {
+        execute_and_verify();
+      }
+    }
+    restore_state();
+
+    // Teardown
+    test_done();
+    delete this;
+
+    return 0;
+  }
+};
+
+TEST_CASE("CacheVol")
+{
+  init_cache(0);
+
+  CacheVolTest *init = new CacheVolTest;
+
+  this_ethread()->schedule_imm(init);
+  this_thread()->execute();
+
+  return;
+}
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 7c146b9b0d..9f07dad2a9 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -103,6 +103,7 @@ if(ENABLE_DISK_FAILURE_TESTS)
   )
 endif()
 add_cache_test(CacheDir 
${CMAKE_SOURCE_DIR}/src/iocore/cache/unit_tests/test_CacheDir.cc)
+add_cache_test(CacheVol 
${CMAKE_SOURCE_DIR}/src/iocore/cache/unit_tests/test_CacheVol.cc)
 add_cache_test(RWW ${CMAKE_SOURCE_DIR}/src/iocore/cache/unit_tests/test_RWW.cc)
 add_cache_test(Alternate_L_to_S 
${CMAKE_SOURCE_DIR}/src/iocore/cache/unit_tests/test_Alternate_L_to_S.cc)
 add_cache_test(Alternate_S_to_L 
${CMAKE_SOURCE_DIR}/src/iocore/cache/unit_tests/test_Alternate_S_to_L.cc)

Reply via email to