From: Joel Rosdahl Date: Fri, 11 Sep 2020 07:43:29 +0000 (+0200) Subject: Add unit tests of Counters class X-Git-Tag: v4.0~105 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6fe63f01d4f987d8c73e43ee43f2e06942d8af37;p=thirdparty%2Fccache.git Add unit tests of Counters class --- diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 360824f80..6ae54ffa2 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -7,6 +7,7 @@ set( test_Checksum.cpp test_Compression.cpp test_Config.cpp + test_Counters.cpp test_FormatNonstdStringView.cpp test_Hash.cpp test_Lockfile.cpp diff --git a/unittest/test_Counters.cpp b/unittest/test_Counters.cpp new file mode 100644 index 000000000..951856ad2 --- /dev/null +++ b/unittest/test_Counters.cpp @@ -0,0 +1,92 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#include "../src/Counters.hpp" +#include "../src/stats.hpp" +#include "TestUtil.hpp" + +#include "third_party/doctest.h" + +using TestUtil::TestContext; + +TEST_SUITE_BEGIN("Counters"); + +TEST_CASE("Counters") +{ + TestContext test_context; + + Counters counters; + CHECK(counters.size() == static_cast(Statistic::END)); + + SUBCASE("Get and set statistic") + { + CHECK(counters.get(Statistic::cache_miss) == 0); + counters.set(Statistic::cache_miss, 27); + CHECK(counters.get(Statistic::cache_miss) == 27); + } + + SUBCASE("Get and set raw index") + { + CHECK(counters.get_raw(4) == 0); + counters.set_raw(4, 27); + CHECK(counters.get(Statistic::cache_miss) == 27); + } + + SUBCASE("Set future raw counter") + { + const auto future_index = static_cast(Statistic::END) + 2; + counters.set_raw(future_index, 42); + CHECK(counters.get_raw(future_index) == 42); + } + + SUBCASE("Increment single counter") + { + counters.set(Statistic::cache_miss, 4); + + counters.increment(Statistic::cache_miss); + CHECK(counters.get(Statistic::cache_miss) == 5); + + counters.increment(Statistic::cache_miss, -3); + CHECK(counters.get(Statistic::cache_miss) == 2); + + counters.increment(Statistic::cache_miss, -3); + CHECK(counters.get(Statistic::cache_miss) == 0); + } + + SUBCASE("Increment many counters") + { + counters.set(Statistic::direct_cache_hit, 3); + counters.set(Statistic::cache_miss, 2); + counters.set(Statistic::files_in_cache, 10); + counters.set(Statistic::cache_size_kibibyte, 1); + + Counters updates; + updates.set(Statistic::direct_cache_hit, 6); + updates.set(Statistic::cache_miss, 5); + updates.set(Statistic::files_in_cache, -1); + updates.set(Statistic::cache_size_kibibyte, -4); + + counters.increment(updates); + CHECK(counters.get(Statistic::direct_cache_hit) == 9); + CHECK(counters.get(Statistic::cache_miss) == 7); + CHECK(counters.get(Statistic::files_in_cache) == 9); + CHECK(counters.get(Statistic::cache_size_kibibyte) == 0); // No wrap-around + } +} + +TEST_SUITE_END();