%%% File : ibrowse_functional_tests.erl %%% Authors : Benjamin Lee %%% Brian Richards %%% Description : Functional tests of the ibrowse library using a live test HTTP server %%% Created : 18 November 2014 by Benjamin Lee -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), Diffs = [Count - BalancedNumberOfRequestsPerConnection || {_Pid, Count} <- ibrowse_test_server:get_conn_pipeline_depth()], ?assertEqual(MaxSessions, length(Diffs)), lists:foreach(fun(X) -> ?assertEqual(yep, close_to_zero(X)) end, Diffs). close_to_zero(0) -> yep; close_to_zero(-1) -> yep; close_to_zero(1) -> yep; close_to_zero(X) -> {nope, X}. times(0, _) -> ok; times(X, Fun) -> Fun(), times(X - 1, Fun).