blob: 15598358f0f0f8e70888e07608c5725343cc8927 [file] [log] [blame]
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.
-module(couch_lru_tests).
-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch/include/couch_db.hrl").
setup() ->
ok = meck:new(couch_db, [passthrough]),
ets:new(couch_dbs, [set, public, named_table, {keypos, #db.name}]),
ets:new(couch_dbs_pid_to_name, [set, public, named_table]),
couch_lru:new().
teardown(_) ->
ets:delete(couch_dbs),
ets:delete(couch_dbs_pid_to_name),
(catch meck:unload(couch_db)).
new_test_() ->
{setup,
fun() -> couch_lru:new() end,
fun(Lru) ->
?_assertMatch({0, _, _}, Lru)
end
}.
insert_test_() ->
{setup,
fun() -> couch_lru:new() end,
fun(Lru) ->
Key = <<"test">>,
{1, Updates, Dbs} = couch_lru:insert(Key, Lru),
[
?_assertEqual(1, ets_size(Dbs)),
?_assert(ets:member(Dbs, Key)),
?_assertEqual(1, ets_size(Updates)),
?_assert(ets:member(Updates, {0, Key}))
]
end
}.
insert_same_test_() ->
{setup,
fun() -> couch_lru:new() end,
fun(Lru) ->
Key = <<"test">>,
Lru1 = {1, Updates, Dbs} = couch_lru:insert(Key, Lru),
{2, Updates, Dbs} = couch_lru:insert(Key, Lru1),
[
?_assertEqual(1, ets_size(Dbs)),
?_assert(ets:member(Dbs, Key)),
?_assertEqual(1, ets_size(Updates)),
?_assert(ets:member(Updates, {1, Key}))
]
end
}.
update_test_() ->
{setup,
fun() -> couch_lru:new() end,
fun(Lru) ->
Key = <<"test">>,
Lru1 = {1, Updates, Dbs} = couch_lru:update(Key, Lru),
{2, Updates, Dbs} = couch_lru:update(Key, Lru1),
[
?_assertEqual(1, ets_size(Dbs)),
?_assert(ets:member(Dbs, Key)),
?_assertEqual(1, ets_size(Updates)),
?_assert(ets:member(Updates, {1, Key}))
]
end
}.
close_test_() ->
{setup,
fun setup/0,
fun teardown/1,
fun(Lru) ->
ok = meck:expect(couch_db, is_idle, 1, true),
{ok, Lru1} = add_record(Lru, <<"test1">>, c:pid(0, 1001, 0)),
{ok, Lru2} = add_record(Lru1, <<"test2">>, c:pid(0, 2001, 0)),
{true, {2, Updates, Dbs}} = couch_lru:close(Lru2),
[
?_assertEqual(1, ets_size(Dbs)),
?_assert(ets:member(Dbs, <<"test2">>)),
?_assertEqual(1, ets_size(Updates)),
?_assert(ets:member(Updates, {1, <<"test2">>}))
]
end
}.
add_record(Lru, Key, Pid) ->
true = ets:insert(couch_dbs, #db{name = Key, main_pid = Pid}),
true = ets:insert(couch_dbs_pid_to_name, {Pid, Key}),
{ok, couch_lru:insert(Key, Lru)}.
ets_size(Ets) ->
proplists:get_value(size, ets:info(Ets)).