summaryrefslogtreecommitdiff
path: root/lib/load_testing/generator.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/load_testing/generator.ex')
-rw-r--r--lib/load_testing/generator.ex127
1 files changed, 105 insertions, 22 deletions
diff --git a/lib/load_testing/generator.ex b/lib/load_testing/generator.ex
index a9016b9e8..7f50ee68e 100644
--- a/lib/load_testing/generator.ex
+++ b/lib/load_testing/generator.ex
@@ -8,25 +8,15 @@ defmodule Pleroma.LoadTesting.Generator do
end
defp do_generate_users(opts) do
- min = Keyword.get(opts, :users_min, 1)
max = Keyword.get(opts, :users_max)
- query =
- "INSERT INTO \"users\" (\"ap_id\",\"bio\",\"email\",\"follower_address\",\"following\",\"following_address\",\"info\",
- \"local\",\"name\",\"nickname\",\"password_hash\",\"tags\",\"id\",\"inserted_at\",\"updated_at\") VALUES \n"
-
- users =
- Task.async_stream(
- min..max,
- &generate_user_data(&1),
- max_concurrency: 10,
- timeout: 30_000
- )
- |> Enum.reduce("", fn {:ok, data}, acc -> acc <> data <> ", \n" end)
-
- query = query <> String.replace_trailing(users, ", \n", ";")
-
- Ecto.Adapters.SQL.query!(Repo, query)
+ Task.async_stream(
+ 1..max,
+ &generate_user_data(&1),
+ max_concurrency: 10,
+ timeout: 30_000
+ )
+ |> Enum.to_list()
end
defp generate_user_data(i) do
@@ -47,11 +37,7 @@ defmodule Pleroma.LoadTesting.Generator do
following: [User.ap_id(user)]
}
- "('#{user.ap_id}', '#{user.bio}', '#{user.email}', '#{user.follower_address}', '{#{
- user.following
- }}', '#{user.following_address}', '#{Jason.encode!(user.info)}', '#{user.local}', '#{
- user.name
- }', '#{user.nickname}', '#{user.password_hash}', '{#{user.tags}}', uuid_generate_v4(), NOW(), NOW())"
+ Pleroma.Repo.insert!(user)
end
def generate_activities(users, opts) do
@@ -80,4 +66,101 @@ defmodule Pleroma.LoadTesting.Generator do
Pleroma.Web.CommonAPI.post(Enum.random(users), %{"status" => status})
end
+
+ def generate_dms(user, users, opts) do
+ IO.puts("Starting generating #{opts[:dms_max]} DMs")
+ {time, _} = :timer.tc(fn -> do_generate_dms(user, users, opts) end)
+ IO.puts("Inserting dms take #{to_sec(time)} sec.\n")
+ end
+
+ defp do_generate_dms(user, users, opts) do
+ Task.async_stream(
+ 1..opts[:dms_max],
+ fn _ ->
+ do_generate_dm(user, users)
+ end,
+ max_concurrency: 10,
+ timeout: 30_000
+ )
+ |> Stream.run()
+ end
+
+ defp do_generate_dm(user, users) do
+ post = %{
+ "status" => "@#{user.nickname} some direct message",
+ "visibility" => "direct"
+ }
+
+ Pleroma.Web.CommonAPI.post(Enum.random(users), post)
+ end
+
+ def generate_long_thread(user, users, opts) do
+ IO.puts("Starting generating long thread with #{opts[:long_thread_length]} replies")
+ {time, activity} = :timer.tc(fn -> do_generate_long_thread(user, users, opts) end)
+ IO.puts("Inserting long thread replies take #{to_sec(time)} sec.\n")
+ {:ok, activity}
+ end
+
+ defp do_generate_long_thread(user, users, opts) do
+ {:ok, %{id: id} = activity} =
+ Pleroma.Web.CommonAPI.post(user, %{"status" => "Start of long thread"})
+
+ Task.async_stream(
+ 1..opts[:long_thread_length],
+ fn _ -> do_generate_thread(users, id) end,
+ max_concurrency: 10,
+ timeout: 30_000
+ )
+ |> Stream.run()
+
+ activity
+ end
+
+ defp do_generate_thread(users, activity_id) do
+ Pleroma.Web.CommonAPI.post(Enum.random(users), %{
+ "status" => "reply to main post",
+ "in_reply_to_status_id" => activity_id
+ })
+ end
+
+ def generate_private_thread(users, opts) do
+ IO.puts("Starting generating long thread with #{opts[:non_visible_posts_max]} replies")
+ {time, _} = :timer.tc(fn -> do_generate_non_visible_posts(users, opts) end)
+ IO.puts("Inserting long thread replies take #{to_sec(time)} sec.\n")
+ end
+
+ defp do_generate_non_visible_posts(users, opts) do
+ [user1, user2] = Enum.take(users, 2)
+ {:ok, user1} = Pleroma.User.follow(user1, user2)
+ {:ok, user2} = Pleroma.User.follow(user2, user1)
+
+ {:ok, activity} =
+ Pleroma.Web.CommonAPI.post(user1, %{
+ "status" => "Some private post",
+ "visibility" => "private"
+ })
+
+ {:ok, activity_public} =
+ Pleroma.Web.CommonAPI.post(user2, %{
+ "status" => "Some public reply",
+ "in_reply_to_status_id" => activity.id
+ })
+
+ Task.async_stream(
+ 1..opts[:non_visible_posts_max],
+ fn _ -> do_generate_non_visible_post(users, activity_public) end,
+ max_concurrency: 10,
+ timeout: 30_000
+ )
+ end
+
+ defp do_generate_non_visible_post(users, activity) do
+ visibility = Enum.random(["private", "public"])
+
+ Pleroma.Web.CommonAPI.post(Enum.random(users), %{
+ "visibility" => visibility,
+ "status" => "Some #{visibility} reply",
+ "in_reply_to_status_id" => activity.id
+ })
+ end
end