|
@@ -1,2 +1,60 @@
|
|
# erlang_test_2023
|
|
# erlang_test_2023
|
|
|
|
|
|
|
|
+Реалізувати алгоритм обмеження пропускної здатності каналу в рамках Erlang додатку
|
|
|
|
+`token_bucket`.
|
|
|
|
+Для збірки та запуску проекта використовувати `erlang.mk`.
|
|
|
|
+Додаток повинен використовувати `ETS`.
|
|
|
|
+Модуль `token_bucket` повинен експортувати дві функції: `is_limit_reached/1,2`.
|
|
|
|
+Плюсом буде покриття коду тестами (з використанням `CT`).
|
|
|
|
+
|
|
|
|
+**Ціль тестового завдання**: подивитись на стиль та підходи в програмуванні.
|
|
|
|
+
|
|
|
|
+Ручне тестування функціоналу буде виглядати так:
|
|
|
|
+```
|
|
|
|
+$ cd token_bucket
|
|
|
|
+$ make run
|
|
|
|
+1> token_bucket:is_limit_reached(123).
|
|
|
|
+false.
|
|
|
|
+2> [token_bucket:is_limit_reached(123) _ <- lists:seq(1,5)].
|
|
|
|
+[false,false,false,true,true]
|
|
|
|
+3> [token_bucket:is_limit_reached(123, 4) _ <- lists:seq(1,5)].
|
|
|
|
+[false,false,false,false,true]
|
|
|
|
+4> [token_bucket:is_limit_reached(123, infinity) || _ <- lists:seq(1,5)].
|
|
|
|
+[false,false,false,false,false]
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+Запуск тестів:
|
|
|
|
+```
|
|
|
|
+$ cd token_bucket
|
|
|
|
+$ make ct
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+Допишіть логіку в модуль, котрий приведено нижче.
|
|
|
|
+Зверніть увагу, що в тестовому завданні немає вимоги реалізувати очистку кеша в ETS.
|
|
|
|
+Рішення, реалізовувати очистку кеша, чи ні - залишається за Вами.
|
|
|
|
+Однак покриття тестами бажане: чим краще Ви оформите тестове завдання, тим вищою буде оцінка вашого коду.
|
|
|
|
+```
|
|
|
|
+-module(token_bucket).
|
|
|
|
+
|
|
|
|
+-export([
|
|
|
|
+ is_limit_reached/1,
|
|
|
|
+ is_limit_reached/2
|
|
|
|
+]).
|
|
|
|
+
|
|
|
|
+-define(DEFAULT_RPS, 3).
|
|
|
|
+
|
|
|
|
+-type user_id() :: pos_integer().
|
|
|
|
+-type max_rps() :: pos_integer() | infinity.
|
|
|
|
+
|
|
|
|
+-spec is_limit_reached(user_id()) -> boolean().
|
|
|
|
+is_limit_reached(UserId) ->
|
|
|
|
+ is_limit_reached(UserId, ?DEFAULT_RPS).
|
|
|
|
+
|
|
|
|
+-spec is_limit_reached(user_id(), max_rps()) -> boolean().
|
|
|
|
+is_limit_reached(_UserId, _MaxRps) ->
|
|
|
|
+ {error, not_implemented}.
|
|
|
|
+...
|
|
|
|
+```
|
|
|
|
+----
|
|
|
|
+
|
|
|
|
+
|