| %%% File : ibrowse_functional_tests.erl |
| %%% Authors : Benjamin Lee <yardspoon@gmail.com> |
| %%% Brian Richards <bmrichards16@gmail.com> |
| %%% Description : Functional tests of the ibrowse library using a live test HTTP server |
| %%% Created : 18 November 2014 by Benjamin Lee <yardspoon@gmail.com> |
| |
| -module(ibrowse_functional_tests). |
| |
| -include_lib("eunit/include/eunit.hrl"). |
| -define(PER_TEST_TIMEOUT_SEC, 60). |
| -define(TIMEDTEST(Desc, Fun), {Desc, {timeout, ?PER_TEST_TIMEOUT_SEC, fun Fun/0}}). |
| |
| -define(SERVER_PORT, 8181). |
| -define(BASE_URL, "http://localhost:" ++ integer_to_list(?SERVER_PORT)). |
| |
| setup() -> |
| application:start(crypto), |
| application:start(public_key), |
| application:start(ssl), |
| ibrowse_test_server:start_server(?SERVER_PORT, tcp), |
| ibrowse:start(), |
| ok. |
| |
| teardown(_) -> |
| ibrowse:stop(), |
| ibrowse_test_server:stop_server(?SERVER_PORT), |
| ok. |
| |
| running_server_fixture_test_() -> |
| {foreach, |
| fun setup/0, |
| fun teardown/1, |
| [ |
| ?TIMEDTEST("Simple request can be honored", simple_request), |
| ?TIMEDTEST("Slow server causes timeout", slow_server_timeout), |
| ?TIMEDTEST("Requests are balanced over connections", balanced_connections) |
| ] |
| }. |
| |
| simple_request() -> |
| ?assertMatch({ok, "200", _, _}, ibrowse:send_req(?BASE_URL, [], get, [], [])). |
| |
| slow_server_timeout() -> |
| ?assertMatch({error, req_timedout}, ibrowse:send_req(?BASE_URL ++ "/never_respond", [], get, [], [], 5000)). |
| |
| balanced_connections() -> |
| MaxSessions = 4, |
| MaxPipeline = 100, |
| RequestsSent = 80, |
| BalancedNumberOfRequestsPerConnection = 20, |
| |
| ?assertEqual([], ibrowse_test_server:get_conn_pipeline_depth()), |
| |
| Fun = fun() -> ibrowse:send_req(?BASE_URL ++ "/never_respond", [], get, [], [{max_sessions, MaxSessions}, {max_pipeline_size, MaxPipeline}], 30000) end, |
| times(RequestsSent, fun() -> spawn_link(Fun) end), |
| |
| timer:sleep(1000), |
| |
| Counts = [Count || {_Pid, Count} <- ibrowse_test_server:get_conn_pipeline_depth()], |
| ?assertEqual(MaxSessions, length(Counts)), |
| |
| ?assertEqual(lists:duplicate(MaxSessions, BalancedNumberOfRequestsPerConnection), Counts). |
| |
| times(0, _) -> |
| ok; |
| times(X, Fun) -> |
| Fun(), |
| times(X - 1, Fun). |