Files
geef/test/repo_test.erl
Carlos Martín Nieto 4b889ed3bb Fix looking up a commit's tree
We were generating the term from the wrong object, meaning the system
was not keeping the object we should be. We were also not setting the
repository or increasing its refcount, meaning bad news when it came
time to GC the object.
2015-04-24 15:38:00 +02:00

136 lines
5.4 KiB
Erlang

-module(repo_test).
-compile([export_all]).
-include_lib("eunit/include/eunit.hrl").
-include("src/geef_records.hrl").
repo_test_() ->
{foreach, fun start/0, fun stop/1, [fun bare_test/1, fun odb_write_test/1,
fun ref_test/1, fun index_add_test/1,
fun ref_iter_test/1, fun revparse_test/1,
fun commit_create_test/1, fun commit_message_test/1,
fun commit_tree_test/1]}.
start() ->
{A, B, C} = now(),
N = node(),
TmpDir = io_lib:format("/tmp/geef-~p~p~p~p.git", [N, A, B, C]),
{ok, Repo} = geef_repo:init(TmpDir, true),
Repo.
bare_test(Repo) ->
[?_assertEqual(geef_repo:is_bare(Repo), true)].
odb_write_test(Repo) ->
Data = <<"This is some text that will go in a file">>,
{ok, Odb} = geef_repo:odb(Repo),
{ok, Actual} = geef_odb:write(Odb, Data, blob),
Expected = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"),
[?_assertEqual(Actual, Expected)].
revparse_test(Repo) ->
odb_write_test(Repo),
{ok, Obj} = geef_revparse:single(Repo, "c300118399"),
[?_assertEqual(Obj#geef_object.type, blob),
?_assertEqual(Obj#geef_object.id, geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"))].
index_add_test(Repo) ->
Data = <<"This is some text that will go in a file">>,
{ok, Odb} = geef_repo:odb(Repo),
{ok, BlobId} = geef_odb:write(Odb, Data, blob),
{ok, Idx} = geef_index:new(),
{NowMega, NowSecs, _} = os:timestamp(),
Time = NowMega * 1000000 + NowSecs,
Entry = #geef_index_entry{mode=8#100644, id=BlobId, path="README", size=size(Data), mtime=Time},
ok = geef_index:add(Idx, Entry),
{ok, TreeId} = geef_index:write_tree(Idx, Repo),
Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"),
{ok, Entry1} = geef_index:get(Idx, "README", 0),
[?_assertEqual(Expected, TreeId),
?_assertEqual(BlobId, Entry1#geef_index_entry.id),
?_assertEqual(size(Data), Entry1#geef_index_entry.size),
?_assertEqual(Time, Entry1#geef_index_entry.mtime),
?_assertEqual(geef_index:count(Idx), 1)].
set_logallrefupdates(Repo) ->
{ok, Config} = geef_repo:config(Repo),
ok = geef_config:set(Config, "core.logallrefupdates", true).
ref_test(Repo) ->
odb_write_test(Repo),
set_logallrefupdates(Repo),
Id = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"),
{ok, _} = geef_ref:create(Repo, "refs/heads/branch", Id, true),
{ok, _} = geef_ref:create_symbolic(Repo, "refs/heads/other", "refs/heads/branch", true),
{ok, Ref0} = geef_ref:lookup(Repo, "refs/heads/branch"),
{ok, Ref1} = geef_ref:lookup(Repo, "refs/heads/other"),
{ok, Ref2} = geef_ref:resolve(Ref0),
{ok, Dwimed} = geef_ref:dwim(Repo, "branch"),
{ok, Reflog0} = geef_reflog:read(Repo, "refs/heads/branch"),
ok = geef_reflog:delete(Repo, "refs/heads/branch"),
{ok, Reflog1} = geef_reflog:read(Repo, "refs/heads/branch"),
[?_assertEqual(Ref0#geef_reference.target, Id),
?_assertEqual(Ref1#geef_reference.target, <<"refs/heads/branch">>),
?_assertEqual(<<"branch">>, geef_ref:shorthand(Ref0)),
?_assertEqual(Ref2#geef_reference.target, Id),
?_assertEqual({ok, true}, geef_ref:has_log(Ref0)),
?_assertEqual(1, length(Reflog0)),
?_assertEqual(0, length(Reflog1)),
?_assertEqual(Ref0, Dwimed)].
ref_iter_test(Repo) ->
odb_write_test(Repo),
Id = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"),
{ok, _} = geef_ref:create(Repo, "refs/heads/branch", Id, true),
{ok, _} = geef_ref:create_symbolic(Repo, "refs/heads/other", "refs/heads/branch", true),
{ok, Iter0} = geef_ref:iterator(Repo),
{ok, Ref0} = geef_ref:next(Iter0),
{ok, Ref1} = geef_ref:next(Iter0),
Res0 = geef_ref:next(Iter0),
{ok, Iter1} = geef_ref:iterator(Repo, "refs/heads/b*"),
{ok, Ref2} = geef_ref:next(Iter1),
Res1 = geef_ref:next(Iter1),
[?_assertEqual(Ref0#geef_reference.name, <<"refs/heads/branch">>),
?_assertEqual(Ref1#geef_reference.name, <<"refs/heads/other">>),
?_assertEqual(Res0, {error, iterover}),
?_assertEqual(Ref2#geef_reference.name, <<"refs/heads/branch">>),
?_assertEqual(Res1, {error, iterover})].
commit_create_test(Repo) ->
odb_write_test(Repo),
index_add_test(Repo),
TreeId = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"),
CommitId = geef_oid:parse("bf968373f95f8fed2a24f9d25ebf06521359c6bc"),
Sig = #geef_signature{name= <<"foo">>, email= <<"bar">>, time={{1381,949139,0}, 120}},
Message = <<"Commit message">>,
Resp = geef_commit:create(Repo, Sig, Message, TreeId, []),
[?_assertMatch({ok, CommitId}, Resp)].
commit_message_test(Repo) ->
commit_create_test(Repo),
CommitId = geef_oid:parse("bf968373f95f8fed2a24f9d25ebf06521359c6bc"),
{ok, Commit} = geef_commit:lookup(Repo, CommitId),
Resp = geef_commit:message(Commit),
[?_assertMatch({ok, <<"Commit message">>}, Resp)].
commit_tree_test(Repo) ->
commit_create_test(Repo),
CommitId = geef_oid:parse("bf968373f95f8fed2a24f9d25ebf06521359c6bc"),
{ok, Commit} = geef_commit:lookup(Repo, CommitId),
Resp = geef_commit:tree(Commit),
[?_assertMatch({ok, _}, Resp)].
rm_r(Path) ->
case filelib:is_dir(Path) of
false ->
file:delete(Path);
true ->
{ok, Entries} = file:list_dir(Path),
lists:foreach(fun(X) -> ok = rm_r(filename:join([Path, X])) end, Entries),
file:del_dir(Path)
end.
stop(Repo) ->
Path = geef_repo:path(Repo),
geef_repo:stop(Repo),
ok = rm_r(Path).