-module(tests).
-include_lib("eunit/include/eunit.hrl").
-include_lib("server/include/conf.hrl").
-include_lib("server/include/log.hrl").
-include_lib("server/include/kamf.hrl").
-include_lib("server/include/requests.hrl").
-include_lib("server/include/classes.hrl").
-include_lib("server/include/game_okey.hrl").
-export([setup/0, cleanup/1, tests_on/0]).
-define(BT, 3000000).
-define(SIM_TIMEOUT, 300).
%% ===================================================================
%% ===================================================================
%% Tests
%% ===================================================================
%% ===================================================================
stateful_test_() ->
{setup,
fun setup/0,
fun cleanup/1,
?_test(
begin
send_receive_object_t(),
policy_file_plain_t(),
policy_file_t(),
policy_file_complex_t(),
async_server_rpc_test_t(),
encoding_client_failure_t(),
ok
end)
}.
session_attach_test_() ->
{setup,
fun setup/0,
fun cleanup/1,
?_test(
begin
session_attach_fail_t(),
session_attach_ok_t(),
ok
end)
}.
message_read_write_test() ->
A = #game_event{event = <<"game_ended">>, game = 1, args = [{good_shot, true}, {awarded_points, 42}, {reason, <<"out_of_toshes">>}, {results, #'OkeyGameResults'{}}]},
{A, A} = {A, ?AMF:object_to_record(?AMF:record_to_object(A))}.
setup() ->
ok = app_util:start(kakaconfig),
kakaconfig:temp_db(),
meck:new(kakaconfig, [passthrough]),
meck:expect(kakaconfig, get, fun
([debug, is_test], _) -> {ok, true};
(okey_robot_delay, _) -> {ok, 1};
(Key, X) -> meck:passthrough([Key, X])
end),
meck:new(okey_stats, [passthrough]),
meck:expect(okey_stats, add_game, fun(R) -> ?INFO("saving game: ~p", [R]), {1, 1} end),
meck:expect(okey_stats, get_skill, fun(_) -> {ok, 500} end),
meck:expect(okey_stats, get_game_points, fun(_, _) -> {ok, [{game_points, 100},
{finished_with_okey, 5},
{finished_with_8_tashes, 1}]} end),
ok = app_util:start(kaka_id_generator),
ok = app_util:start(kaka_utils),
ok = app_util:start(kaka_auth_server),
ok = app_util:start(kaka_game_session),
ok = app_util:start(kaka_game_manager),
ok = app_util:start(kaka_matchmaking),
ok = app_util:start(kaka_conn).
cleanup(_State) ->
application:stop(kaka_conn),
application:stop(kaka_matchmaking),
application:stop(kaka_game_manager),
application:stop(kaka_game_session),
application:stop(kaka_auth_server),
application:stop(kaka_utils),
application:stop(kaka_id_generator),
meck:unload(kakaconfig),
meck:unload(okey_stats),
db:stop(),
ok.
tests_on() ->
meck:new(kakaconfig, [passthrough]),
meck:expect(kakaconfig, get, fun
([debug, is_test], _) -> {ok, true};
(Key, X) -> meck:passthrough([Key, X])
end).
session_attach_fail_t() ->
Token = "some fake token",
S1 = tc:connect(),
{error, <<"invalid_token">>} = tc:call_rpc(S1, #session_attach{token = Token}).
session_attach_ok_t() ->
Token = "some proper token",
UserId = "mr_customer",
auth_server:store_token(Token, UserId),
S1 = tc:connect(),
Res = tc:call_rpc(S1, #session_attach{token = Token}),
#'PlayerInfo'{id = Id, login = Login} = Res,
true = is_binary(Login),
true = is_binary(Id),
tc:call_rpc(S1, #logout{}).
encoding_client_failure_t() ->
Socket = tc:connect(),
Answer = tc:call_rpc_raw(Socket, 'getobjecttypefromserver_zzz', []),
?INFO("encoding_client_failure_t: ~p", [Answer]),
{error, _Reason} = Answer.
async_server_rpc_test_t() ->
TestClient = spawn_link(fun() -> tc:async_test_client_loop() end),
timer:sleep(100),
[{_, Pid, _, _}] = nsm_conn_app:get_clients(),
Self = self(),
Ref = make_ref(),
spawn(fun() ->
Msg = #slowping{},
<<"slowpong">> = conn_kamf_worker:send_request(Pid, Msg),
Self ! Ref
end),
Message = #fastping{},
<<"fastpong">> = conn_kamf_worker:send_request(Pid, Message),
receive
Ref -> ok
after 5000 -> erlang:error(timeout) end,
TestClient ! exit.
message_embedding_test() ->
A = {object,<<"KamfResponse">>,
[{id,1001},
{result,{object,
<<"PlayerInfo">>,
[{login,"oldman"},
{name,"Ernest"},
{surname,"Hemingway"}]}}]},
Bin = ?AMF:encode(A),
{A, _} = ?AMF:decode(Bin).
kamf_conversion_test() ->
AR = {object,
<<"KamfRequest">>,
[{id,0},
{method,
<<"session_attach">>},
{args,
[{<<"token">>,
"EBAs6dg2Xw6XuCdg8qiPmlBLgYJ6N4Ti0P+oGpWgYz4NW4nBBUzTe/wAuLYtPnjFpsjCExxSpV78fipmsPxcf+NGy+QKIM6rmVJhpnIlKf0bpFNuGaAPjZAWthhGO8nZ0V8UnA=="}]}]},
BR = {object,
<<"KamfRequest">>,
[{id,0},
{method,
<<"session_attach">>},
{args,
[{<<"token">>,
<<"EBAs6dg2Xw6XuCdg8qiPmlBLgYJ6N4Ti0P+oGpWgYz4NW4nBBUzTe/wAuLYtPnjFpsjCExxSpV78fipmsPxcf+NGy+QKIM6rmVJhpnIlKf0bpFNuGaAPjZAWthhGO8nZ0V8UnA==">>}]}]},
kamf:object_to_record(AR),
kamf:object_to_record(BR),
ok.
send_receive_object_t() ->
Socket = tc:connect(),
L = #'some_named_object'{name1 = <<"value1">>, name2 = 2, name3 = 3.0},
R = tc:call_rpc(Socket, #'getobjecttypefromserver'{}),
{L, L} = {L, R},
<<"Hello, guys! Have a nice day :)">> = tc:call_rpc(Socket, #'getstringtypefromserver'{}),
42 = tc:call_rpc(Socket, #'getintegertypefromserver'{}),
[_, {some_number, 42}, _, _] = tc:call_rpc(Socket, #'getmixedtypesfromserver'{}),
tc:close(Socket).
policy_file_t() ->
{ok, Socket} = gen_tcp:connect(localhost, ?LISTEN_PORT, [{active, false}, binary, {packet, 0}]),
ok = gen_tcp:send(Socket, <<"", 0>>),
{ok, Data} = gen_tcp:recv(Socket, 0),
Data = conn_kamf_worker:policy_file_text(),
ok = gen_tcp:send(Socket, <>),
Sock = tc:connect(Socket),
#'some_named_object'{name1 = <<"value1">>, name2 = 2, name3 = 3.0} =
tc:call_rpc(Sock, #'getobjecttypefromserver'{}),
ok = tc:close(Sock).
policy_file_complex_t() ->
{ok, Socket} = gen_tcp:connect(localhost, ?LISTEN_PORT, [{active, false}, binary, {packet, 0}]),
ok = gen_tcp:send(Socket, <<"", 0, ?KAMF_MAGIC:48>>),
{ok, Data} = gen_tcp:recv(Socket, 0),
Data = conn_kamf_worker:policy_file_text(),
Sock = tc:connect(Socket),
#'some_named_object'{name1 = <<"value1">>, name2 = 2, name3 = 3.0} =
tc:call_rpc(Sock, #'getobjecttypefromserver'{}),
ok = tc:close(Sock).
policy_file_plain_t() ->
{ok, Socket} = gen_tcp:connect(localhost, ?LISTEN_PORT, [{active, false}, binary, {packet, 0}]),
ok = gen_tcp:send(Socket, <<"", 0>>),
{ok, Data} = gen_tcp:recv(Socket, 0),
Data = conn_kamf_worker:policy_file_text(),
ok = gen_tcp:close(Socket).