blob: ddd1077d1e650da80959bb917d04789f241c9183 [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(cpse_test_attachments).
-compile(export_all).
-compile(nowarn_export_all).
-include_lib("eunit/include/eunit.hrl").
-include_lib("couch/include/couch_db.hrl").
setup_each() ->
{ok, Db} = cpse_util:create_db(),
Db.
teardown_each(Db) ->
ok = couch_server:delete(couch_db:name(Db), []).
cpse_write_attachment(Db1) ->
AttBin = crypto:strong_rand_bytes(32768),
try
[Att0] = cpse_util:prep_atts(Db1, [
{<<"ohai.txt">>, AttBin}
]),
{stream, Stream} = couch_att:fetch(data, Att0),
?assertEqual(true, couch_db_engine:is_active_stream(Db1, Stream)),
Actions = [{create, {<<"first">>, {[]}, [Att0]}}],
{ok, Db2} = cpse_util:apply_actions(Db1, Actions),
cpse_util:shutdown_db(Db2),
{ok, Db3} = couch_db:reopen(Db2),
[FDI] = couch_db_engine:open_docs(Db3, [<<"first">>]),
#rev_info{
rev = {RevPos, PrevRevId},
deleted = Deleted,
body_sp = DocPtr
} = cpse_util:prev_rev(FDI),
Doc0 = #doc{
id = <<"foo">>,
revs = {RevPos, [PrevRevId]},
deleted = Deleted,
body = DocPtr
},
Doc1 = couch_db_engine:read_doc_body(Db3, Doc0),
Atts1 = if not is_binary(Doc1#doc.atts) -> Doc1#doc.atts; true ->
couch_compress:decompress(Doc1#doc.atts)
end,
StreamSrc = fun(Sp) -> couch_db_engine:open_read_stream(Db3, 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)
cpse_inactive_stream(Db1) ->
AttBin = crypto:strong_rand_bytes(32768),
try
[Att0] = cpse_util:prep_atts(Db1, [
{<<"ohai.txt">>, AttBin}
]),
{stream, Stream} = couch_att:fetch(data, Att0),
?assertEqual(true, couch_db_engine:is_active_stream(Db1, Stream)),
cpse_util:shutdown_db(Db1),
{ok, Db2} = couch_db:reopen(Db1),
?assertEqual(false, couch_db_engine:is_active_stream(Db2, Stream))
catch throw:not_supported ->
ok
end.