Merge pull request 'don't crash on malformed avatar and banner values' (#506) from...
[akkoma] / benchmarks / load_testing / users.ex
index 951b30d917b1eeb0673d9fdf269f1d0ec06f8aa7..0a33cbfdbaf0831d97898dc7af93d013956569d6 100644 (file)
@@ -14,37 +14,38 @@ defmodule Pleroma.LoadTesting.Users do
     friends: 100
   ]
 
-  @max_concurrency 30
+  @max_concurrency 10
 
   @spec generate(keyword()) :: User.t()
   def generate(opts \\ []) do
     opts = Keyword.merge(@defaults, opts)
 
-    IO.puts("Starting generating #{opts[:users]} users...")
-
-    {time, _} = :timer.tc(fn -> generate_users(opts[:users]) end)
-
-    IO.puts("Generating users take #{to_sec(time)} sec.\n")
+    generate_users(opts[:users])
 
     main_user =
       Repo.one(from(u in User, where: u.local == true, order_by: fragment("RANDOM()"), limit: 1))
 
-    IO.puts("Starting making friends for #{opts[:friends]} users...")
-    {time, _} = :timer.tc(fn -> make_friends(main_user, opts[:friends]) end)
+    make_friends(main_user, opts[:friends])
 
-    IO.puts("Making friends take #{to_sec(time)} sec.\n")
-
-    Repo.get(User, main_user.id)
+    User.get_by_id(main_user.id)
   end
 
-  defp generate_users(max) do
-    Task.async_stream(
-      1..max,
-      &generate_user(&1),
-      max_concurrency: @max_concurrency,
-      timeout: 30_000
-    )
-    |> Stream.run()
+  def generate_users(max) do
+    IO.puts("Starting generating #{max} users...")
+
+    {time, users} =
+      :timer.tc(fn ->
+        Task.async_stream(
+          1..max,
+          &generate_user(&1),
+          max_concurrency: @max_concurrency,
+          timeout: 30_000
+        )
+        |> Enum.to_list()
+      end)
+
+    IO.puts("Generating users took #{to_sec(time)} sec.\n")
+    users
   end
 
   defp generate_user(i) do
@@ -54,7 +55,7 @@ defmodule Pleroma.LoadTesting.Users do
       name: "Test ใƒ†ใ‚นใƒˆ User #{i}",
       email: "user#{i}@example.com",
       nickname: "nick#{i}",
-      password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
+      password_hash: Pleroma.Password.Pbkdf2.hash_pwd_salt("test"),
       bio: "Tester Number #{i}",
       local: !remote
     }
@@ -86,23 +87,30 @@ defmodule Pleroma.LoadTesting.Users do
     Map.merge(user, urls)
   end
 
-  defp make_friends(main_user, max) when is_integer(max) do
-    number_of_users =
-      (max / 2)
-      |> Kernel.trunc()
+  def make_friends(main_user, max) when is_integer(max) do
+    IO.puts("Starting making friends for #{max} users...")
 
-    main_user
-    |> get_users(%{limit: number_of_users, local: :local})
-    |> run_stream(main_user)
+    {time, _} =
+      :timer.tc(fn ->
+        number_of_users =
+          (max / 2)
+          |> Kernel.trunc()
 
-    main_user
-    |> get_users(%{limit: number_of_users, local: :external})
-    |> run_stream(main_user)
+        main_user
+        |> get_users(%{limit: number_of_users, local: :local})
+        |> run_stream(main_user)
+
+        main_user
+        |> get_users(%{limit: number_of_users, local: :external})
+        |> run_stream(main_user)
+      end)
+
+    IO.puts("Making friends took #{to_sec(time)} sec.\n")
   end
 
-  defp make_friends(%User{} = main_user, %User{} = user) do
-    {:ok, _} = User.follow(main_user, user)
-    {:ok, _} = User.follow(user, main_user)
+  def make_friends(%User{} = main_user, %User{} = user) do
+    {:ok, _, _} = User.follow(main_user, user)
+    {:ok, _, _} = User.follow(user, main_user)
   end
 
   @spec get_users(User.t(), keyword()) :: [User.t()]
@@ -158,4 +166,24 @@ defmodule Pleroma.LoadTesting.Users do
     )
     |> Stream.run()
   end
+
+  @spec prepare_users(User.t(), keyword()) :: map()
+  def prepare_users(user, opts) do
+    friends_limit = opts[:friends_used]
+    non_friends_limit = opts[:non_friends_used]
+
+    %{
+      user: user,
+      friends_local: fetch_users(user, friends_limit, :local, true),
+      friends_remote: fetch_users(user, friends_limit, :external, true),
+      non_friends_local: fetch_users(user, non_friends_limit, :local, false),
+      non_friends_remote: fetch_users(user, non_friends_limit, :external, false)
+    }
+  end
+
+  defp fetch_users(user, limit, local, friends?) do
+    user
+    |> get_users(limit: limit, local: local, friends?: friends?)
+    |> Enum.shuffle()
+  end
 end