/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 * All rights reserved.
 *
 * This source code is licensed under both the BSD-style license (found in the
 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
 * in the COPYING file in the root directory of this source tree).
 */
#include "utils/ResourcePool.h"

#include <gtest/gtest.h>
#include <atomic>
#include <thread>

using namespace pzstd;

TEST(ResourcePool, FullTest) {
  unsigned numCreated = 0;
  unsigned numDeleted = 0;
  {
    ResourcePool<int> pool(
      [&numCreated] { ++numCreated; return new int{5}; },
      [&numDeleted](int *x) { ++numDeleted; delete x; });

    {
      auto i = pool.get();
      EXPECT_EQ(5, *i);
      *i = 6;
    }
    {
      auto i = pool.get();
      EXPECT_EQ(6, *i);
      auto j = pool.get();
      EXPECT_EQ(5, *j);
      *j = 7;
    }
    {
      auto i = pool.get();
      EXPECT_EQ(6, *i);
      auto j = pool.get();
      EXPECT_EQ(7, *j);
    }
  }
  EXPECT_EQ(2, numCreated);
  EXPECT_EQ(numCreated, numDeleted);
}

TEST(ResourcePool, ThreadSafe) {
  std::atomic<unsigned> numCreated{0};
  std::atomic<unsigned> numDeleted{0};
  {
    ResourcePool<int> pool(
      [&numCreated] { ++numCreated; return new int{0}; },
      [&numDeleted](int *x) { ++numDeleted; delete x; });
    auto push = [&pool] {
      for (int i = 0; i < 100; ++i) {
        auto x = pool.get();
        ++*x;
      }
    };
    std::thread t1{push};
    std::thread t2{push};
    t1.join();
    t2.join();

    auto x = pool.get();
    auto y = pool.get();
    EXPECT_EQ(200, *x + *y);
  }
  EXPECT_GE(2, numCreated);
  EXPECT_EQ(numCreated, numDeleted);
}
