blob: 691d4bd3c208de1e85de1d1867ec9fea7cd98426 [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(test_engine_attachments).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").
-include_lib("couch/include/couch_db.hrl").
cet_write_attachment() ->
{ok, Engine, DbPath, St1} = test_engine_util:init_engine(dbpath),
AttBin = crypto:strong_rand_bytes(32768),
try
[Att0] = test_engine_util:prep_atts(Engine, St1, [
{<<"ohai.txt">>, AttBin}
]),
{stream, Stream} = couch_att:fetch(data, Att0),
?assertEqual(true, Engine:is_active_stream(St1, Stream)),
Actions = [{create, {<<"first">>, [], [Att0]}}],
{ok, St2} = test_engine_util:apply_actions(Engine, St1, Actions),
{ok, St3} = Engine:commit_data(St2),
Engine:terminate(normal, St3),
{ok, St4} = Engine:init(DbPath, []),
[FDI] = Engine:open_docs(St4, [<<"first">>]),
#rev_info{
rev = {RevPos, PrevRevId},
deleted = Deleted,
body_sp = DocPtr
} = test_engine_util:prev_rev(FDI),
Doc0 = #doc{
id = <<"foo">>,
revs = {RevPos, [PrevRevId]},
deleted = Deleted,
body = DocPtr
},
Doc1 = Engine:read_doc_body(St4, Doc0),
Atts1 = if not is_binary(Doc1#doc.atts) -> Doc1#doc.atts; true ->
couch_compress:decompress(Doc1#doc.atts)
end,
StreamSrc = fun(Sp) -> Engine:open_read_stream(St4, Sp) end,
[Att1] = [couch_att:from_disk_term(StreamSrc, T) || T <- Atts1],
ReadBin = couch_att:to_binary(Att1),
?assertEqual(AttBin, ReadBin)
catch throw:not_supported ->
ok
end.
% N.B. This test may be overly specific for some theoretical
% storage engines that don't re-initialize their
% attachments streams when restarting (for instance if
% we ever have something that stores attachemnts in
% an external object store)
cet_inactive_stream() ->
{ok, Engine, DbPath, St1} = test_engine_util:init_engine(dbpath),
AttBin = crypto:strong_rand_bytes(32768),
try
[Att0] = test_engine_util:prep_atts(Engine, St1, [
{<<"ohai.txt">>, AttBin}
]),
{stream, Stream} = couch_att:fetch(data, Att0),
?assertEqual(true, Engine:is_active_stream(St1, Stream)),
Engine:terminate(normal, St1),
{ok, St2} = Engine:init(DbPath, []),
?assertEqual(false, Engine:is_active_stream(St2, Stream))
catch throw:not_supported ->
ok
end.