% coding: utf-8
+% Copyright 2008 Grégory Burri
+%
+% This file is part of Euphorik.
+%
+% Euphorik is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Euphorik is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Euphorik. If not, see <http://www.gnu.org/licenses/>.
+%
% Module de test de euphorik.
% Crée un certain nombre d'utilisateur et post des messages aléatoire.
-module(euphorik_test).
--compile(export_all).
-
+-export([
+ start/2,
+ stop/1,
+ bench_get_messages/0,
+ bench_get_messages_avec_2_conversations/0
+]).
-include("../include/euphorik_bd.hrl").
% N est le nombre d'utilisateur
-start(N) ->
+% M est le nombre de message que chaque utilisateur va poster
+start(N, M) ->
Ids = creer_users(N),
lists:map(
fun(Id) ->
fun() ->
{A1, A2, A3} = now(),
random:seed(A1, A2, A3),
- loop(Id)
+ loop(Id, M)
end
)
end,
stop(Pids) ->
lists:foreach(fun(Pid) -> exit(Pid, kill) end, Pids).
+
+bench_get_messages() ->
+ T = [
+ {page,"chat"},
+ {cookie,"5G84A5CJXMCPEHNI8T5A9"},
+ {message_count,40},
+ {last_message_id,0},
+ {main_page,1},
+ {troll_id,0},
+ {conversations,{array,[]}}
+ ],
+ moyenne_temps(euphorik_protocole, wait_event, [T], 20).
+
+
+bench_get_messages_avec_2_conversations() ->
+ T = [
+ {page,"chat"},
+ {cookie,"5G84A5CJXMCPEHNI8T5A9"},
+ {message_count,40},
+ {last_message_id,0},
+ {main_page,1},
+ {troll_id,0},
+ {conversations,{array, [
+ {struct, [
+ {root, 921},
+ {page,1},
+ {last_message_id,0}
+ ]},
+ {struct, [
+ {root, 772},
+ {page, 1},
+ {last_message_id, 0}
+ ]}
+ ]}}
+ ],
+ moyenne_temps(euphorik_protocole, wait_event, [T], 20).
+
+
+moyenne_temps(Module, Fun, Args, N) ->
+ moyenne_temps(Module, Fun, Args, N, N, 0).
+moyenne_temps(_, _, _, 0, Total, Temps_acc) ->
+ Temps_acc / Total;
+moyenne_temps(Module, Fun, Args, N, Total, Temps_acc) ->
+ {Temps, _} = timer:tc(Module, Fun, Args),
+ moyenne_temps(Module, Fun, Args, N - 1, Total, Temps_acc + Temps).
+
% Crée N user avec des noms aléatoires et renvoie la liste des id.
creer_users(N) ->
creer_users(N, []).
creer_users(0, Ids) -> lists:map(fun(#user{id = Id}) -> Id end, Ids);
creer_users(N, Ids) ->
- creer_users(N - 1, [euphorik_bd:nouveau_user(mot_rand(random:uniform(4) + 4), "", "") | Ids ]).
+ creer_users(N - 1, [euphorik_bd:nouveau_user(mot_rand(random:uniform(4) + 4), "", "", #profile{}) | Ids ]).
% crée un message aléatoire et le renvoie
% Tire au hasard de 0 à 3 messages sur les 10 derniers postés, renvoie une liste de int()
% répartition :
-% 0 : 0.5
-% 1 : 0.3
+% 0 : 0.1
+% 1 : 0.7
% 2 : 0.15
% 3 : 0.05
messages_id_rand() ->
- Messages = lists:map(fun(#minichat{id = Id}) -> Id end, euphorik_bd:messages(30)),
R = random:uniform(),
- if R =< 0.5 -> [];
- R > 0.5 andalso R =< 0.8 ->
- tire_element_rand(1, Messages);
- R > 0.8 andalso R =< 0.95 ->
- tire_element_rand(2, Messages);
+ if R =< 0.1 ->
+ [];
true ->
- tire_element_rand(3, Messages)
+ Messages = lists:map(fun(#minichat{id = Id}) -> Id end, euphorik_bd:messages(8)),
+ if
+ R > 0.1 andalso R =< 0.8 ->
+ tire_element_rand(1, Messages);
+ R > 0.8 andalso R =< 0.95 ->
+ tire_element_rand(2, Messages);
+ true ->
+ tire_element_rand(3, Messages)
+ end
end.
% tire N element distinct parmis la liste L proposée
tire_element_rand(N, L) when N =< length(L) ->
- tire_element_rand(N, L, []).
+ tire_element_rand(N, L, []);
+tire_element_rand(_, _) ->
+ [].
tire_element_rand(0, _, Elements) -> Elements;
tire_element_rand(N, L, Elements) ->
E = lists:nth(random:uniform(length(L)), L),
tire_element_rand(N-1, L, [E | Elements])
end.
-
-loop(User_id) ->
+loop(User_id, 0) ->
+ io:format("~p a fini~n", [User_id]);
+loop(User_id, M) ->
% attend un temp aléatoire compris entre 1 sec et 5 sec
timer:sleep(1000 * random:uniform(5)),
% poste un message aléatoire par une personne aléatoire répondant à des messages aléatoires
{Message, Repond_a} = {message_rand(), messages_id_rand()},
io:format("~p poste ~p et repond a ~w~n", [User_id, Message, Repond_a]),
- euphorik_bd:nouveau_message(Message, User_id, Repond_a),
- loop(User_id).
+ case euphorik_bd:nouveau_message(Message, User_id, Repond_a) of
+ {erreur, E} ->
+ io:format("~p : erreur : ~p~n", [User_id, E]),
+ loop(User_id, M);
+ _ ->
+ loop(User_id, M - 1)
+ end.
+
\ No newline at end of file