@@ -3,6 +3,12 @@ defmodule Realtime.UsersCounterTest do
33 alias Realtime.UsersCounter
44 alias Realtime.Rpc
55
6+ setup_all do
7+ tenant_id = random_string ( )
8+ { nodes , count } = generate_load ( tenant_id )
9+ % { tenant_id: tenant_id , count: count , nodes: nodes }
10+ end
11+
612 describe "add/1" do
713 test "starts counter for tenant" do
814 assert UsersCounter . add ( self ( ) , random_string ( ) ) == :ok
@@ -14,61 +20,88 @@ defmodule Realtime.UsersCounterTest do
1420 def ping ( ) ,
1521 do:
1622 spawn ( fn ->
17- Process . sleep ( 3000 )
23+ Process . sleep ( 15000 )
1824 :pong
1925 end )
2026 end
2127 end )
2228
2329 Code . eval_quoted ( @ aux_mod )
2430
31+ describe "tenant_counts/0" do
32+ test "map of tenant and number of users" , % { tenant_id: tenant_id , count: expected } do
33+ assert UsersCounter . add ( self ( ) , tenant_id ) == :ok
34+ Process . sleep ( 1000 )
35+ counts = UsersCounter . tenant_counts ( )
36+ assert counts [ tenant_id ] == expected + 1
37+
38+ assert map_size ( counts ) >= 41
39+ end
40+ end
41+
42+ describe "tenant_counts/1" do
43+ test "map of tenant and number of users for a node only" , % { tenant_id: tenant_id , nodes: nodes } do
44+ assert UsersCounter . add ( self ( ) , tenant_id ) == :ok
45+ Process . sleep ( 1000 )
46+ my_counts = UsersCounter . tenant_counts ( Node . self ( ) )
47+ # Only one connection from this test process on this node
48+ assert my_counts == % { tenant_id => 1 }
49+
50+ another_node_counts = UsersCounter . tenant_counts ( hd ( nodes ) )
51+ assert another_node_counts [ tenant_id ] == 2
52+
53+ assert map_size ( another_node_counts ) == 21
54+ end
55+ end
56+
2557 describe "tenant_users/1" do
26- test "returns count of connected clients for tenant on cluster node" do
27- tenant_id = random_string ( )
28- expected = generate_load ( tenant_id )
58+ test "returns count of connected clients for tenant on cluster node" , % { tenant_id: tenant_id , count: expected } do
2959 Process . sleep ( 1000 )
3060 assert UsersCounter . tenant_users ( tenant_id ) == expected
3161 end
3262 end
3363
3464 describe "tenant_users/2" do
35- test "returns count of connected clients for tenant on target cluster" do
36- tenant_id = random_string ( )
37- generate_load ( tenant_id )
65+ test "returns count of connected clients for tenant on target cluster" , % { tenant_id: tenant_id } do
3866 { :ok , node } = Clustered . start ( @ aux_mod )
3967 pid = Rpc . call ( node , Aux , :ping , [ ] )
4068 UsersCounter . add ( pid , tenant_id )
4169 assert UsersCounter . tenant_users ( node , tenant_id ) == 1
4270 end
4371 end
4472
45- defp generate_load ( tenant_id , nodes \\ 2 , processes \\ 2 ) do
46- for i <- 1 .. nodes do
47- # Avoid port collision
48- extra_config = [
49- { :gen_rpc , :tcp_server_port , 15970 + i }
50- ]
51-
52- { :ok , node } = Clustered . start ( @ aux_mod , extra_config: extra_config , phoenix_port: 4012 + i )
53-
54- for _ <- 1 .. processes do
55- pid = Rpc . call ( node , Aux , :ping , [ ] )
56-
57- for _ <- 1 .. 10 do
58- # replicate same pid added multiple times concurrently
59- Task . start ( fn ->
60- UsersCounter . add ( pid , tenant_id )
61- end )
62-
63- # noisy neighbors to test handling of bigger loads on concurrent calls
64- Task . start ( fn ->
65- pid = Rpc . call ( node , Aux , :ping , [ ] )
66- UsersCounter . add ( pid , random_string ( ) )
67- end )
73+ defp generate_load ( tenant_id , n_nodes \\ 2 , processes \\ 2 ) do
74+ nodes =
75+ for i <- 1 .. n_nodes do
76+ # Avoid port collision
77+ extra_config = [
78+ { :gen_rpc , :tcp_server_port , 15970 + i }
79+ ]
80+
81+ { :ok , node } = Clustered . start ( @ aux_mod , extra_config: extra_config , phoenix_port: 4012 + i )
82+
83+ for _ <- 1 .. processes do
84+ pid = Rpc . call ( node , Aux , :ping , [ ] )
85+
86+ for _ <- 1 .. 10 do
87+ # replicate same pid added multiple times concurrently
88+ Task . start ( fn ->
89+ UsersCounter . add ( pid , tenant_id )
90+ Process . sleep ( 10000 )
91+ end )
92+
93+ # noisy neighbors to test handling of bigger loads on concurrent calls
94+ Task . start ( fn ->
95+ pid = Rpc . call ( node , Aux , :ping , [ ] )
96+ UsersCounter . add ( pid , random_string ( ) )
97+ Process . sleep ( 10000 )
98+ end )
99+ end
68100 end
101+
102+ node
69103 end
70- end
71104
72- nodes * processes
105+ { nodes , n_nodes * processes }
73106 end
74107end
0 commit comments