summaryrefslogtreecommitdiff
path: root/test/permdbtest.erl
diff options
context:
space:
mode:
Diffstat (limited to 'test/permdbtest.erl')
-rwxr-xr-xtest/permdbtest.erl145
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.
+