summaryrefslogtreecommitdiff
path: root/lib/load_testing/generator.ex
blob: a9016b9e86eaf7a758dcada39c3db0d34b01c246 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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