diff options
| author | Benoit Germain <benoit.germain@ubisoft.com> | 2025-03-17 14:54:56 +0100 |
|---|---|---|
| committer | Benoit Germain <benoit.germain@ubisoft.com> | 2025-03-17 14:54:56 +0100 |
| commit | 7acc7867a8ebee0a3467a382b6998cb4e95580ed (patch) | |
| tree | 13f55245154b235b6a207e416d712702869644a0 | |
| parent | a57690123ae3ce5bdd7e970690f1380e88e4eaf6 (diff) | |
| download | lanes-7acc7867a8ebee0a3467a382b6998cb4e95580ed.tar.gz lanes-7acc7867a8ebee0a3467a382b6998cb4e95580ed.tar.bz2 lanes-7acc7867a8ebee0a3467a382b6998cb4e95580ed.zip | |
Fix test "allocator = <bad C function>" not failing against LuaJIT like it should
| -rw-r--r-- | src/state.cpp | 2 | ||||
| -rw-r--r-- | src/universe.cpp | 10 | ||||
| -rw-r--r-- | src/universe.hpp | 2 | ||||
| -rw-r--r-- | unit_tests/init_and_shutdown.cpp | 347 |
4 files changed, 185 insertions, 176 deletions
diff --git a/src/state.cpp b/src/state.cpp index b558d11..fc7f5ef 100644 --- a/src/state.cpp +++ b/src/state.cpp | |||
| @@ -158,7 +158,7 @@ namespace state { | |||
| 158 | // for some reason, LuaJIT 64 bits does not support creating a state with lua_newstate... | 158 | // for some reason, LuaJIT 64 bits does not support creating a state with lua_newstate... |
| 159 | return luaL_newstate(); | 159 | return luaL_newstate(); |
| 160 | } else { | 160 | } else { |
| 161 | lanes::AllocatorDefinition const _def{ U->resolveAllocator(from, hint) }; | 161 | lanes::AllocatorDefinition const _def{ U->resolveAndValidateAllocator(from, hint) }; |
| 162 | return _def.newState(); | 162 | return _def.newState(); |
| 163 | } | 163 | } |
| 164 | } | 164 | } |
diff --git a/src/universe.cpp b/src/universe.cpp index dd7bc4b..db00b72 100644 --- a/src/universe.cpp +++ b/src/universe.cpp | |||
| @@ -244,7 +244,7 @@ void Universe::initializeAllocatorFunction(lua_State* const L_) | |||
| 244 | provideAllocator = lua_tocfunction(L_, -1); // L_: settings allocator | 244 | provideAllocator = lua_tocfunction(L_, -1); // L_: settings allocator |
| 245 | if (provideAllocator != nullptr) { | 245 | if (provideAllocator != nullptr) { |
| 246 | // make sure the function doesn't have upvalues | 246 | // make sure the function doesn't have upvalues |
| 247 | char const* _upname = lua_getupvalue(L_, -1, 1); // L_: settings allocator upval? | 247 | char const* _upname{ lua_getupvalue(L_, -1, 1) }; // L_: settings allocator upval? |
| 248 | if (_upname != nullptr) { // should be "" for C functions with upvalues if any | 248 | if (_upname != nullptr) { // should be "" for C functions with upvalues if any |
| 249 | raise_luaL_error(L_, "config.allocator() shouldn't have upvalues"); | 249 | raise_luaL_error(L_, "config.allocator() shouldn't have upvalues"); |
| 250 | } | 250 | } |
| @@ -266,11 +266,11 @@ void Universe::initializeAllocatorFunction(lua_State* const L_) | |||
| 266 | std::ignore = luaG_getfield(L_, kIdxTop, "internal_allocator"); // L_: settings "libc"|"allocator" | 266 | std::ignore = luaG_getfield(L_, kIdxTop, "internal_allocator"); // L_: settings "libc"|"allocator" |
| 267 | LUA_ASSERT(L_, lua_isstring(L_, kIdxTop)); // should be the case due to lanes.lua parameter validation | 267 | LUA_ASSERT(L_, lua_isstring(L_, kIdxTop)); // should be the case due to lanes.lua parameter validation |
| 268 | std::string_view const _allocator{ luaG_tostring(L_, kIdxTop) }; | 268 | std::string_view const _allocator{ luaG_tostring(L_, kIdxTop) }; |
| 269 | // use whatever the provider provides. This performs validation of what provideAllocator is giving | ||
| 270 | // we do this even if _allocator == "libc", to have the validation part | ||
| 271 | internalAllocator = resolveAndValidateAllocator(L_, "internal"); | ||
| 269 | if (_allocator == "libc") { | 272 | if (_allocator == "libc") { |
| 270 | internalAllocator = lanes::AllocatorDefinition{ libc_lua_Alloc, nullptr }; | 273 | internalAllocator = lanes::AllocatorDefinition{ libc_lua_Alloc, nullptr }; |
| 271 | } else { | ||
| 272 | // use whatever the provider provides | ||
| 273 | internalAllocator = resolveAllocator(L_, "internal"); | ||
| 274 | } | 274 | } |
| 275 | lua_pop(L_, 1); // L_: settings | 275 | lua_pop(L_, 1); // L_: settings |
| 276 | STACK_CHECK(L_, 1); | 276 | STACK_CHECK(L_, 1); |
| @@ -331,7 +331,7 @@ void Universe::initializeOnStateCreate(lua_State* const L_) | |||
| 331 | 331 | ||
| 332 | // ################################################################################################# | 332 | // ################################################################################################# |
| 333 | 333 | ||
| 334 | lanes::AllocatorDefinition Universe::resolveAllocator(lua_State* const L_, std::string_view const& hint_) const | 334 | lanes::AllocatorDefinition Universe::resolveAndValidateAllocator(lua_State* const L_, std::string_view const& hint_) const |
| 335 | { | 335 | { |
| 336 | lanes::AllocatorDefinition _ret{ protectedAllocator }; | 336 | lanes::AllocatorDefinition _ret{ protectedAllocator }; |
| 337 | if (provideAllocator == nullptr) { | 337 | if (provideAllocator == nullptr) { |
diff --git a/src/universe.hpp b/src/universe.hpp index 2a3085d..42a3d83 100644 --- a/src/universe.hpp +++ b/src/universe.hpp | |||
| @@ -151,7 +151,7 @@ class Universe final | |||
| 151 | static int InitializeFinalizer(lua_State* L_); | 151 | static int InitializeFinalizer(lua_State* L_); |
| 152 | void initializeOnStateCreate(lua_State* L_); | 152 | void initializeOnStateCreate(lua_State* L_); |
| 153 | [[nodiscard]] | 153 | [[nodiscard]] |
| 154 | lanes::AllocatorDefinition resolveAllocator(lua_State* L_, std::string_view const& hint_) const; | 154 | lanes::AllocatorDefinition resolveAndValidateAllocator(lua_State* L_, std::string_view const& hint_) const; |
| 155 | static inline void Store(lua_State* L_, Universe* U_); | 155 | static inline void Store(lua_State* L_, Universe* U_); |
| 156 | [[nodiscard]] | 156 | [[nodiscard]] |
| 157 | bool terminateFreeRunningLanes(lua_Duration shutdownTimeout_, CancelOp op_); | 157 | bool terminateFreeRunningLanes(lua_Duration shutdownTimeout_, CancelOp op_); |
diff --git a/unit_tests/init_and_shutdown.cpp b/unit_tests/init_and_shutdown.cpp index 9652f2d..b8174fd 100644 --- a/unit_tests/init_and_shutdown.cpp +++ b/unit_tests/init_and_shutdown.cpp | |||
| @@ -56,234 +56,243 @@ TEST_CASE("lanes.require 'lanes'") | |||
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | // ################################################################################################# | 58 | // ################################################################################################# |
| 59 | // ################################################################################################# | ||
| 60 | // allocator should be "protected", a C function returning a suitable userdata, or nil | ||
| 61 | 59 | ||
| 62 | TEST_CASE("lanes.configure") | 60 | // allocator should be "protected", a C function returning a suitable userdata, or nil |
| 61 | TEST_CASE("lanes.configure.allocator") | ||
| 63 | { | 62 | { |
| 64 | LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; | 63 | LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; |
| 65 | 64 | ||
| 65 | SECTION("allocator = false") | ||
| 66 | { | ||
| 67 | L.requireFailure("require 'lanes'.configure{allocator = false}"); | ||
| 68 | } | ||
| 69 | |||
| 66 | // --------------------------------------------------------------------------------------------- | 70 | // --------------------------------------------------------------------------------------------- |
| 67 | 71 | ||
| 68 | SECTION("allocator", "[allocator]") | 72 | SECTION("allocator = true") |
| 69 | { | 73 | { |
| 70 | SECTION("allocator = false") | 74 | L.requireFailure("require 'lanes'.configure{allocator = true}"); |
| 71 | { | 75 | } |
| 72 | L.requireFailure("require 'lanes'.configure{allocator = false}"); | ||
| 73 | } | ||
| 74 | 76 | ||
| 75 | // ----------------------------------------------------------------------------------------- | 77 | // --------------------------------------------------------------------------------------------- |
| 76 | 78 | ||
| 77 | SECTION("allocator = true") | 79 | SECTION("allocator = <number>") |
| 78 | { | 80 | { |
| 79 | L.requireFailure("require 'lanes'.configure{allocator = true}"); | 81 | L.requireFailure("require 'lanes'.configure{allocator = 33}"); |
| 80 | } | 82 | } |
| 81 | 83 | ||
| 82 | // ----------------------------------------------------------------------------------------- | 84 | // --------------------------------------------------------------------------------------------- |
| 83 | 85 | ||
| 84 | SECTION("allocator = <number>") | 86 | SECTION("allocator = <table>") |
| 85 | { | 87 | { |
| 86 | L.requireFailure("require 'lanes'.configure{allocator = 33}"); | 88 | L.requireFailure("require 'lanes'.configure{allocator = {}}"); |
| 87 | } | 89 | } |
| 88 | 90 | ||
| 89 | // ----------------------------------------------------------------------------------------- | 91 | // --------------------------------------------------------------------------------------------- |
| 90 | 92 | ||
| 91 | SECTION("allocator = <table>") | 93 | SECTION("allocator = <Lua function>") |
| 92 | { | 94 | { |
| 93 | L.requireFailure("require 'lanes'.configure{allocator = {}}"); | 95 | L.requireFailure("require 'lanes'.configure{allocator = function() return {}, 12, 'yoy' end}"); |
| 94 | } | 96 | } |
| 95 | 97 | ||
| 96 | // ----------------------------------------------------------------------------------------- | 98 | // --------------------------------------------------------------------------------------------- |
| 97 | 99 | ||
| 98 | SECTION("allocator = <Lua function>") | 100 | SECTION("allocator = <bad C function>") |
| 99 | { | 101 | { |
| 100 | L.requireFailure("require 'lanes'.configure{allocator = function() return {}, 12, 'yoy' end}"); | 102 | // a C function that doesn't return what we expect should cause an error too |
| 101 | } | 103 | // TODO: for some reason, we use os.getenv here because using 'print' as the culprit, the tests deadlock in Release builds |
| 104 | L.requireFailure("return type(require 'lanes'.configure{allocator = os.getenv})"); | ||
| 105 | } | ||
| 102 | 106 | ||
| 103 | // ----------------------------------------------------------------------------------------- | 107 | // --------------------------------------------------------------------------------------------- |
| 104 | 108 | ||
| 105 | SECTION("allocator = <bad C function>") | 109 | SECTION("allocator = <string with a typo>") |
| 106 | { | 110 | { |
| 107 | // a C function that doesn't return what we expect should cause an error too | 111 | // oops, a typo |
| 108 | L.requireFailure("require 'lanes'.configure{allocator = print}"); | 112 | L.requireFailure("require 'lanes'.configure{allocator = 'Protected'}"); |
| 109 | } | 113 | } |
| 110 | 114 | ||
| 111 | // ----------------------------------------------------------------------------------------- | 115 | // --------------------------------------------------------------------------------------------- |
| 112 | 116 | ||
| 113 | SECTION("allocator = <string with a typo>") | 117 | SECTION("allocator = 'protected'") |
| 114 | { | 118 | { |
| 115 | // oops, a typo | 119 | // no typo, should work |
| 116 | L.requireFailure("require 'lanes'.configure{allocator = 'Protected'}"); | 120 | L.requireSuccess("require 'lanes'.configure{allocator = 'protected'}"); |
| 117 | } | 121 | } |
| 118 | 122 | ||
| 119 | // ----------------------------------------------------------------------------------------- | 123 | // --------------------------------------------------------------------------------------------- |
| 120 | 124 | ||
| 121 | SECTION("allocator = 'protected'") | 125 | SECTION("allocator = <good custom C allocator>") |
| 122 | { | 126 | { |
| 123 | // no typo, should work | 127 | // a function that provides what we expect is fine |
| 124 | L.requireSuccess("require 'lanes'.configure{allocator = 'protected'}"); | 128 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { |
| 125 | } | 129 | lanes::AllocatorDefinition* const _def{ new (L_) lanes::AllocatorDefinition{} }; |
| 130 | _def->initFrom(L_); | ||
| 131 | return 1; | ||
| 132 | }; | ||
| 133 | lua_pushcfunction(L, _provideAllocator); | ||
| 134 | lua_setglobal(L, "ProvideAllocator"); | ||
| 135 | L.requireSuccess("require 'lanes'.configure{allocator = ProvideAllocator}"); | ||
| 136 | } | ||
| 126 | 137 | ||
| 127 | // ----------------------------------------------------------------------------------------- | 138 | // --------------------------------------------------------------------------------------------- |
| 128 | 139 | ||
| 129 | SECTION("allocator = <good custom C allocator>") | 140 | SECTION("allocator not returning an AllocatorDefinition") |
| 130 | { | 141 | { |
| 131 | // a function that provides what we expect is fine | 142 | // a function that provides something that is definitely not an AllocatorDefinition, should cause an error |
| 132 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { | 143 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { |
| 133 | lanes::AllocatorDefinition* const _def{ new (L_) lanes::AllocatorDefinition{} }; | 144 | lua_newtable(L_); |
| 134 | _def->initFrom(L_); | 145 | return 1; |
| 135 | return 1; | 146 | }; |
| 136 | }; | 147 | lua_pushcfunction(L, _provideAllocator); |
| 137 | lua_pushcfunction(L, _provideAllocator); | 148 | lua_setglobal(L, "ProvideAllocator"); |
| 138 | lua_setglobal(L, "ProvideAllocator"); | 149 | // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected |
| 139 | L.requireSuccess("require 'lanes'.configure{allocator = ProvideAllocator}"); | 150 | // which would prevent us from calling _provideAllocator |
| 140 | } | 151 | L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}"); |
| 152 | } | ||
| 141 | 153 | ||
| 142 | // ----------------------------------------------------------------------------------------- | 154 | // --------------------------------------------------------------------------------------------- |
| 143 | 155 | ||
| 144 | SECTION("allocator not returning an AllocatorDefinition") | 156 | SECTION("allocator returning an AllocatorDefinition with the wrong signature") |
| 145 | { | 157 | { |
| 146 | // a function that provides something that is definitely not an AllocatorDefinition, should cause an error | 158 | // a function that provides something that is too small to contain an AllocatorDefinition, should cause an error |
| 147 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { | 159 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { |
| 148 | lua_newtable(L_); | 160 | // create a full userdata that is too small (it only contains enough to store a version tag, but not the rest |
| 149 | return 1; | 161 | auto* const _duck{ static_cast<lanes::AllocatorDefinition::version_t*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition::version_t))) }; |
| 150 | }; | 162 | *_duck = 666777; |
| 151 | lua_pushcfunction(L, _provideAllocator); | 163 | return 1; |
| 152 | lua_setglobal(L, "ProvideAllocator"); | 164 | }; |
| 153 | // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected | 165 | lua_pushcfunction(L, _provideAllocator); |
| 154 | // which would prevent us from calling _provideAllocator | 166 | lua_setglobal(L, "ProvideAllocator"); |
| 155 | L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}"); | 167 | // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected |
| 156 | } | 168 | // which would prevent us from calling _provideAllocator |
| 169 | L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}"); | ||
| 170 | } | ||
| 157 | 171 | ||
| 158 | // ----------------------------------------------------------------------------------------- | 172 | // ----------------------------------------------------------------------------------------- |
| 159 | 173 | ||
| 160 | SECTION("allocator returning an AllocatorDefinition with the wrong signature") | 174 | SECTION("allocator returning something too small to be a valid AllocatorDefinition") |
| 161 | { | 175 | { |
| 162 | // a function that provides something that is too small to contain an AllocatorDefinition, should cause an error | 176 | // a function that provides something that attempts to pass as an AllocatorDefinition, but is not, should cause an error |
| 163 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { | 177 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { |
| 164 | // create a full userdata that is too small (it only contains enough to store a version tag, but not the rest | 178 | // create a full userdata of the correct size, but of course the contents don't match |
| 165 | auto* const _duck{ static_cast<lanes::AllocatorDefinition::version_t*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition::version_t))) }; | 179 | int* const _duck{ static_cast<int*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition))) }; |
| 166 | *_duck = 666777; | 180 | _duck[0] = 666; |
| 167 | return 1; | 181 | _duck[1] = 777; |
| 168 | }; | 182 | return 1; |
| 169 | lua_pushcfunction(L, _provideAllocator); | 183 | }; |
| 170 | lua_setglobal(L, "ProvideAllocator"); | 184 | lua_pushcfunction(L, _provideAllocator); |
| 171 | // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected | 185 | lua_setglobal(L, "ProvideAllocator"); |
| 172 | // which would prevent us from calling _provideAllocator | 186 | // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected |
| 173 | L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}"); | 187 | // which would prevent us from calling _provideAllocator |
| 174 | } | 188 | L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}"); |
| 189 | } | ||
| 190 | } | ||
| 175 | 191 | ||
| 176 | // ----------------------------------------------------------------------------------------- | 192 | // ################################################################################################# |
| 177 | 193 | ||
| 178 | SECTION("allocator returning something too small to be a valid AllocatorDefinition") | 194 | TEST_CASE("lanes.configure.internal_allocator") |
| 179 | { | 195 | { |
| 180 | // a function that provides something that attempts to pass as an AllocatorDefinition, but is not, should cause an error | 196 | LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; |
| 181 | static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { | ||
| 182 | // create a full userdata of the correct size, but of course the contents don't match | ||
| 183 | int* const _duck{ static_cast<int*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition))) }; | ||
| 184 | _duck[0] = 666; | ||
| 185 | _duck[1] = 777; | ||
| 186 | return 1; | ||
| 187 | }; | ||
| 188 | lua_pushcfunction(L, _provideAllocator); | ||
| 189 | lua_setglobal(L, "ProvideAllocator"); | ||
| 190 | // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected | ||
| 191 | // which would prevent us from calling _provideAllocator | ||
| 192 | L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}"); | ||
| 193 | } | ||
| 194 | } | ||
| 195 | 197 | ||
| 196 | // --------------------------------------------------------------------------------------------- | ||
| 197 | // internal_allocator should be a string, "libc"/"allocator" | 198 | // internal_allocator should be a string, "libc"/"allocator" |
| 198 | 199 | ||
| 199 | SECTION("[internal_allocator") | 200 | SECTION("internal_allocator = false") |
| 200 | { | 201 | { |
| 201 | SECTION("internal_allocator = false") | 202 | L.requireFailure("require 'lanes'.configure{internal_allocator = false}"); |
| 202 | { | 203 | } |
| 203 | L.requireFailure("require 'lanes'.configure{internal_allocator = false}"); | ||
| 204 | } | ||
| 205 | 204 | ||
| 206 | // ----------------------------------------------------------------------------------------- | 205 | // --------------------------------------------------------------------------------------------- |
| 207 | 206 | ||
| 208 | SECTION("internal_allocator = true") | 207 | SECTION("internal_allocator = true") |
| 209 | { | 208 | { |
| 210 | L.requireFailure("require 'lanes'.configure{internal_allocator = true}"); | 209 | L.requireFailure("require 'lanes'.configure{internal_allocator = true}"); |
| 211 | } | 210 | } |
| 212 | 211 | ||
| 213 | // ----------------------------------------------------------------------------------------- | 212 | // --------------------------------------------------------------------------------------------- |
| 214 | 213 | ||
| 215 | SECTION("internal_allocator = <table>") | 214 | SECTION("internal_allocator = <table>") |
| 216 | { | 215 | { |
| 217 | L.requireFailure("require 'lanes'.configure{internal_allocator = {}}"); | 216 | L.requireFailure("require 'lanes'.configure{internal_allocator = {}}"); |
| 218 | } | 217 | } |
| 219 | 218 | ||
| 220 | // ----------------------------------------------------------------------------------------- | 219 | // --------------------------------------------------------------------------------------------- |
| 221 | 220 | ||
| 222 | SECTION("internal_allocator = <Lua function>") | 221 | SECTION("internal_allocator = <Lua function>") |
| 223 | { | 222 | { |
| 224 | L.requireFailure("require 'lanes'.configure{internal_allocator = function() end}"); | 223 | L.requireFailure("require 'lanes'.configure{internal_allocator = function() end}"); |
| 225 | } | 224 | } |
| 226 | 225 | ||
| 227 | // ----------------------------------------------------------------------------------------- | 226 | // --------------------------------------------------------------------------------------------- |
| 228 | 227 | ||
| 229 | SECTION("internal_allocator = <bad string>") | 228 | SECTION("internal_allocator = <bad string>") |
| 230 | { | 229 | { |
| 231 | L.requireFailure("require 'lanes'.configure{internal_allocator = 'gluh'}"); | 230 | L.requireFailure("require 'lanes'.configure{internal_allocator = 'gluh'}"); |
| 232 | } | 231 | } |
| 233 | 232 | ||
| 234 | // ----------------------------------------------------------------------------------------- | 233 | // --------------------------------------------------------------------------------------------- |
| 235 | 234 | ||
| 236 | SECTION("internal_allocator = 'libc'") | 235 | SECTION("internal_allocator = 'libc'") |
| 237 | { | 236 | { |
| 238 | L.requireSuccess("require 'lanes'.configure{internal_allocator = 'libc'}"); | 237 | L.requireSuccess("require 'lanes'.configure{internal_allocator = 'libc'}"); |
| 239 | } | 238 | } |
| 240 | 239 | ||
| 241 | // ----------------------------------------------------------------------------------------- | 240 | // --------------------------------------------------------------------------------------------- |
| 242 | 241 | ||
| 243 | SECTION("internal_allocator = 'allocator'") | 242 | SECTION("internal_allocator = 'allocator'") |
| 244 | { | 243 | { |
| 245 | L.requireSuccess("require 'lanes'.configure{internal_allocator = 'allocator'}"); | 244 | L.requireSuccess("require 'lanes'.configure{internal_allocator = 'allocator'}"); |
| 246 | } | ||
| 247 | } | 245 | } |
| 246 | } | ||
| 247 | |||
| 248 | // ################################################################################################# | ||
| 249 | |||
| 250 | TEST_CASE("lanes.configure.keepers_gc_threshold") | ||
| 251 | { | ||
| 252 | LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; | ||
| 248 | 253 | ||
| 249 | // --------------------------------------------------------------------------------------------- | ||
| 250 | // keepers_gc_threshold should be a number in [0, 100] | 254 | // keepers_gc_threshold should be a number in [0, 100] |
| 251 | 255 | ||
| 252 | SECTION("keepers_gc_threshold") | 256 | SECTION("keepers_gc_threshold = <table>") |
| 253 | { | 257 | { |
| 254 | SECTION("keepers_gc_threshold = <table>") | 258 | L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = {}}"); |
| 255 | { | 259 | } |
| 256 | L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = {}}"); | ||
| 257 | } | ||
| 258 | 260 | ||
| 259 | // ----------------------------------------------------------------------------------------- | 261 | // --------------------------------------------------------------------------------------------- |
| 260 | 262 | ||
| 261 | SECTION("keepers_gc_threshold = <string>") | 263 | SECTION("keepers_gc_threshold = <string>") |
| 262 | { | 264 | { |
| 263 | L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = 'gluh'}"); | 265 | L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = 'gluh'}"); |
| 264 | } | 266 | } |
| 265 | 267 | ||
| 266 | // ----------------------------------------------------------------------------------------- | 268 | // --------------------------------------------------------------------------------------------- |
| 267 | 269 | ||
| 268 | SECTION("keepers_gc_threshold = -1") | 270 | SECTION("keepers_gc_threshold = -1") |
| 269 | { | 271 | { |
| 270 | L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = -1}"); | 272 | L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = -1}"); |
| 271 | } | 273 | } |
| 272 | 274 | ||
| 273 | // ----------------------------------------------------------------------------------------- | 275 | // --------------------------------------------------------------------------------------------- |
| 274 | 276 | ||
| 275 | SECTION("keepers_gc_threshold = 0") | 277 | SECTION("keepers_gc_threshold = 0") |
| 276 | { | 278 | { |
| 277 | L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 0}"); | 279 | L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 0}"); |
| 278 | } | 280 | } |
| 279 | 281 | ||
| 280 | // ----------------------------------------------------------------------------------------- | 282 | // --------------------------------------------------------------------------------------------- |
| 281 | 283 | ||
| 282 | SECTION("keepers_gc_threshold = 100") | 284 | SECTION("keepers_gc_threshold = 100") |
| 283 | { | 285 | { |
| 284 | L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 100}"); | 286 | L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 100}"); |
| 285 | } | ||
| 286 | } | 287 | } |
| 288 | } | ||
| 289 | |||
| 290 | // ################################################################################################# | ||
| 291 | |||
| 292 | TEST_CASE("lanes.configure.the rest") | ||
| 293 | { | ||
| 294 | LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; | ||
| 295 | |||
| 287 | 296 | ||
| 288 | // --------------------------------------------------------------------------------------------- | 297 | // --------------------------------------------------------------------------------------------- |
| 289 | // nb_user_keepers should be a number in [0, 100] | 298 | // nb_user_keepers should be a number in [0, 100] |
