aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/test/zlib_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/test/zlib_SUITE.erl')
-rw-r--r--lib/kernel/test/zlib_SUITE.erl1004
1 files changed, 1004 insertions, 0 deletions
diff --git a/lib/kernel/test/zlib_SUITE.erl b/lib/kernel/test/zlib_SUITE.erl
new file mode 100644
index 0000000000..f20c9a176b
--- /dev/null
+++ b/lib/kernel/test/zlib_SUITE.erl
@@ -0,0 +1,1004 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(zlib_SUITE).
+
+-include("test_server.hrl").
+
+-compile(export_all).
+
+-define(error(Format,Args),
+ put(test_server_loc,{?MODULE,?LINE}),
+ error(Format,Args,?MODULE,?LINE)).
+
+%% Learn erts team how to really write tests ;-)
+-define(m(ExpectedRes,Expr),
+ fun() ->
+ ACtual1 = (catch (Expr)),
+ try case ACtual1 of
+ ExpectedRes -> ACtual1
+ end
+ catch
+ error:{case_clause,ACtuAl} ->
+ ?error("Not Matching Actual result was:~n ~p ~n",
+ [ACtuAl]),
+ ACtuAl
+ end
+ end()).
+
+-define(BARG, {'EXIT',{badarg,[{zlib,_,_}|_]}}).
+-define(DATA_ERROR, {'EXIT',{data_error,[{zlib,_,_}|_]}}).
+
+init_per_testcase(_Func, Config) ->
+ Dog = test_server:timetrap(test_server:seconds(60)),
+ [{watchdog, Dog}|Config].
+fin_per_testcase(_Func, Config) ->
+ Dog = ?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog).
+
+error(Format, Args, File, Line) ->
+ io:format("~p:~p: ERROR: " ++ Format, [File,Line|Args]),
+ group_leader() ! {failed, File, Line}.
+
+%% Hopefully I don't need this to get it to work with the testserver..
+%% Fail = #'REASON'{file = filename:basename(File),
+%% line = Line,
+%% desc = Args},
+%% case global:whereis_name(mnesia_test_case_sup) of
+%% undefined ->
+%% ignore;
+%% Pid ->
+%% Pid ! Fail
+%% %% global:send(mnesia_test_case_sup, Fail),
+%% end,
+%% log("<>ERROR<>~n" ++ Format, Args, File, Line).
+
+all(suite) ->
+ [api, examples, func, smp, otp_7359].
+
+api(doc) -> "Basic the api tests";
+api(suite) ->
+ [api_open_close,
+ api_deflateInit,
+ api_deflateSetDictionary,
+ api_deflateReset,
+ api_deflateParams,
+ api_deflate,
+ api_deflateEnd,
+ api_inflateInit,
+ api_inflateSetDictionary,
+ api_inflateSync,
+ api_inflateReset,
+ api_inflate,
+ api_inflateEnd,
+ api_setBufsz,
+ api_getBufsz,
+ api_crc32,
+ api_adler32,
+ api_getQSize,
+ api_un_compress,
+ api_un_zip,
+% api_g_un_zip_file,
+ api_g_un_zip].
+
+api_open_close(doc) -> "Test open/0 and close/1";
+api_open_close(suite) -> [];
+api_open_close(Config) when is_list(Config) ->
+ ?line Fd1 = zlib:open(),
+ ?line Fd2 = zlib:open(),
+ ?m(false,Fd1 == Fd2),
+ ?m(ok,zlib:close(Fd1)),
+ ?m(?BARG, zlib:close(Fd1)),
+ ?m(ok,zlib:close(Fd2)),
+
+ %% Make sure that we don't get any EXIT messages if trap_exit is enabled.
+ ?line process_flag(trap_exit, true),
+ ?line Fd3 = zlib:open(),
+ ?m(ok,zlib:close(Fd3)),
+ receive
+ Any -> ?line ?t:fail({unexpected_message,Any})
+ after 10 -> ok
+ end.
+
+api_deflateInit(doc) -> "Test deflateInit/2 and /6";
+api_deflateInit(suite) -> [];
+api_deflateInit(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(?BARG, zlib:deflateInit(gurka, none)),
+ ?m(?BARG, zlib:deflateInit(gurka, gurka)),
+ ?m(?BARG, zlib:deflateInit(Z1, gurka)),
+ Levels = [none, default, best_speed, best_compression] ++ lists:seq(0,9),
+ lists:foreach(fun(Level) ->
+ ?line Z = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z, Level)),
+ ?m(ok,zlib:close(Z))
+ end, Levels),
+ %% /6
+ ?m(?BARG, zlib:deflateInit(Z1,gurka,deflated,-15,8,default)),
+
+ ?m(?BARG, zlib:deflateInit(Z1,default,undefined,-15,8,default)),
+
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,48,8,default)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-20,8,default)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-7,8,default)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,7,8,default)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-8,8,default)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,8,8,default)),
+
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,0,default)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,10,default)),
+
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,8,0)),
+ ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,8,undefined)),
+
+ lists:foreach(fun(Level) ->
+ ?line Z = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z, Level, deflated, -15, 8, default)),
+ ?m(ok,zlib:close(Z))
+ end, Levels),
+
+ lists:foreach(fun(Wbits) ->
+ ?line Z11 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z11,best_compression,deflated,
+ Wbits,8,default)),
+ ?line Z12 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z12,default,deflated,-Wbits,8,default)),
+ ?m(ok,zlib:close(Z11)),
+ ?m(ok,zlib:close(Z12))
+ end, lists:seq(9, 15)),
+
+ lists:foreach(fun(MemLevel) ->
+ ?line Z = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z,default,deflated,-15,
+ MemLevel,default)),
+ ?m(ok,zlib:close(Z))
+ end, lists:seq(1,8)),
+
+ Strategies = [filtered,huffman_only,default],
+ lists:foreach(fun(Strategy) ->
+ ?line Z = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z,best_speed,deflated,-15,8,Strategy)),
+ ?m(ok,zlib:close(Z))
+ end, Strategies),
+ ?m(ok, zlib:deflateInit(Z1,default,deflated,-15,8,default)),
+ ?m({'EXIT',_}, zlib:deflateInit(Z1,none,deflated,-15,8,default)), %% ??
+ ?m(ok, zlib:close(Z1)).
+
+api_deflateSetDictionary(doc) -> "Test deflateSetDictionary";
+api_deflateSetDictionary(suite) -> [];
+api_deflateSetDictionary(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m(Id when is_integer(Id), zlib:deflateSetDictionary(Z1, <<1,1,2,3,4,5,1>>)),
+ ?m(Id when is_integer(Id), zlib:deflateSetDictionary(Z1, [1,1,2,3,4,5,1])),
+ ?m(?BARG, zlib:deflateSetDictionary(Z1, gurka)),
+ ?m(?BARG, zlib:deflateSetDictionary(Z1, 128)),
+ ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)),
+ ?m({'EXIT',{stream_error,_}},zlib:deflateSetDictionary(Z1,<<1,1,2,3,4,5,1>>)),
+ ?m(ok, zlib:close(Z1)).
+
+api_deflateReset(doc) -> "Test deflateReset";
+api_deflateReset(suite) -> [];
+api_deflateReset(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)),
+ ?m(ok, zlib:deflateReset(Z1)),
+ ?m(ok, zlib:deflateReset(Z1)),
+ %% FIXME how do I make this go wrong??
+ ?m(ok, zlib:close(Z1)).
+
+api_deflateParams(doc) -> "Test deflateParams";
+api_deflateParams(suite) -> [];
+api_deflateParams(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)),
+ ?m(ok, zlib:deflateParams(Z1, best_compression, huffman_only)),
+ ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, sync)),
+ ?m({'EXIT',_}, zlib:deflateParams(Z1,best_speed, filtered)),
+ ?m(ok, zlib:close(Z1)).
+
+api_deflate(doc) -> "Test deflate";
+api_deflate(suite) -> [];
+api_deflate(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m([B] when is_binary(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, finish)),
+ ?m(ok, zlib:deflateReset(Z1)),
+ ?m([B] when is_binary(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, finish)),
+ ?m(ok, zlib:deflateReset(Z1)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, sync)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, full)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<>>, finish)),
+
+ ?m(?BARG, zlib:deflate(gurka, <<1,1,1,1,1,1,1,1,1>>, full)),
+ ?m(?BARG, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, asdj)),
+ ?m(?BARG, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, 198)),
+ %% Causes problems ERROR REPORT
+ ?m(?BARG, zlib:deflate(Z1, [asdj,asd], none)),
+
+ ?m(ok, zlib:close(Z1)).
+
+api_deflateEnd(doc) -> "Test deflateEnd";
+api_deflateEnd(suite) -> [];
+api_deflateEnd(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m(ok, zlib:deflateEnd(Z1)),
+ ?m({'EXIT', {einval,_}}, zlib:deflateEnd(Z1)), %% ??
+ ?m(?BARG, zlib:deflateEnd(gurka)),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<"Kilroy was here">>)),
+ ?m({'EXIT', {data_error,_}}, zlib:deflateEnd(Z1)),
+ ?m(ok, zlib:deflateInit(Z1, default)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<"Kilroy was here">>)),
+ ?m(B when is_list(B), zlib:deflate(Z1, <<"Kilroy was here">>, finish)),
+ ?m(ok, zlib:deflateEnd(Z1)),
+
+ ?m(ok, zlib:close(Z1)).
+
+api_inflateInit(doc) -> "Test inflateInit /1 and /2";
+api_inflateInit(suite) -> [];
+api_inflateInit(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(?BARG, zlib:inflateInit(gurka)),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m({'EXIT',{einval,_}}, zlib:inflateInit(Z1, 15)), %% ??
+ lists:foreach(fun(Wbits) ->
+ ?line Z11 = zlib:open(),
+ ?m(ok, zlib:inflateInit(Z11,Wbits)),
+ ?line Z12 = zlib:open(),
+ ?m(ok, zlib:inflateInit(Z12,-Wbits)),
+ ?m(ok,zlib:close(Z11)),
+ ?m(ok,zlib:close(Z12))
+ end, lists:seq(9,15)),
+ ?m(?BARG, zlib:inflateInit(gurka, -15)),
+ ?m(?BARG, zlib:inflateInit(Z1, 7)),
+ ?m(?BARG, zlib:inflateInit(Z1, -7)),
+ ?m(?BARG, zlib:inflateInit(Z1, 48)),
+ ?m(?BARG, zlib:inflateInit(Z1, -16)),
+ ?m(ok, zlib:close(Z1)).
+
+api_inflateSetDictionary(doc) -> "Test inflateSetDictionary";
+api_inflateSetDictionary(suite) -> [];
+api_inflateSetDictionary(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m(?BARG, zlib:inflateSetDictionary(gurka,<<1,1,1,1,1>>)),
+ ?m(?BARG, zlib:inflateSetDictionary(Z1,102)),
+ ?m(?BARG, zlib:inflateSetDictionary(Z1,gurka)),
+ Dict = <<1,1,1,1,1>>,
+ ?m({'EXIT',{stream_error,_}}, zlib:inflateSetDictionary(Z1,Dict)),
+ ?m(ok, zlib:close(Z1)).
+
+api_inflateSync(doc) -> "Test inflateSync";
+api_inflateSync(suite) -> [];
+api_inflateSync(Config) when is_list(Config) ->
+ {skip,"inflateSync/1 sucks"}.
+%% ?line Z1 = zlib:open(),
+%% ?m(ok, zlib:deflateInit(Z1)),
+%% ?line B1list0 = zlib:deflate(Z1, "gurkan gurra ger galna tunnor", full),
+%% ?line B2 = zlib:deflate(Z1, "grodan boll", finish),
+%% io:format("~p\n", [B1list0]),
+%% io:format("~p\n", [B2]),
+%% ?m(ok, zlib:deflateEnd(Z1)),
+%% ?line B1 = clobber(14, list_to_binary(B1list0)),
+%% ?line Compressed = list_to_binary([B1,B2]),
+%% ?line io:format("~p\n", [Compressed]),
+
+%% ?m(ok, zlib:inflateInit(Z1)),
+%% ?m(?BARG, zlib:inflateSync(gurka)),
+%% ?m({'EXIT',{data_error,_}}, zlib:inflate(Z1, Compressed)),
+%% ?m(ok, zlib:inflateSync(Z1)),
+%% ?line Ubs = zlib:inflate(Z1, []),
+%% ?line <<"grodan boll">> = list_to_binary(Ubs),
+%% ?m(ok, zlib:close(Z1)).
+
+clobber(N, Bin) when is_binary(Bin) ->
+ T = list_to_tuple(binary_to_list(Bin)),
+ Byte = case element(N, T) of
+ 255 -> 254;
+ B -> B+1
+ end,
+ list_to_binary(tuple_to_list(setelement(N, T, Byte))).
+
+api_inflateReset(doc) -> "Test inflateReset";
+api_inflateReset(suite) -> [];
+api_inflateReset(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m(?BARG, zlib:inflateReset(gurka)),
+ ?m(ok, zlib:inflateReset(Z1)),
+ ?m(ok, zlib:close(Z1)).
+
+api_inflate(doc) -> "Test inflate";
+api_inflate(suite) -> [];
+api_inflate(Config) when is_list(Config) ->
+ Data = [<<1,2,2,3,3,3,4,4,4,4>>],
+ ?line Compressed = zlib:compress(Data),
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m([], zlib:inflate(Z1, <<>>)),
+ ?m(Data, zlib:inflate(Z1, Compressed)),
+ ?m(ok, zlib:inflateEnd(Z1)),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m(Data, zlib:inflate(Z1, Compressed)),
+ ?m(?BARG, zlib:inflate(gurka, Compressed)),
+ ?m(?BARG, zlib:inflate(Z1, 4384)),
+ ?m(?BARG, zlib:inflate(Z1, [atom_list])),
+ ?m(ok, zlib:inflateEnd(Z1)),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m({'EXIT',{data_error,_}}, zlib:inflate(Z1, <<2,1,2,1,2>>)),
+ ?m(ok, zlib:close(Z1)).
+
+api_inflateEnd(doc) -> "Test inflateEnd";
+api_inflateEnd(suite) -> [];
+api_inflateEnd(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m({'EXIT',{einval,_}}, zlib:inflateEnd(Z1)),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m(?BARG, zlib:inflateEnd(gurka)),
+ ?m({'EXIT',{data_error,_}}, zlib:inflateEnd(Z1)),
+ ?m({'EXIT',{einval,_}}, zlib:inflateEnd(Z1)),
+ ?m(ok, zlib:inflateInit(Z1)),
+ ?m(B when is_list(B), zlib:inflate(Z1, zlib:compress("abc"))),
+ ?m(ok, zlib:inflateEnd(Z1)),
+ ?m(ok, zlib:close(Z1)).
+
+api_getBufsz(doc) -> "Test getBufsz";
+api_getBufsz(suite) -> [];
+api_getBufsz(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(Val when is_integer(Val), zlib:getBufSize(Z1)),
+ ?m(?BARG, zlib:getBufSize(gurka)),
+ ?m(ok, zlib:close(Z1)).
+
+api_setBufsz(doc) -> "Test setBufsz";
+api_setBufsz(suite) -> [];
+api_setBufsz(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(?BARG, zlib:setBufSize(Z1, gurka)),
+ ?m(?BARG, zlib:setBufSize(gurka, 1232330)),
+ Sz = ?m( Val when is_integer(Val), zlib:getBufSize(Z1)),
+ ?m(ok, zlib:setBufSize(Z1, Sz*2)),
+ DSz = Sz*2,
+ ?m(DSz, zlib:getBufSize(Z1)),
+ ?m(ok, zlib:close(Z1)).
+
+%%% Debug function ??
+api_getQSize(doc) -> "Test getQSize";
+api_getQSize(suite) -> [];
+api_getQSize(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ Q = ?m(Val when is_integer(Val), zlib:getQSize(Z1)),
+ io:format("QSize ~p ~n", [Q]),
+ ?m(?BARG, zlib:getQSize(gurka)),
+ ?m(ok, zlib:close(Z1)).
+
+api_crc32(doc) -> "Test crc32";
+api_crc32(suite) -> [];
+api_crc32(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1,best_speed,deflated,-15,8,default)),
+ Bin = <<1,1,1,1,1,1,1,1,1>>,
+ Compressed1 = ?m(_, zlib:deflate(Z1, Bin, none)),
+ Compressed2 = ?m(_, zlib:deflate(Z1, <<>>, finish)),
+ Compressed = list_to_binary(Compressed1 ++ Compressed2),
+ CRC1 = ?m( CRC1 when is_integer(CRC1), zlib:crc32(Z1)),
+ ?m(CRC1 when is_integer(CRC1), zlib:crc32(Z1,Bin)),
+ ?m(CRC2 when is_integer(CRC2), zlib:crc32(Z1,Compressed)),
+ CRC2 = ?m(CRC2 when is_integer(CRC2), zlib:crc32(Z1,0,Compressed)),
+ ?m(CRC3 when CRC2 /= CRC3, zlib:crc32(Z1,234,Compressed)),
+ ?m(?BARG, zlib:crc32(gurka)),
+ ?m(?BARG, zlib:crc32(Z1, not_a_binary)),
+ ?m(?BARG, zlib:crc32(gurka, <<1,1,2,4,4>>)),
+ ?m(?BARG, zlib:crc32(Z1, 2298929, not_a_binary)),
+ ?m(?BARG, zlib:crc32(Z1, not_an_int, <<123,123,123,35,231>>)),
+ ?m(?BARG, zlib:crc32_combine(Z1, not_an_int, 123123, 123)),
+ ?m(?BARG, zlib:crc32_combine(Z1, noint, 123123, 123)),
+ ?m(?BARG, zlib:crc32_combine(Z1, 123123, noint, 123)),
+ ?m(?BARG, zlib:crc32_combine(Z1, 123123, 123, noint)),
+ ?m(ok, zlib:deflateEnd(Z1)),
+ ?m(ok, zlib:close(Z1)).
+
+api_adler32(doc) -> "Test adler32";
+api_adler32(suite) -> [];
+api_adler32(Config) when is_list(Config) ->
+ ?line Z1 = zlib:open(),
+ ?m(ok, zlib:deflateInit(Z1,best_speed,deflated,-15,8,default)),
+ Bin = <<1,1,1,1,1,1,1,1,1>>,
+ Compressed1 = ?m(_, zlib:deflate(Z1, Bin, none)),
+ Compressed2 = ?m(_, zlib:deflate(Z1, <<>>, finish)),
+ Compressed = list_to_binary(Compressed1 ++ Compressed2),
+ ?m(ADLER1 when is_integer(ADLER1), zlib:adler32(Z1,Bin)),
+ ADLER2 = ?m(ADLER2 when is_integer(ADLER2), zlib:adler32(Z1,Compressed)),
+ ?m(ADLER2 when is_integer(ADLER2), zlib:adler32(Z1,1,Compressed)),
+ ?m(ADLER3 when ADLER2 /= ADLER3, zlib:adler32(Z1,234,Compressed)),
+ ?m(?BARG, zlib:adler32(Z1, not_a_binary)),
+ ?m(?BARG, zlib:adler32(gurka, <<1,1,2,4,4>>)),
+ ?m(?BARG, zlib:adler32(Z1, 2298929, not_a_binary)),
+ ?m(?BARG, zlib:adler32(Z1, not_an_int, <<123,123,123,35,231>>)),
+ ?m(?BARG, zlib:adler32_combine(Z1, noint, 123123, 123)),
+ ?m(?BARG, zlib:adler32_combine(Z1, 123123, noint, 123)),
+ ?m(?BARG, zlib:adler32_combine(Z1, 123123, 123, noint)),
+ ?m(ok, zlib:deflateEnd(Z1)),
+ ?m(ok, zlib:close(Z1)).
+
+api_un_compress(doc) -> "Test compress";
+api_un_compress(suite) -> [];
+api_un_compress(Config) when is_list(Config) ->
+ ?m(?BARG,zlib:compress(not_a_binary)),
+ Bin = <<1,11,1,23,45>>,
+ ?line Comp = zlib:compress(Bin),
+ ?m(?BARG,zlib:uncompress(not_a_binary)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<171,171,171,171,171>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120,156>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120,156,3>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120,156,3,0>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<0,156,3,0,0,0,0,1>>)),
+ ?m(Bin, zlib:uncompress(Comp)).
+
+api_un_zip(doc) -> "Test zip";
+api_un_zip(suite) -> [];
+api_un_zip(Config) when is_list(Config) ->
+ ?m(?BARG,zlib:zip(not_a_binary)),
+ Bin = <<1,11,1,23,45>>,
+ ?line Comp = zlib:zip(Bin),
+ ?m(?BARG,zlib:unzip(not_a_binary)),
+ ?m({'EXIT',{data_error,_}}, zlib:unzip(<<171,171,171,171,171>>)),
+ ?m({'EXIT',{data_error,_}}, zlib:unzip(<<>>)),
+ ?m(Bin, zlib:unzip(Comp)),
+
+ %% OTP-6396
+ B = <<131,104,19,100,0,13,99,95,99,105,100,95,99,115,103,115,110,95,50,97,1,107,0,4,208,161,246,29,107,0,3,237,166,224,107,0,6,66,240,153,0,2,10,1,0,8,97,116,116,97,99,104,101,100,104,2,100,0,22,117,112,100,97,116,101,95,112,100,112,95,99,111,110,116,101,120,116,95,114,101,113,107,0,114,69,3,12,1,11,97,31,113,150,64,104,132,61,64,104,12,3,197,31,113,150,64,104,132,61,64,104,12,1,11,97,31,115,150,64,104,116,73,64,104,0,0,0,0,0,0,65,149,16,61,65,149,16,61,1,241,33,4,5,0,33,4,4,10,6,10,181,4,10,6,10,181,38,15,99,111,109,109,97,110,100,1,114,45,97,112,110,45,49,3,99,111,109,5,109,110,99,57,57,6,109,99,99,50,52,48,4,103,112,114,115,8,0,104,2,104,2,100,0,8,97,99,116,105,118,97,116,101,104,23,100,0,11,112,100,112,95,99,111,110,116,1,120,116,100,0,7,112,114,105,109,97,114,121,97,1,100,0,9,117,110,100,101,102,105,110,101,100,97,1,97,4,97,4,97,7,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,110,10100,100,0,9,117,110,100,101,102,105,110,101,100,100,0,5,102,97,108,115,101,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,1,101,100,97,0,100,0,9,117,110,100,101,102,105,110,101,100,107,0,4,16,0,1,144,107,0,4,61,139,186,181,107,0,4,10,8,201,49,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,0,101,100,100,0,9,117,110,100,101,102,105,110,101,100,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,16,97,21,106,108,0,0,0,3,104,2,97,1,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,167,20,104,2,97,4,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,16,97,21,104,2,97,10,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,16,97,26,106,100,0,5,118,101,114,57,57,100,0,9,117,110,0,101,102,105,110,101,100,107,0,2,0,244,107,0,4,10,6,102,195,107,0,4,10,6,102,195,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,110,101,100,107,0,125,248,143,0,203,25115,157,116,65,185,65,172,55,87,164,88,225,50,203,251,115,157,116,65,185,65,172,55,87,164,88,225,50,0,0,82,153,50,0,200,98,87,148,237,193,185,65,149,167,69,144,14,16,153,50,3,81,70,94,13,109,193,1,120,5,181,113,198,118,50,3,81,70,94,13,109,193,185,120,5,181,113,198,118,153,3,81,70,94,13,109,193,185,120,5,181,113,198,118,153,50,16,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,113,92,2,119,128,0,0,108,0,0,1,107,0,114,69,3,12,1,11,97,31,113,150,64,104,132,61,64,104,12,3,11,97,31,113,150,64,104,132,61,64,104,12,1,11,97,31,115,150,64,104,116,73,64,104,0,0,0,0,0,0,65,149,16,61,65,149,16,61,1,241,33,4,0,33,4,4,10,6,10,181,4,10,6,10,181,38,15,99,111,109,109,97,110,100,101,114,45,97,112,110,45,49,3,99,111,109,5,109,110,99,57,57,6,109,99,99,50,52,48,4,103,112,114,115,8,0,106>>,
+ Z = zlib:zip(B),
+ ?m(B, zlib:unzip(Z)).
+
+%% api_g_un_zip_file(doc) -> "Test gunzip_file";
+%% api_g_un_zip_file(suite) -> [];
+%% api_g_un_zip_file(Config) when is_list(Config) ->
+%% ?line Out = conf(data_dir,Config),
+%% io:format("Using OutDir ~p ~n", [Out]),
+%% F = filename:join(Out,"testing1"),
+%% Data = <<1,1,255,255,255,1,1>>,
+%% ?m(ok, file:write_file(F,Data)),
+%% ?line Compressed = zlib:gzip_file(F),
+%% ?m(ok, file:write_file(F++".gz",Compressed)),
+%% ?m(Data, zlib:gunzip_file(F++".gz")),
+%% ?m({error,enoent}, zlib:gunzip_file(gurka)),
+%% ?m({error,enoent}, zlib:gzip_file(gurka)),
+%% ?m({error,what}, zlib:gunzip_file(F)),
+%% ?line ok.
+
+api_g_un_zip(doc) -> "Test gunzip";
+api_g_un_zip(suite) -> [];
+api_g_un_zip(Config) when is_list(Config) ->
+ ?m(?BARG,zlib:gzip(not_a_binary)),
+ Bin = <<1,11,1,23,45>>,
+ ?line Comp = zlib:gzip(Bin),
+ ?m(?BARG, zlib:gunzip(not_a_binary)),
+ ?m(?DATA_ERROR, zlib:gunzip(<<171,171,171,171,171>>)),
+ ?m(?DATA_ERROR, zlib:gunzip(<<>>)),
+ ?m(Bin, zlib:gunzip(Comp)),
+
+ %% Bad CRC; bad length.
+ BadCrc = bad_crc_data(),
+ ?line ?m({'EXIT',{data_error,_}},(catch zlib:gunzip(BadCrc))),
+ BadLen = bad_len_data(),
+ ?line ?m({'EXIT',{data_error,_}},(catch zlib:gunzip(BadLen))),
+ ok.
+
+bad_crc_data() ->
+ %% zlib:zip(<<42>>), one byte changed.
+ <<31,139,8,0,0,0,0,0,0,3,211,2,0,91,39,185,9,1,0,0,0>>.
+
+bad_len_data() ->
+ %% zlib:zip(<<42>>), one byte changed.
+ <<31,139,8,0,0,0,0,0,0,3,211,2,0,91,38,185,9,2,0,0,0>>.
+
+examples(doc) -> "Test the doc examples";
+examples(suite) ->
+ [
+ intro
+ ].
+
+intro(suite) -> [];
+intro(doc) -> "";
+intro(Config) when is_list(Config) ->
+ D = <<"This is a binary">>,
+ [put({ex, N}, <<"This is a binary">>) || N <- [0,1,2,3,4]],
+ put({ex, 5}, end_of_data),
+ put(ex,0),
+ ?line Read = fun() ->
+ N = get(ex),
+ put(ex,N+1),
+ get({ex,N})
+ end,
+
+ ?line Z = zlib:open(),
+ ?line ok = zlib:deflateInit(Z,default),
+
+ ?line Compress = fun(end_of_data, _Cont) -> [];
+ (Data, Cont) ->
+ [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
+ end,
+ ?line Compressed = Compress(Read(),Compress),
+ ?line Last = zlib:deflate(Z, [], finish),
+ ?line ok = zlib:deflateEnd(Z),
+ ?line zlib:close(Z),
+ ?line Res = list_to_binary([Compressed|Last]),
+ Orig = list_to_binary(lists:duplicate(5, D)),
+ ?m(Orig, zlib:uncompress(Res)).
+
+func(doc) -> "Test the functionality";
+func(suite) ->
+ [zip_usage, gz_usage, gz_usage2, compress_usage,
+ dictionary_usage,
+ large_deflate,
+ %% inflateSync,
+ crc,
+ adler
+ ].
+
+large_deflate(doc) -> "Test deflate large file, which had a bug reported on erlang-bugs";
+large_deflate(suite) -> [];
+large_deflate(Config) when is_list(Config) ->
+ large_deflate().
+large_deflate() ->
+ ?line Z = zlib:open(),
+ ?line Plain = rand_bytes(zlib:getBufSize(Z)*5),
+ ?line ok = zlib:deflateInit(Z),
+ ?line _ZlibHeader = zlib:deflate(Z, [], full),
+ ?line Deflated = zlib:deflate(Z, Plain, full),
+ ?m(ok, zlib:close(Z)),
+ ?m(Plain, zlib:unzip(list_to_binary([Deflated, 3, 0]))).
+
+rand_bytes(Sz) ->
+ L = <<8,2,3,6,1,2,3,2,3,4,8,7,3,7,2,3,4,7,5,8,9,3>>,
+ rand_bytes(erlang:md5(L),Sz).
+
+rand_bytes(Bin, Sz) when byte_size(Bin) >= Sz ->
+ <<Res:Sz/binary, _/binary>> = Bin,
+ Res;
+rand_bytes(Bin, Sz) ->
+ rand_bytes(<<(erlang:md5(Bin))/binary, Bin/binary>>, Sz).
+
+
+zip_usage(doc) -> "Test a standard compressed zip file";
+zip_usage(suite) -> [];
+zip_usage(Config) when is_list(Config) ->
+ zip_usage(zip_usage({get_arg,Config}));
+zip_usage({get_arg,Config}) ->
+ ?line Out = conf(data_dir,Config),
+ ?line {ok,ZIP} = file:read_file(filename:join(Out,"zipdoc.zip")),
+ ?line {ok,ORIG} = file:read_file(filename:join(Out,"zipdoc")),
+ {run,ZIP,ORIG};
+zip_usage({run,ZIP,ORIG}) ->
+ ?line <<_:14/binary, CRC:32/little,
+ CompSz:32/little, UnCompSz:32/little,_:31/binary,
+ Compressed:CompSz/binary, _/binary>> = ZIP,
+
+ %%io:format("CRC ~p CSz ~p UnCSz ~p ~n", [CRC,CompSz,UnCompSz]),
+ ?line Split = split_bin(Compressed,[]),
+ ?line Z = zlib:open(),
+
+ ?m(ok, zlib:inflateInit(Z, -15)),
+ Bs = [zlib:inflate(Z, Part) || Part <- Split],
+ UC0 = list_to_binary(Bs),
+ ?m(UnCompSz, byte_size(UC0)),
+ ?m(CRC, zlib:crc32(Z)),
+ ?m(true, zlib:crc32(Z,UC0) == zlib:crc32(Z,ORIG)),
+ ?m(ok, zlib:inflateEnd(Z)),
+
+ ?line UC1 = zlib:unzip(Compressed),
+ ?m(UnCompSz, byte_size(UC1)),
+ ?m(true, zlib:crc32(Z,UC1) == zlib:crc32(Z,ORIG)),
+
+ ?m(ok, zlib:inflateInit(Z, -15)),
+ ?line UC2 = zlib:inflate(Z, Compressed),
+ ?m(UnCompSz, byte_size(list_to_binary(UC2))),
+ ?m(CRC, zlib:crc32(Z)),
+ ?m(true, zlib:crc32(Z,UC2) == zlib:crc32(Z,ORIG)),
+ ?m(ok, zlib:inflateEnd(Z)),
+
+ ?m(ok, zlib:inflateInit(Z, -15)),
+ ?line UC3 = zlib:inflate(Z, Split), % Test multivec.
+ ?m(UnCompSz, byte_size(list_to_binary(UC3))),
+ ?m(true, zlib:crc32(Z,UC3) == zlib:crc32(Z,ORIG)),
+ ?m(CRC, zlib:crc32(Z)),
+ ?m(ok, zlib:inflateEnd(Z)),
+
+ ?m(ok, zlib:inflateInit(Z, -15)),
+ ?m(ok, zlib:setBufSize(Z, UnCompSz *2)),
+ ?line UC4 = zlib:inflate(Z, Compressed),
+ ?m(UnCompSz, byte_size(list_to_binary(UC4))),
+ ?m(CRC, zlib:crc32(Z)),
+ ?m(CRC, zlib:crc32(Z,UC4)),
+ ?m(true, zlib:crc32(Z,UC4) == zlib:crc32(Z,ORIG)),
+ ?m(ok, zlib:inflateEnd(Z)),
+
+ ?line C1 = zlib:zip(ORIG),
+ ?line UC5 = zlib:unzip(C1),
+ ?m(CRC, zlib:crc32(Z,UC5)),
+ ?m(true,zlib:crc32(Z,UC5) == zlib:crc32(Z,ORIG)),
+
+ ?m(ok, zlib:deflateInit(Z, default, deflated, -15, 8, default)),
+ ?line C2 = zlib:deflate(Z, ORIG, finish),
+ ?m(true, C1 == list_to_binary(C2)),
+ ?m(ok, zlib:deflateEnd(Z)),
+
+ ?m(ok, zlib:deflateInit(Z, none, deflated, -15, 8, filtered)),
+ ?m(ok, zlib:deflateParams(Z, default, default)),
+ ?line C3 = zlib:deflate(Z, ORIG, finish),
+ ?m(true, C1 == list_to_binary(C3)),
+ ?m(ok, zlib:deflateEnd(Z)),
+
+ ?line ok = zlib:close(Z),
+ ?line ok.
+
+gz_usage(doc) -> "Test a standard compressed gzipped file";
+gz_usage(suite) -> [];
+gz_usage(Config) when is_list(Config) ->
+ gz_usage(gz_usage({get_arg,Config}));
+gz_usage({get_arg,Config}) ->
+ ?line Out = conf(data_dir,Config),
+ ?line {ok,GZIP} = file:read_file(filename:join(Out,"zipdoc.1.gz")),
+ ?line {ok,ORIG} = file:read_file(filename:join(Out,"zipdoc")),
+ ?line {ok,GZIP2} = file:read_file(filename:join(Out,"zipdoc.txt.gz")),
+ {run,GZIP,ORIG,GZIP2};
+gz_usage({run,GZIP,ORIG,GZIP2}) ->
+ ?line Z = zlib:open(),
+ ?line UC1 = zlib:gunzip(GZIP),
+ ?m(true,zlib:crc32(Z,UC1) == zlib:crc32(Z,ORIG)),
+ ?line UC3 = zlib:gunzip(GZIP2),
+ ?m(true,zlib:crc32(Z,UC3) == zlib:crc32(Z,ORIG)),
+ ?line Compressed = zlib:gzip(ORIG),
+ ?line UC5 = zlib:gunzip(Compressed),
+ ?m(true,zlib:crc32(Z,UC5) == zlib:crc32(Z,ORIG)),
+ ?line ok = zlib:close(Z).
+
+gz_usage2(doc) -> "Test more of a standard compressed gzipped file";
+gz_usage2(suite) -> [];
+gz_usage2(Config) ->
+ case os:find_executable("gzip") of
+ Name when is_list(Name) ->
+ ?line Z = zlib:open(),
+ ?line Out = conf(data_dir,Config),
+ ?line {ok,ORIG} = file:read_file(filename:join(Out,"zipdoc")),
+ ?line Compressed = zlib:gzip(ORIG),
+ GzOutFile = filename:join(Out,"out.gz"),
+ OutFile = filename:join(Out,"out.txt"),
+ ?m(ok, file:write_file(GzOutFile,Compressed)),
+ ?line os:cmd("gzip -c -d " ++ GzOutFile ++ " > " ++ OutFile),
+ case file:read_file(OutFile) of
+ {ok,ExtDecompressed} ->
+ ?m(true,
+ zlib:crc32(Z,ExtDecompressed) == zlib:crc32(Z,ORIG));
+ Error ->
+ io:format("Couldn't test external decompressor ~p\n",
+ [Error])
+ end,
+ ?line ok = zlib:close(Z),
+ ok;
+ false ->
+ {skipped,"No gzip in path"}
+ end.
+
+
+
+compress_usage(doc) ->
+ "Test that (de)compress funcs work with"
+ " standard tools, for example a chunk from a png file";
+compress_usage(suite) -> [];
+compress_usage(Config) when is_list(Config) ->
+ compress_usage(compress_usage({get_arg,Config}));
+compress_usage({get_arg,Config}) ->
+ ?line Out = conf(data_dir,Config),
+ ?line {ok,C1} = file:read_file(filename:join(Out,"png-compressed.zlib")),
+ {run,C1};
+compress_usage({run,C1}) ->
+ ?line Z = zlib:open(),
+ %% See that we can uncompress a file generated with external prog.
+ ?line UC1 = zlib:uncompress(C1),
+ %% Check that the crc are correct.
+ ?m(4125865008,zlib:crc32(Z,UC1)),
+ ?line C2 = zlib:compress(UC1),
+ ?line UC2 = zlib:uncompress(C2),
+ %% Check that the crc are correct.
+ ?m(4125865008,zlib:crc32(Z,UC2)),
+
+ ?line ok = zlib:close(Z),
+
+ D = [<<"We tests some partial">>,
+ <<"data, sent over">>,
+ <<"the stream">>,
+ <<"we check that we can unpack">>,
+ <<"every message we get">>],
+
+ ?line ZC = zlib:open(),
+ ?line ZU = zlib:open(),
+ Test = fun(finish, {_,Tot}) ->
+ ?line Compressed = zlib:deflate(ZC, <<>>, finish),
+ Data = zlib:inflate(ZU, Compressed),
+ [Tot|Data];
+ (Data, {Op,Tot}) ->
+ ?line Compressed = zlib:deflate(ZC, Data, Op),
+ Res1 = ?m([Data],zlib:inflate(ZU, Compressed)),
+ {Op, [Tot|Res1]}
+ end,
+ ?line zlib:deflateInit(ZC),
+ ?line zlib:inflateInit(ZU),
+ ?line T1 = lists:foldl(Test,{sync,[]},D++[finish]),
+ ?m(true, list_to_binary(D) == list_to_binary(T1)),
+ ?line zlib:deflateEnd(ZC),
+ ?line zlib:inflateEnd(ZU),
+
+ ?line zlib:deflateInit(ZC),
+ ?line zlib:inflateInit(ZU),
+ ?line T2 = lists:foldl(Test,{full,[]},D++[finish]),
+ ?m(true, list_to_binary(D) == list_to_binary(T2)),
+ ?line zlib:deflateEnd(ZC),
+ ?line zlib:inflateEnd(ZU),
+
+ ?line ok = zlib:close(ZC),
+ ?line ok = zlib:close(ZU).
+
+
+crc(doc) -> "Check that crc works as expected";
+crc(suite) -> [];
+crc(Config) when is_list(Config) ->
+ crc(crc({get_arg,Config}));
+crc({get_arg,Config}) ->
+ ?line Out = conf(data_dir,Config),
+ ?line {ok,C1} = file:read_file(filename:join(Out,"zipdoc")),
+ {run,C1};
+crc({run,C1}) ->
+ ?line Z = zlib:open(),
+ ?line Crc = zlib:crc32(Z, C1),
+ Bins = split_bin(C1,[]),
+ %%io:format("Length ~p ~p ~n", [length(Bins), [size(Bin) || Bin <- Bins]]),
+ Last = lists:last(Bins),
+ SCrc = lists:foldl(fun(Bin,Crc0) ->
+ Crc1 = zlib:crc32(Z, Crc0, Bin),
+ ?m(false, Crc == Crc1 andalso Bin /= Last),
+ Crc1
+ end, 0, Bins),
+ ?m(Crc,SCrc),
+ ?line [First|Rest] = Bins,
+ Combine = fun(Bin, CS1) ->
+ CS2 = zlib:crc32(Z, Bin),
+ S2 = byte_size(Bin),
+ zlib:crc32_combine(Z,CS1,CS2,S2)
+ end,
+ ?line Comb = lists:foldl(Combine, zlib:crc32(Z, First), Rest),
+ ?m(Crc,Comb),
+ ?line ok = zlib:close(Z).
+
+adler(doc) -> "Check that adler works as expected";
+adler(suite) -> [];
+adler(Config) when is_list(Config) ->
+ adler(adler({get_arg,Config}));
+adler({get_arg,Config}) ->
+ ?line Out = conf(data_dir,Config),
+ File1 = filename:join(Out,"zipdoc"),
+ ?line {ok,C1} = file:read_file(File1),
+ {run,C1};
+adler({run,C1}) ->
+ ?line Z = zlib:open(),
+ ?m(1, zlib:adler32(Z,<<>>)),
+ ?line Crc = zlib:adler32(Z, C1),
+ Bins = split_bin(C1,[]),
+ Last = lists:last(Bins),
+ SCrc = lists:foldl(fun(Bin,Crc0) ->
+ Crc1 = zlib:adler32(Z, Crc0, Bin),
+ ?m(false, Crc == Crc1 andalso Bin /= Last),
+ Crc1
+ end, zlib:adler32(Z,<<>>), Bins),
+ ?m(Crc,SCrc),
+ ?line [First|Rest] = Bins,
+ Combine = fun(Bin, CS1) ->
+ CS2 = zlib:adler32(Z, Bin),
+ S2 = byte_size(Bin),
+ zlib:adler32_combine(Z,CS1,CS2,S2)
+ end,
+ ?line Comb = lists:foldl(Combine, zlib:adler32(Z, First), Rest),
+ ?m(Crc,Comb),
+ ?line ok = zlib:close(Z).
+
+dictionary_usage(doc) -> "Test dictionary usage";
+dictionary_usage(suite) -> [];
+dictionary_usage(Config) when is_list(Config) ->
+ dictionary_usage(dictionary_usage({get_arg,Config}));
+dictionary_usage({get_arg,_Config}) ->
+ {run}; % no args
+dictionary_usage({run}) ->
+ ?line Z1 = zlib:open(),
+ Dict = <<"Anka">>,
+ Data = <<"Kalle Anka">>,
+ ?m(ok, zlib:deflateInit(Z1)),
+ ?line DictID = zlib:deflateSetDictionary(Z1, Dict),
+ %% ?line io:format("DictID = ~p\n", [DictID]),
+ ?line B1 = zlib:deflate(Z1, Data),
+ ?line B2 = zlib:deflate(Z1, <<>>, finish),
+ ?m(ok, zlib:deflateEnd(Z1)),
+ ?m(ok, zlib:close(Z1)),
+ Compressed = list_to_binary([B1,B2]),
+ %% io:format("~p\n", [Compressed]),
+
+ %% Now uncompress.
+ ?line Z2 = zlib:open(),
+ ?m(ok, zlib:inflateInit(Z2)),
+ ?line {'EXIT',{{need_dictionary,DictID},_}} = (catch zlib:inflate(Z2, Compressed)),
+ ?m(ok, zlib:inflateSetDictionary(Z2, Dict)),
+ ?line Uncompressed = ?m(B when is_list(B), zlib:inflate(Z2, [])),
+ ?m(ok, zlib:inflateEnd(Z2)),
+ ?m(ok, zlib:close(Z2)),
+ ?m(Data, list_to_binary(Uncompressed)).
+
+split_bin(<<Part:1997/binary,Rest/binary>>, Acc) ->
+ split_bin(Rest, [Part|Acc]);
+split_bin(Last,Acc) ->
+ lists:reverse([Last|Acc]).
+
+
+smp(doc) -> "Check concurrent access to zlib driver";
+smp(suite) -> [];
+smp(Config) ->
+ case erlang:system_info(smp_support) of
+ true ->
+ NumOfProcs = lists:min([8,erlang:system_info(schedulers)]),
+ io:format("smp starting ~p workers\n",[NumOfProcs]),
+
+ %% Tests to run in parallel.
+ Funcs = [zip_usage, gz_usage, compress_usage, dictionary_usage,
+ crc, adler],
+
+ %% We get all function arguments here to avoid repeated parallel
+ %% file read access.
+ FnAList = lists:map(fun(F) -> {F,?MODULE:F({get_arg,Config})}
+ end, Funcs),
+
+ Pids = [spawn_link(?MODULE, worker, [random:uniform(9999),
+ list_to_tuple(FnAList),
+ self()])
+ || _ <- lists:seq(1,NumOfProcs)],
+ wait_pids(Pids);
+
+ false ->
+ {skipped,"No smp support"}
+ end.
+
+
+worker(Seed, FnATpl, Parent) ->
+ io:format("smp worker ~p, seed=~p~n",[self(),Seed]),
+ random:seed(Seed,Seed,Seed),
+ worker_loop(100, FnATpl),
+ Parent ! self().
+
+worker_loop(0, _FnATpl) ->
+ large_deflate(), % the time consuming one as finale
+ ok;
+worker_loop(N, FnATpl) ->
+ {F,A} = element(random:uniform(size(FnATpl)),FnATpl),
+ ?MODULE:F(A),
+ worker_loop(N-1, FnATpl).
+
+wait_pids([]) ->
+ ok;
+wait_pids(Pids) ->
+ receive
+ Pid ->
+ ?line true = lists:member(Pid,Pids),
+ Others = lists:delete(Pid,Pids),
+ io:format("wait_pid got ~p, still waiting for ~p\n",[Pid,Others]),
+ wait_pids(Others)
+ end.
+
+
+otp_7359(doc) -> "Deflate/inflate data with size close to multiple of internal buffer size";
+otp_7359(suite) -> [];
+otp_7359(_Config) ->
+ %% Find compressed size
+ ZTry = zlib:open(),
+ ok = zlib:deflateInit(ZTry),
+ ISize = zlib:getBufSize(ZTry),
+ IData = list_to_binary([Byte band 255 || Byte <- lists:seq(1,ISize)]),
+ ?line ISize = byte_size(IData),
+
+ ?line DSize = iolist_size(zlib:deflate(ZTry, IData, sync)),
+ zlib:close(ZTry),
+
+ io:format("Deflated try ~p -> ~p bytes~n", [ISize, DSize]),
+
+ %% Try deflate and inflate with different internal buffer sizes
+ ISpan = 1,
+ DSpan = 10, % use larger span around deflated size as it may vary depending on buf size
+
+ Cases = [{DS,IS} || DMul<-[1,2],
+ DS <- lists:seq((DSize div DMul)-DSpan,
+ (DSize div DMul)+DSpan),
+ IMul<-[1,2],
+ IS <- lists:seq((ISize div IMul)-ISpan,
+ (ISize div IMul)+ISpan)],
+
+ lists:foreach(fun(Case) -> otp_7359_def_inf(IData,Case) end,
+ Cases).
+
+
+otp_7359_def_inf(Data,{DefSize,InfSize}) ->
+ %%io:format("Try: DefSize=~p InfSize=~p~n", [DefSize,InfSize]),
+ ?line ZDef = zlib:open(),
+ ?line ok = zlib:deflateInit(ZDef),
+ ?line ok = zlib:setBufSize(ZDef,DefSize),
+ ?line DefData = iolist_to_binary(zlib:deflate(ZDef, Data, sync)),
+ %%io:format("Deflated ~p(~p) -> ~p(~p) bytes~n",
+ %% [byte_size(Data), InfSize, byte_size(DefData), DefSize]),
+ ?line ok = zlib:close(ZDef),
+
+ ?line ZInf = zlib:open(),
+ ?line ok = zlib:inflateInit(ZInf),
+ ?line ok = zlib:setBufSize(ZInf,InfSize),
+ ?line Data = iolist_to_binary(zlib:inflate(ZInf, DefData)),
+ ?line ok = zlib:close(ZInf),
+ ok.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Helps with testing directly %%%%%%%%%%%%%
+
+conf(What,Config) ->
+ try ?config(What,Config) of
+ undefined ->
+ "./zlib_SUITE_data";
+ Dir ->
+ Dir
+ catch
+ _:_ -> "./zlib_SUITE_data"
+ end.
+
+t() -> t([all]).
+
+t(What) when not is_list(What) ->
+ t([What]);
+t(What) ->
+ lists:foreach(fun(T) ->
+ try ?MODULE:T([])
+ catch _E:_R ->
+ Line = get(test_server_loc),
+ io:format("Failed ~p:~p ~p ~p ~p~n",
+ [T,Line,_E,_R, erlang:get_stacktrace()])
+ end
+ end, expand(What)).
+
+expand(All) ->
+ lists:reverse(expand(All,[])).
+expand([H|T], Acc) ->
+ case ?MODULE:H(suite) of
+ [] -> expand(T,[H|Acc]);
+ Cs ->
+ R = expand(Cs, Acc),
+ expand(T, R)
+ end;
+expand([], Acc) -> Acc.
+