summaryrefslogtreecommitdiff
path: root/test/concurrent_limiter_test.exs
diff options
context:
space:
mode:
Diffstat (limited to 'test/concurrent_limiter_test.exs')
-rw-r--r--test/concurrent_limiter_test.exs42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/concurrent_limiter_test.exs b/test/concurrent_limiter_test.exs
new file mode 100644
index 0000000..e1d281e
--- /dev/null
+++ b/test/concurrent_limiter_test.exs
@@ -0,0 +1,42 @@
+defmodule ConcurrentLimiterTest do
+ use ExUnit.Case
+ doctest ConcurrentLimiter
+
+ test "limiter ets is atomic" do
+ name = "test1"
+ ConcurrentLimiter.new(name, 2, 2)
+ atomic_test(name)
+ end
+
+ test "limiter atomics is atomic" do
+ name = "test2"
+ ConcurrentLimiter.new(name, 2, 2, backend: :atomics)
+ atomic_test(name)
+ end
+
+ defp atomic_test(name) do
+ self = self()
+
+ sleepy = fn sleep ->
+ case ConcurrentLimiter.limit(name, fn ->
+ send(self, :ok)
+ Process.sleep(sleep)
+ :ok
+ end) do
+ :ok -> :ok
+ other -> send(self, other)
+ end
+ end
+
+ spawn_link(fn -> sleepy.(500) end)
+ spawn_link(fn -> sleepy.(500) end)
+ spawn_link(fn -> sleepy.(500) end)
+ spawn_link(fn -> sleepy.(500) end)
+ spawn_link(fn -> sleepy.(500) end)
+ assert_receive :ok, 2000
+ assert_receive :ok, 2000
+ assert_receive {:error, :overload}, 2000
+ assert_receive :ok, 2000
+ assert_receive :ok, 2000
+ end
+end