Current section
Files
Jump to
Current section
Files
test/jiffy_19_yielding_tests.erl
% This file is part of Jiffy released under the MIT license.
% See the LICENSE file for more information.
-module(jiffy_19_yielding_tests).
-include_lib("eunit/include/eunit.hrl").
-include("jiffy_util.hrl").
decode_bytes_per_red_test() ->
?assertEqual([1,2,3], dec(<<"[1,2,3]">>, [{bytes_per_red, 50}])).
encode_bytes_per_red_test() ->
?assertEqual(<<"[1,2,3]">>, enc([1,2,3], [{bytes_per_red, 50}])).
decode_bytes_per_iter_test() ->
?assertEqual([1,2,3], dec(<<"[1,2,3]">>, [{bytes_per_iter, 20000}])).
encode_bytes_per_iter_test() ->
?assertEqual(<<"[1,2,3]">>, enc([1,2,3], [{bytes_per_iter, 20000}])).
decode_both_bytes_opts_test() ->
Opts = [{bytes_per_red, 100}, {bytes_per_iter, 200000}],
?assertEqual(1, dec(<<"1">>, Opts)).
encode_both_bytes_opts_test() ->
Opts = [{bytes_per_red, 100}, {bytes_per_iter, 200000}],
?assertEqual(<<"1">>, enc(1, Opts)).
% Give it something large to chew on so it hopefully does some yielding.
% Noticed with coverage enabled we didn't check some yielding paths in CI tests
% otheriwse.
%
decode_large_with_bytes_per_red_test() ->
Data = iol2b([
<<"[">>,
lists:join(<<",">>, [<<"1">> || _ <- lists:seq(1, 500)]),
<<"]">>
]),
Result = dec(Data, [{bytes_per_red, 20}]),
?assertEqual(500, length(Result)).
encode_large_with_bytes_per_red_test() ->
Data = lists:duplicate(500, 1),
Encoded = enc(Data, [{bytes_per_red, 20}]),
?assertEqual(Data, dec(Encoded)).
% Nested object but a large binary at the bottom. We want the yield to fire
% while the term stack holds a large (> SMALL_TERMSTACK_SIZE) entries. Then
% small byte_per_red to force yielding.
encode_deep_nesting_yield_test() ->
Depth = 12,
Big = binary:copy(<<"a">>, 10000),
Seq = lists:seq(1, Depth),
Nested = lists:foldl(fun(_, Acc) -> {[{<<"k">>, Acc}]} end, Big, Seq),
Encoded = enc(Nested, [{bytes_per_red, 1}]),
?assertEqual(Nested, dec(Encoded)).
% Force yielding and test restore/save and schedule bits.
decode_excessive_yield_test_() ->
Data = iol2b([
<<"[">>,
lists:join(<<",">>, [i2b(I) || I <- lists:seq(1, 2000)]),
<<"]">>
]),
Expected = lists:seq(1, 2000),
[
{"bytes_per_red = 1",
?_assertEqual(Expected, dec(Data, [{bytes_per_red, 1}]))},
{"bytes_per_red = 0 (clamped to 1)",
?_assertEqual(Expected, dec(Data, [{bytes_per_red, 0}]))},
{"bytes_per_iter = 1",
?_assertEqual(Expected, dec(Data, [{bytes_per_iter, 1}]))}
].
encode_excessive_yield_test_() ->
Data = lists:seq(1, 2000),
[
{"bytes_per_red = 1",
fun() ->
Enc = enc(Data, [{bytes_per_red, 1}]),
?assertEqual(Data, dec(Enc))
end},
{"bytes_per_red = 0 (clamped to 1)",
fun() ->
Enc = enc(Data, [{bytes_per_red, 0}]),
?assertEqual(Data, dec(Enc))
end},
{"bytes_per_iter = 1",
fun() ->
Enc = enc(Data, [{bytes_per_iter, 1}]),
?assertEqual(Data, dec(Enc))
end}
].
% Single large string encoded/decoded + low yield threshold, so
% we hopefully hit the pct_used > 100 in bump_used_reds
large_string_yield_test_() ->
Big = binary:copy(<<"abc">>, 50000),
Json = <<"\"", Big/binary, "\"">>,
[
{"Decode",
?_assertEqual(Big, dec(Json, [{bytes_per_red, 1}]))},
{"Encode",
?_assertEqual(Json, enc(Big, [{bytes_per_red, 1}]))}
].