Code.require_file "test_helper.exs", __DIR__ defmodule PerformanceTest do use ExUnit.Case require Logger import ExqTestUtil setup do TestRedis.setup on_exit fn -> TestRedis.teardown end :ok end defmodule Worker do def perform(arg) do if arg == "last" do Logger.info("Last message detected") send(:tester, :done) end end end def wait_until(f, sleep_time) do unless f do :timer.sleep(sleep_time) wait_until(f, sleep_time) end end test "test to_job_json performance" do started = :os.timestamp max_timeout_ms = 1_000 for _ <- 1..1000, do: Exq.Redis.JobQueue.to_job_json("default", PerformanceTest.Worker, ["keep_on_trucking"]) elapsed_ms = :timer.now_diff(:os.timestamp, started) / 1_000 Logger.debug "to_job_json performance test took #{elapsed_ms / 1_000} secs" assert elapsed_ms < max_timeout_ms end test "performance is in acceptable range" do Process.register(self(), :tester) started = :os.timestamp max_timeout_ms = 5 * 1_000 {:ok, sup} = Exq.start for _ <- 1..1000, do: Exq.enqueue(Exq, "default", PerformanceTest.Worker, ["keep_on_trucking"]) Exq.enqueue(Exq, "default", PerformanceTest.Worker, ["last"]) # Wait for last message receive do :done -> Logger.info("Received done") after # This won't count enqueue max_timeout_ms -> assert false, "Timeout of #{max_timeout_ms} reached for performance test" end elapsed_ms = :timer.now_diff(:os.timestamp, started) / 1_000 Logger.debug "Perf test took #{elapsed_ms / 1_000} secs" count = Exq.Redis.Connection.llen!(:testredis, "test:queue:default") assert count == 0 assert elapsed_ms < max_timeout_ms # let stats finish wait_long stop_process(sup) end test "stats performance is in acceptable range" do Tzdata.EtsHolder.start_link Exq.Enqueuer.start_link(name: ExqE) #{:ok, time} = Timex.DateFormat.parse("2016-01-07T13:30:00+00", "{ISO}") started = :os.timestamp for _ <- 1..1000 do {:ok, time} = Timex.DateFormat.parse("2016-01-07T13:30:00+00", "{ISO}") Exq.Redis.JobStat.record_processed(:testredis, "test", nil, time) end {:ok, failures, successes} = Exq.Api.realtime_stats(ExqE) elapsed_ms = :timer.now_diff(:os.timestamp, started) / 1_000 Logger.debug "Exq Perf test took #{elapsed_ms / 1_000} secs" assert List.keysort(successes, 0) == [{"2016-01-07 13:30:00 +0000", "1000"}] end end