summaryrefslogtreecommitdiff
path: root/lib/load_testing/generator.ex
diff options
context:
space:
mode:
authorAlex S <alex.strizhakov@gmail.com>2019-08-02 21:33:12 +0300
committerAlex S <alex.strizhakov@gmail.com>2019-09-05 16:02:20 +0300
commitdb690bede92e9ba65b1afaa8605aa5ddb3c992a4 (patch)
treedb31e5bd2ca8ed48d542355e60629fdc2efa5696 /lib/load_testing/generator.ex
parentfe7cf44c405ae2872d8d978f566bbb8e6fba0480 (diff)
downloadpleroma-db690bede92e9ba65b1afaa8605aa5ddb3c992a4.tar.gz
pleroma-db690bede92e9ba65b1afaa8605aa5ddb3c992a4.zip
temp commit
Diffstat (limited to 'lib/load_testing/generator.ex')
-rw-r--r--lib/load_testing/generator.ex83
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/load_testing/generator.ex b/lib/load_testing/generator.ex
new file mode 100644
index 000000000..a9016b9e8
--- /dev/null
+++ b/lib/load_testing/generator.ex
@@ -0,0 +1,83 @@
+defmodule Pleroma.LoadTesting.Generator do
+ use Pleroma.LoadTesting.Helper
+
+ def generate_users(opts) do
+ IO.puts("Starting generating #{opts[:users_max]} users...")
+ {time, _} = :timer.tc(fn -> do_generate_users(opts) end)
+ IO.puts("Inserting users take #{to_sec(time)} sec.\n")
+ 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)
+ end
+
+ defp generate_user_data(i) do
+ user = %User{
+ name: "Test ใƒ†ใ‚นใƒˆ User #{i}",
+ email: "user#{i}@example.com",
+ nickname: "nick#{i}",
+ password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
+ bio: "Tester Number #{i}",
+ info: %{}
+ }
+
+ user = %{
+ user
+ | ap_id: User.ap_id(user),
+ follower_address: User.ap_followers(user),
+ following_address: User.ap_following(user),
+ 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())"
+ end
+
+ def generate_activities(users, opts) do
+ IO.puts("Starting generating #{opts[:activities_max]} activities...")
+ {time, _} = :timer.tc(fn -> do_generate_activities(users, opts) end)
+ IO.puts("Inserting activities take #{to_sec(time)} sec.\n")
+ end
+
+ defp do_generate_activities(users, opts) do
+ Task.async_stream(
+ 1..opts[:activities_max],
+ fn _ ->
+ do_generate_activity(users, opts)
+ end,
+ max_concurrency: 10,
+ timeout: 30_000
+ )
+ |> Stream.run()
+ end
+
+ defp do_generate_activity(users, opts) do
+ status =
+ if opts[:mention],
+ do: "some status with @#{opts[:mention].nickname}",
+ else: "some status"
+
+ Pleroma.Web.CommonAPI.post(Enum.random(users), %{"status" => status})
+ end
+end