diff options
Diffstat (limited to 'library/cpp/monlib/counters/counters_ut.cpp')
-rw-r--r-- | library/cpp/monlib/counters/counters_ut.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/library/cpp/monlib/counters/counters_ut.cpp b/library/cpp/monlib/counters/counters_ut.cpp new file mode 100644 index 0000000000..2845efb97b --- /dev/null +++ b/library/cpp/monlib/counters/counters_ut.cpp @@ -0,0 +1,49 @@ +#include "counters.h" + +#include <library/cpp/testing/unittest/registar.h> + +#include <util/generic/set.h> +#include <util/thread/pool.h> + +using namespace NMonitoring; + +Y_UNIT_TEST_SUITE(TDeprecatedCountersTest) { + Y_UNIT_TEST(CounterGroupsAreThreadSafe) { + const static ui32 GROUPS_COUNT = 1000; + const static ui32 THREADS_COUNT = 10; + + TDeprecatedCounterGroups<ui32, ui32> groups; + + auto adder = [&groups]() { + for (ui32 id = 0; id < GROUPS_COUNT; id++) { + groups.Get(id); + + // adds contention + ::NanoSleep(42); + } + }; + + TThreadPool q; + q.Start(THREADS_COUNT); + for (ui32 i = 0; i < THREADS_COUNT; i++) { + q.SafeAddFunc(adder); + } + q.Stop(); + + // each group id is present + for (ui32 id = 0; id < GROUPS_COUNT; id++) { + UNIT_ASSERT(groups.Has(id)); + } + + // group names contains only appropriate ids + auto ids = groups.GetGroupsNames(); + for (ui32 id : *ids) { + UNIT_ASSERT(id < GROUPS_COUNT); + } + + // no duplication in group names + TSet<ui32> uniqueIds(ids->begin(), ids->end()); + UNIT_ASSERT_EQUAL(ids->size(), uniqueIds.size()); + UNIT_ASSERT_EQUAL(ids->size(), GROUPS_COUNT); + } +} |