blob: 81ee9d60db8ee1d51d2be57df1c0c9408c054909 [file] [log] [blame]
-module(smoosh_tests).
-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch/include/couch_db.hrl").
-define(KILOBYTE, binary:copy(<<"x">>, 1024)).
%% ==========
%% Setup
%% ----------
setup(ChannelType) ->
DbName = ?tempdb(),
{ok, Db} = couch_db:create(DbName, [?ADMIN_CTX]),
couch_db:close(Db),
{ok, ChannelPid} = smoosh_server:get_channel(ChannelType),
smoosh_channel:flush(ChannelPid),
ok = config:set(config_section(ChannelType), "min_size", "200000", false),
DbName.
teardown(ChannelType, DbName) ->
ok = couch_server:delete(DbName, [?ADMIN_CTX]),
ok = config:delete(config_section(DbName), "min_size", false),
{ok, ChannelPid} = smoosh_server:get_channel(ChannelType),
smoosh_channel:flush(ChannelPid),
ok.
config_section(ChannelType) ->
"smoosh." ++ ChannelType.
%% ==========
%% Tests
%% ----------
smoosh_test_() ->
{
"Testing smoosh",
{
setup,
fun() -> test_util:start_couch([smoosh]) end,
fun test_util:stop/1,
[
channels_tests(),
persistence_tests()
]
}
}.
persistence_tests() ->
Tests = [
fun should_persist_queue/2
],
{
"Should persist queue state",
[
make_test_case("ratio_dbs", Tests)
]
}.
channels_tests() ->
Tests = [
fun should_enqueue/2
],
{
"Various channels tests",
[
make_test_case("ratio_dbs", Tests)
]
}.
make_test_case(Type, Funs) ->
{foreachx, fun setup/1, fun teardown/2, [{Type, Fun} || Fun <- Funs]}.
should_enqueue(ChannelType, DbName) ->
{timeout, 20, ?_test(begin
ok = grow_db_file(DbName, 300),
ok = wait_enqueue(ChannelType, DbName),
?assert(is_enqueued(ChannelType, DbName)),
ok
end)}.
should_persist_queue(ChannelType, DbName) ->
{timeout, 20, ?_test(begin
{ok, ChannelPid} = smoosh_server:get_channel(ChannelType),
ok = grow_db_file(DbName, 300),
ok = wait_enqueue(ChannelType, DbName),
ok = smoosh_channel:persist(ChannelPid),
Q0 = channel_queue(ChannelType),
ok = application:stop(smoosh),
ok = application:start(smoosh),
Q1 = channel_queue(ChannelType),
?assertEqual(Q0, Q1),
ok
end)}.
grow_db_file(DbName, SizeInKb) ->
{ok, Db} = couch_db:open_int(DbName, [?ADMIN_CTX]),
FilePath = couch_db:get_filepath(Db),
{ok, Fd} = file:open(FilePath, [append]),
Bytes = binary:copy(?KILOBYTE, SizeInKb),
file:write(Fd, Bytes),
ok = file:close(Fd),
Doc = couch_doc:from_json_obj(
{[
{<<"_id">>, ?l2b(?docid())},
{<<"value">>, ?l2b(?docid())}
]}
),
{ok, _} = couch_db:update_docs(Db, [Doc], []),
couch_db:close(Db),
ok.
is_enqueued(ChannelType, DbName) ->
{ok, ChannelPid} = smoosh_server:get_channel(ChannelType),
smoosh_channel:is_key(ChannelPid, DbName).
wait_enqueue(ChannelType, DbName) ->
test_util:wait(fun() ->
case is_enqueued(ChannelType, DbName) of
false ->
wait;
true ->
ok
end
end, 20000).
channel_queue(ChannelType) ->
Q0 = smoosh_priority_queue:new(ChannelType),
smoosh_priority_queue:recover(Q0).