tests.erl 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. -module(tests).
  2. -include_lib("eunit/include/eunit.hrl").
  3. -include_lib("server/include/conf.hrl").
  4. -include_lib("server/include/log.hrl").
  5. -include_lib("server/include/kamf.hrl").
  6. -include_lib("server/include/requests.hrl").
  7. -include_lib("server/include/classes.hrl").
  8. -include_lib("server/include/game_okey.hrl").
  9. -export([setup/0, cleanup/1, tests_on/0]).
  10. -define(BT, 3000000).
  11. -define(SIM_TIMEOUT, 300).
  12. %% ===================================================================
  13. %% ===================================================================
  14. %% Tests
  15. %% ===================================================================
  16. %% ===================================================================
  17. stateful_test_() ->
  18. {setup,
  19. fun setup/0,
  20. fun cleanup/1,
  21. ?_test(
  22. begin
  23. send_receive_object_t(),
  24. policy_file_plain_t(),
  25. policy_file_t(),
  26. policy_file_complex_t(),
  27. async_server_rpc_test_t(),
  28. encoding_client_failure_t(),
  29. ok
  30. end)
  31. }.
  32. session_attach_test_() ->
  33. {setup,
  34. fun setup/0,
  35. fun cleanup/1,
  36. ?_test(
  37. begin
  38. session_attach_fail_t(),
  39. session_attach_ok_t(),
  40. ok
  41. end)
  42. }.
  43. message_read_write_test() ->
  44. A = #game_event{event = <<"game_ended">>, game = 1, args = [{good_shot, true}, {awarded_points, 42}, {reason, <<"out_of_toshes">>}, {results, #'OkeyGameResults'{}}]},
  45. {A, A} = {A, ?AMF:object_to_record(?AMF:record_to_object(A))}.
  46. setup() ->
  47. ok = app_util:start(kakaconfig),
  48. kakaconfig:temp_db(),
  49. meck:new(kakaconfig, [passthrough]),
  50. meck:expect(kakaconfig, get, fun
  51. ([debug, is_test], _) -> {ok, true};
  52. (okey_robot_delay, _) -> {ok, 1};
  53. (Key, X) -> meck:passthrough([Key, X])
  54. end),
  55. meck:new(okey_stats, [passthrough]),
  56. meck:expect(okey_stats, add_game, fun(R) -> ?INFO("saving game: ~p", [R]), {1, 1} end),
  57. meck:expect(okey_stats, get_skill, fun(_) -> {ok, 500} end),
  58. meck:expect(okey_stats, get_game_points, fun(_, _) -> {ok, [{game_points, 100},
  59. {finished_with_okey, 5},
  60. {finished_with_8_tashes, 1}]} end),
  61. ok = app_util:start(kaka_id_generator),
  62. ok = app_util:start(kaka_utils),
  63. ok = app_util:start(kaka_auth_server),
  64. ok = app_util:start(kaka_game_session),
  65. ok = app_util:start(kaka_game_manager),
  66. ok = app_util:start(kaka_matchmaking),
  67. ok = app_util:start(kaka_conn).
  68. cleanup(_State) ->
  69. application:stop(kaka_conn),
  70. application:stop(kaka_matchmaking),
  71. application:stop(kaka_game_manager),
  72. application:stop(kaka_game_session),
  73. application:stop(kaka_auth_server),
  74. application:stop(kaka_utils),
  75. application:stop(kaka_id_generator),
  76. meck:unload(kakaconfig),
  77. meck:unload(okey_stats),
  78. db:stop(),
  79. ok.
  80. tests_on() ->
  81. meck:new(kakaconfig, [passthrough]),
  82. meck:expect(kakaconfig, get, fun
  83. ([debug, is_test], _) -> {ok, true};
  84. (Key, X) -> meck:passthrough([Key, X])
  85. end).
  86. session_attach_fail_t() ->
  87. Token = "some fake token",
  88. S1 = tc:connect(),
  89. {error, <<"invalid_token">>} = tc:call_rpc(S1, #session_attach{token = Token}).
  90. session_attach_ok_t() ->
  91. Token = "some proper token",
  92. UserId = "mr_customer",
  93. auth_server:store_token(Token, UserId),
  94. S1 = tc:connect(),
  95. Res = tc:call_rpc(S1, #session_attach{token = Token}),
  96. #'PlayerInfo'{id = Id, login = Login} = Res,
  97. true = is_binary(Login),
  98. true = is_binary(Id),
  99. tc:call_rpc(S1, #logout{}).
  100. encoding_client_failure_t() ->
  101. Socket = tc:connect(),
  102. Answer = tc:call_rpc_raw(Socket, 'getobjecttypefromserver_zzz', []),
  103. ?INFO("encoding_client_failure_t: ~p", [Answer]),
  104. {error, _Reason} = Answer.
  105. async_server_rpc_test_t() ->
  106. TestClient = spawn_link(fun() -> tc:async_test_client_loop() end),
  107. timer:sleep(100),
  108. [{_, Pid, _, _}] = nsm_conn_app:get_clients(),
  109. Self = self(),
  110. Ref = make_ref(),
  111. spawn(fun() ->
  112. Msg = #slowping{},
  113. <<"slowpong">> = conn_kamf_worker:send_request(Pid, Msg),
  114. Self ! Ref
  115. end),
  116. Message = #fastping{},
  117. <<"fastpong">> = conn_kamf_worker:send_request(Pid, Message),
  118. receive
  119. Ref -> ok
  120. after 5000 -> erlang:error(timeout) end,
  121. TestClient ! exit.
  122. message_embedding_test() ->
  123. A = {object,<<"KamfResponse">>,
  124. [{id,1001},
  125. {result,{object,
  126. <<"PlayerInfo">>,
  127. [{login,"oldman"},
  128. {name,"Ernest"},
  129. {surname,"Hemingway"}]}}]},
  130. Bin = ?AMF:encode(A),
  131. {A, _} = ?AMF:decode(Bin).
  132. kamf_conversion_test() ->
  133. AR = {object,
  134. <<"KamfRequest">>,
  135. [{id,0},
  136. {method,
  137. <<"session_attach">>},
  138. {args,
  139. [{<<"token">>,
  140. "EBAs6dg2Xw6XuCdg8qiPmlBLgYJ6N4Ti0P+oGpWgYz4NW4nBBUzTe/wAuLYtPnjFpsjCExxSpV78fipmsPxcf+NGy+QKIM6rmVJhpnIlKf0bpFNuGaAPjZAWthhGO8nZ0V8UnA=="}]}]},
  141. BR = {object,
  142. <<"KamfRequest">>,
  143. [{id,0},
  144. {method,
  145. <<"session_attach">>},
  146. {args,
  147. [{<<"token">>,
  148. <<"EBAs6dg2Xw6XuCdg8qiPmlBLgYJ6N4Ti0P+oGpWgYz4NW4nBBUzTe/wAuLYtPnjFpsjCExxSpV78fipmsPxcf+NGy+QKIM6rmVJhpnIlKf0bpFNuGaAPjZAWthhGO8nZ0V8UnA==">>}]}]},
  149. kamf:object_to_record(AR),
  150. kamf:object_to_record(BR),
  151. ok.
  152. send_receive_object_t() ->
  153. Socket = tc:connect(),
  154. L = #'some_named_object'{name1 = <<"value1">>, name2 = 2, name3 = 3.0},
  155. R = tc:call_rpc(Socket, #'getobjecttypefromserver'{}),
  156. {L, L} = {L, R},
  157. <<"Hello, guys! Have a nice day :)">> = tc:call_rpc(Socket, #'getstringtypefromserver'{}),
  158. 42 = tc:call_rpc(Socket, #'getintegertypefromserver'{}),
  159. [_, {some_number, 42}, _, _] = tc:call_rpc(Socket, #'getmixedtypesfromserver'{}),
  160. tc:close(Socket).
  161. policy_file_t() ->
  162. {ok, Socket} = gen_tcp:connect(localhost, ?LISTEN_PORT, [{active, false}, binary, {packet, 0}]),
  163. ok = gen_tcp:send(Socket, <<"<policy-file-request/>", 0>>),
  164. {ok, Data} = gen_tcp:recv(Socket, 0),
  165. Data = conn_kamf_worker:policy_file_text(),
  166. ok = gen_tcp:send(Socket, <<?KAMF_MAGIC:48>>),
  167. Sock = tc:connect(Socket),
  168. #'some_named_object'{name1 = <<"value1">>, name2 = 2, name3 = 3.0} =
  169. tc:call_rpc(Sock, #'getobjecttypefromserver'{}),
  170. ok = tc:close(Sock).
  171. policy_file_complex_t() ->
  172. {ok, Socket} = gen_tcp:connect(localhost, ?LISTEN_PORT, [{active, false}, binary, {packet, 0}]),
  173. ok = gen_tcp:send(Socket, <<"<policy-file-request/>", 0, ?KAMF_MAGIC:48>>),
  174. {ok, Data} = gen_tcp:recv(Socket, 0),
  175. Data = conn_kamf_worker:policy_file_text(),
  176. Sock = tc:connect(Socket),
  177. #'some_named_object'{name1 = <<"value1">>, name2 = 2, name3 = 3.0} =
  178. tc:call_rpc(Sock, #'getobjecttypefromserver'{}),
  179. ok = tc:close(Sock).
  180. policy_file_plain_t() ->
  181. {ok, Socket} = gen_tcp:connect(localhost, ?LISTEN_PORT, [{active, false}, binary, {packet, 0}]),
  182. ok = gen_tcp:send(Socket, <<"<policy-file-request/>", 0>>),
  183. {ok, Data} = gen_tcp:recv(Socket, 0),
  184. Data = conn_kamf_worker:policy_file_text(),
  185. ok = gen_tcp:close(Socket).