From 6f59ef7a7c4fa8faaf8e36a26dc08fb1608a04b0 Mon Sep 17 00:00:00 2001 From: Thomas Arts Date: Tue, 28 May 2019 18:07:50 +0200 Subject: [PATCH] Fuzz test aeb_fate_encoding --- quickcheck/aeb_fate_data_tests.erl | 3 ++- quickcheck/aefate_eqc.erl | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/quickcheck/aeb_fate_data_tests.erl b/quickcheck/aeb_fate_data_tests.erl index 81c911d..58aad72 100644 --- a/quickcheck/aeb_fate_data_tests.erl +++ b/quickcheck/aeb_fate_data_tests.erl @@ -21,5 +21,6 @@ quickcheck_test_() -> {setup, fun() -> eqc:start() end, [ ?EQC_EUNIT(aefate_eqc, prop_roundtrip, 500), - ?EQC_EUNIT(aefate_eqc, prop_format_scan, 2000) + ?EQC_EUNIT(aefate_eqc, prop_format_scan, 2000), + ?EQC_EUNIT(aefate_eqc, prop_fuzz, 2000) ]}. diff --git a/quickcheck/aefate_eqc.erl b/quickcheck/aefate_eqc.erl index 0db5677..837b79d 100644 --- a/quickcheck/aefate_eqc.erl +++ b/quickcheck/aefate_eqc.erl @@ -49,6 +49,19 @@ prop_serializes() -> {size, size(Binary) < 500000}])))) end)). +prop_fuzz() -> + in_parallel( + ?FORALL(Binary, ?LET(FateData, fate_data(), aeb_fate_encoding:serialize(FateData)), + ?FORALL(InjectedBin, injection(Binary), + try Org = aeb_fate_encoding:deserialize(InjectedBin), + NewBin = aeb_fate_coding:serialize(Org), + NewOrg = aeb_fate_coding:deserialize(NewBin), + ?WHENFAIL(eqc:format("Deserialize ~p gives\n~p\nSerializes to ~p\n", [InjectedBin, Org, NewOrg]), + equals(NewBin, InjectedBin)) + catch _:_ -> + true + end))). + fate_data() -> ?SIZED(Size, ?LET(Data, fate_data(Size, [map]), eqc_symbolic:eval(Data))). @@ -120,3 +133,11 @@ non_quote_string() -> char() -> choose(1, 255). + +injection(Binary) -> + ?LET({N, Inj}, {choose(0, byte_size(Binary) - 1), choose(0,255)}, + begin + M = N * 8, + <> = Binary, + <> + end).