Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright (c) Meta Platforms, Inc. and affiliates.
      3  * All rights reserved.
      4  *
      5  * This source code is licensed under both the BSD-style license (found in the
      6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
      7  * in the COPYING file in the root directory of this source tree).
      8  */
      9 #include "utils/ResourcePool.h"
     10 
     11 #include <gtest/gtest.h>
     12 #include <atomic>
     13 #include <thread>
     14 
     15 using namespace pzstd;
     16 
     17 TEST(ResourcePool, FullTest) {
     18   unsigned numCreated = 0;
     19   unsigned numDeleted = 0;
     20   {
     21     ResourcePool<int> pool(
     22       [&numCreated] { ++numCreated; return new int{5}; },
     23       [&numDeleted](int *x) { ++numDeleted; delete x; });
     24 
     25     {
     26       auto i = pool.get();
     27       EXPECT_EQ(5, *i);
     28       *i = 6;
     29     }
     30     {
     31       auto i = pool.get();
     32       EXPECT_EQ(6, *i);
     33       auto j = pool.get();
     34       EXPECT_EQ(5, *j);
     35       *j = 7;
     36     }
     37     {
     38       auto i = pool.get();
     39       EXPECT_EQ(6, *i);
     40       auto j = pool.get();
     41       EXPECT_EQ(7, *j);
     42     }
     43   }
     44   EXPECT_EQ(2, numCreated);
     45   EXPECT_EQ(numCreated, numDeleted);
     46 }
     47 
     48 TEST(ResourcePool, ThreadSafe) {
     49   std::atomic<unsigned> numCreated{0};
     50   std::atomic<unsigned> numDeleted{0};
     51   {
     52     ResourcePool<int> pool(
     53       [&numCreated] { ++numCreated; return new int{0}; },
     54       [&numDeleted](int *x) { ++numDeleted; delete x; });
     55     auto push = [&pool] {
     56       for (int i = 0; i < 100; ++i) {
     57         auto x = pool.get();
     58         ++*x;
     59       }
     60     };
     61     std::thread t1{push};
     62     std::thread t2{push};
     63     t1.join();
     64     t2.join();
     65 
     66     auto x = pool.get();
     67     auto y = pool.get();
     68     EXPECT_EQ(200, *x + *y);
     69   }
     70   EXPECT_GE(2, numCreated);
     71   EXPECT_EQ(numCreated, numDeleted);
     72 }
     73