diff options
Diffstat (limited to 'test/permdbtest.erl')
-rwxr-xr-x | test/permdbtest.erl | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/test/permdbtest.erl b/test/permdbtest.erl new file mode 100755 index 0000000..1c43861 --- /dev/null +++ b/test/permdbtest.erl @@ -0,0 +1,145 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +%%! -pa ebin -pa ../lager/ebin -pa ../lager/deps/goldrush/ebin + +-mode(compile). + +gentestdata(Size) -> + [{crypto:hash(sha256, <<E:32, 0:32>>), crypto:hash(sha256, <<E:32, 1:32>>)} || E <- lists:seq(0, Size-1)]. + +genemptytestdata(Size) -> + [{crypto:hash(sha256, <<E:32, 0:32>>), noentry} || E <- lists:seq(0, Size-1)]. + +timeprint(Time) -> + io_lib:format("~.2fs", [Time/1000000]). + +testinit(Filename) -> + permdb:start_link(testdb, Filename). + +teststop() -> + permdb:stop(testdb). + +constructdata(VSeed, Size) -> + A = binary:copy(VSeed, Size div 32), + B = binary:part(VSeed, 0, Size rem 32), + <<A/binary, B/binary>>. + +getvalue_loop([], _Port, _Datasize) -> + none; +getvalue_loop([{K, VSeed}|Rest], Port, Datasize) -> + V = case VSeed of + noentry -> + noentry; + _ -> + constructdata(VSeed, Datasize) + end, + case permdb:getvalue(testdb, K) of + V -> + getvalue_loop(Rest, Port, Datasize); + VOther -> + io:format("expected: ~p got: ~p~nkey: ~p~n", [V, VOther, K]), + exit(mismatch) + end. + +addvalue_loop([], _Port, _Datasize) -> + none; +addvalue_loop([{K, VSeed}|Rest], Port, Datasize) -> + V = constructdata(VSeed, Datasize), + case permdb:addvalue(testdb, K, V) of + ok -> + addvalue_loop(Rest, Port, Datasize); + Other -> + io:format("expected: 0 or 1 got: ~p~n", [Other]), + exit(mismatch) + end. + +testget(_Filename, TestData, Datasize) -> + getvalue_loop(TestData, none, Datasize), + ok. + +testadd(_Filename, TestData, Datasize) -> + addvalue_loop(TestData, none, Datasize), + case permdb:commit(testdb) of + <<0>> -> + ok; + Other -> + io:format("commit expected: 0 got: ~p~n", [Other]), + exit(mismatch) + end. + +stop() -> + teststop(), + receive + after + 100 -> + ok + end. + +main([]) -> + {ok, Cwd} = file:get_cwd(), + code:add_path(Cwd ++ "/ebin"), + Size = 10, + Datasize = 99, + Filename = "testpermdb", + file:delete(Filename), + file:delete(Filename ++ ".idx"), + {Time1, TestData} = timer:tc(fun () -> gentestdata(Size) end), + EmptyTestData = genemptytestdata(Size), + io:format("Init with ~p entries: ~s~n", [Size, timeprint(Time1)]), + testinit(Filename), + Testadd = fun () -> + {Time2, ok} = timer:tc(fun () -> testadd(Filename, TestData, Datasize) end), + io:format("Add ~p entries: ~s ~.1f entries/s (~.2f microseconds)~n", [Size, timeprint(Time2), Size*1000000/Time2, Time2/Size]) + end, + Testadd(), + Testget = fun () -> + {Time2, ok} = timer:tc(fun () -> testget(Filename, TestData, Datasize) end), + io:format("Get ~p entries: ~s ~.1f entries/s (~.2f microseconds)~n", [Size, timeprint(Time2), Size*1000000/Time2, Time2/Size]) + end, + Testget(), + stop(), + + testinit(Filename), + Testget(), + stop(), + + file:delete(Filename ++ ".idx"), + testinit(Filename), + Testget(), + stop(), + + testinit(Filename), + Testget(), + stop(), + + {ok, File} = file:open(Filename ++ ".idx", [read, write, binary]), + {ok, _Position} = file:position(File, {eof, -120}), + ok = file:write(File, <<0>>), + file:close(File), + + testinit(Filename), + Testget(), + stop(), + + io:format("------------------------------------------------------------~n", []), + file:delete(Filename), + file:delete(Filename ++ ".idx"), + testinit(Filename), + Testemptyget = fun () -> + {Time2, ok} = timer:tc(fun () -> testget(Filename, EmptyTestData, Datasize) end), + io:format("Get ~p entries: ~s ~.1f entries/s (~.2f microseconds)~n", [Size, timeprint(Time2), Size*1000000/Time2, Time2/Size]) + end, + Testemptyget(), + testadd(Filename, gentestdata(1), 99), + testadd(Filename, gentestdata(1+2), 99), + testadd(Filename, gentestdata(1+2+3), 99), + testadd(Filename, gentestdata(1+2+3+4), 99), + testget(Filename, gentestdata(1+2+3+4), 99), + stop(), + + testinit(Filename), + testget(Filename, gentestdata(1+2+3+4), 99), + stop(), + + ok. + |