Packages
fixpoint
0.21.4
0.22.1
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.18.2
0.18.1
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.13.5
0.13.4
0.13.2
0.13.1
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.2
0.12.1
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.46
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.1.3
0.1.2
0.1.1
0.1.0
Constraint Programming Solver
Current section
Files
Jump to
Current section
Files
test/space/thread_pool_test.exs
defmodule CPSolverTest.Space.ThreadPool do
use ExUnit.Case
alias CPSolver.Space.ThreadPool
describe "The pool for space threads" do
test "checkouts" do
num_threads = 4
{:ok, thread_pool} = ThreadPool.new(num_threads)
{:ok, %{queue: q}} = ThreadPool.get_pool_state(thread_pool)
assert 0 = :queue.len(q)
## If number of checkouts does not exceed the pool capacity,
## the process queue is empty.
assert Enum.all?(1..num_threads, fn i ->
spawn(fn ->
ThreadPool.run_task(
fn -> :timer.sleep(100) end,
thread_pool)
end)
## Give it a bit of time for the process to check out.
:timer.sleep(10)
{:ok, %{queue: q, available: available_threads}} = ThreadPool.get_pool_state(thread_pool)
## No queue, available thread count is down with every checkout
:queue.len(q) == 0 && available_threads == num_threads - i
end)
## No available threads now
{:ok, %{available: available}} = ThreadPool.get_pool_state(thread_pool)
assert 0 = available
## This process will be added to pool queue
my_pid = self()
waiting_process = spawn(fn ->
ThreadPool.run_task(
fn ->
send(my_pid, {:completed, self()})
end,
thread_pool)
end)
## Give it a bit of time for the process to be added to the thread pool.
:timer.sleep(10)
{:ok, %{queue: q}} = ThreadPool.get_pool_state(thread_pool)
assert :queue.len(q) == 1
## Wait for any of the processes previously checked out to complete and check in
:timer.sleep(100)
## The waiting process should be removed from the queue...
{:ok, %{queue: q}} = ThreadPool.get_pool_state(thread_pool)
assert :queue.len(q) == 0
## ...and processed
assert_receive {:completed, ^waiting_process}
## The pool is now at full capacity
{:ok, %{available: available}} = ThreadPool.get_pool_state(thread_pool)
assert num_threads == available
end
test "checkins" do
num_threads = 4
{:ok, thread_pool} = ThreadPool.new(num_threads)
## Checking in while the pool is at capacity
sleep_interval = 100
spawn(fn ->
ThreadPool.checkin(thread_pool)
:timer.sleep(sleep_interval)
end)
## Give some time for the process to check in, but not to complete
:timer.sleep(div(sleep_interval, 2))
{:ok, %{available: available}} = ThreadPool.get_pool_state(thread_pool)
## No effect on the pool
assert num_threads == available
## Check out all the capacity
Enum.each(1..num_threads, fn _ ->
ThreadPool.checkout(thread_pool)
:timer.sleep(10)
end)
{:ok, %{available: available, queue: queue}} = ThreadPool.get_pool_state(thread_pool)
assert 0 = available
assert 0 = :queue.len(queue)
## This process will wait until first check-in
waiting_process = spawn(fn ->
ThreadPool.checkout(thread_pool)
end)
:timer.sleep(10)
{:ok, %{queue: queue, available: available}} = ThreadPool.get_pool_state(thread_pool)
assert 0 = available
{:value, {process_pid, _ref}} = :queue.peek(queue)
## Process is in the queue
assert waiting_process == process_pid
## Process is alive
assert Process.alive?(waiting_process)
## Now, do a check-in
ThreadPool.checkin(thread_pool)
:timer.sleep(10)
## The process has completed
refute Process.alive?(waiting_process)
## The queue has been cleaned, but there is still no available threads
{:ok, %{queue: queue, available: available}} = ThreadPool.get_pool_state(thread_pool)
assert (0 = available)
assert :queue.len(queue) == 0
## Another check-in to free up one thread
ThreadPool.checkin(thread_pool)
:timer.sleep(10)
{:ok, %{available: available}} = ThreadPool.get_pool_state(thread_pool)
assert 1 = available
end
end
end