libutil: make the pool element factory a promise

processStderr of RemoteStore wants to be a promise and it must be used
from connection setup, so the pool factory callback must be a promise.

Change-Id: I9ac742b6048ae6dba0bfa5dcb58971386229690b
This commit is contained in:
eldritch horrors
2025-06-11 22:28:44 +02:00
parent 56847dc10d
commit 87fbc15938
5 changed files with 63 additions and 33 deletions
+19 -6
View File
@@ -1,4 +1,5 @@
#include "lix/libutil/pool.hh"
#include "lix/libutil/result.hh"
#include <gtest/gtest.h>
#include <kj/async.h>
@@ -32,7 +33,9 @@ namespace nix {
TEST_F(PoolTest, freshPoolHasZeroCountAndSpecifiedCapacity) {
auto isGood = [](const ref<TestResource> & r) { return r->good; };
auto createResource = []() { return make_ref<TestResource>(); };
auto createResource = []() -> kj::Promise<Result<ref<TestResource>>> {
return {result::success(make_ref<TestResource>())};
};
Pool<TestResource> pool = Pool<TestResource>((size_t)1, createResource, isGood);
@@ -42,7 +45,9 @@ namespace nix {
TEST_F(PoolTest, freshPoolCanGetAResource) {
auto isGood = [](const ref<TestResource> & r) { return r->good; };
auto createResource = []() { return make_ref<TestResource>(); };
auto createResource = []() -> kj::Promise<Result<ref<TestResource>>> {
return {result::success(make_ref<TestResource>())};
};
Pool<TestResource> pool = Pool<TestResource>((size_t)1, createResource, isGood);
ASSERT_EQ(pool.count(), 0);
@@ -57,7 +62,9 @@ namespace nix {
TEST_F(PoolTest, capacityCanBeIncremented) {
auto isGood = [](const ref<TestResource> & r) { return r->good; };
auto createResource = []() { return make_ref<TestResource>(); };
auto createResource = []() -> kj::Promise<Result<ref<TestResource>>> {
return {result::success(make_ref<TestResource>())};
};
Pool<TestResource> pool = Pool<TestResource>((size_t)1, createResource, isGood);
ASSERT_EQ(pool.capacity(), 1);
@@ -67,7 +74,9 @@ namespace nix {
TEST_F(PoolTest, capacityCanBeDecremented) {
auto isGood = [](const ref<TestResource> & r) { return r->good; };
auto createResource = []() { return make_ref<TestResource>(); };
auto createResource = []() -> kj::Promise<Result<ref<TestResource>>> {
return {result::success(make_ref<TestResource>())};
};
Pool<TestResource> pool = Pool<TestResource>((size_t)1, createResource, isGood);
ASSERT_EQ(pool.capacity(), 1);
@@ -78,7 +87,9 @@ namespace nix {
// Test that the resources we allocate are being reused when they are still good.
TEST_F(PoolTest, reuseResource) {
auto isGood = [](const ref<TestResource> & r) { return true; };
auto createResource = []() { return make_ref<TestResource>(); };
auto createResource = []() -> kj::Promise<Result<ref<TestResource>>> {
return {result::success(make_ref<TestResource>())};
};
Pool<TestResource> pool = Pool<TestResource>((size_t)1, createResource, isGood);
@@ -99,7 +110,9 @@ namespace nix {
// Test that the resources we allocate are being thrown away when they are no longer good.
TEST_F(PoolTest, badResourceIsNotReused) {
auto isGood = [](const ref<TestResource> & r) { return false; };
auto createResource = []() { return make_ref<TestResource>(); };
auto createResource = []() -> kj::Promise<Result<ref<TestResource>>> {
return {result::success(make_ref<TestResource>())};
};
Pool<TestResource> pool = Pool<TestResource>((size_t)1, createResource, isGood);