From 10456fd21d3ea367096ccccc673e7ad0c227eb03 Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Thu, 6 Aug 2020 17:42:58 +0300 Subject: [PATCH] [tracking] Covering with fuzz tests Protocol::CreateDataPacket() and Protocol::CreateDataPacket(). --- .../tracking_fuzz_tests.cpp | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tracking/tracking_fuzz_tests/tracking_fuzz_tests.cpp b/tracking/tracking_fuzz_tests/tracking_fuzz_tests.cpp index 361ad90d15..682823b470 100644 --- a/tracking/tracking_fuzz_tests/tracking_fuzz_tests.cpp +++ b/tracking/tracking_fuzz_tests/tracking_fuzz_tests.cpp @@ -1,21 +1,63 @@ #include "tracking/protocol.hpp" +#include "coding/traffic.hpp" + +#include "geometry/latlon.hpp" + #include "base/logging.hpp" +#include #include +#include #include +using namespace coding; using namespace tracking; +namespace +{ +template +T PopType(std::vector & data) +{ + T t{}; + if (data.empty()) + return t; + + t = *reinterpret_cast(data.data()); + if (data.size() <= sizeof(T)) + data.clear(); + else + data.erase(data.begin(), std::next(data.begin(), sizeof(T))); + + return t; +} + +TrafficGPSEncoder::DataPoint PopDataPoint(std::vector & data) +{ + return TrafficGPSEncoder::DataPoint(PopType(data) /* timestamp */, + ms::LatLon(PopType(data), PopType(data)), + PopType(data) /* traffic */); +} +} // namespace + extern "C" int LLVMFuzzerTestOneInput(uint8_t const * data, size_t size) { base::ScopedLogLevelChanger scopedLogLevelChanger(base::LCRITICAL); std::vector const dataVec(data, data + size); + + auto dataVecToConv = dataVec; + Protocol::DataElementsVec dataElementsVec; + while (!dataVecToConv.empty()) + dataElementsVec.push_back(PopDataPoint(dataVecToConv)); + Protocol::DataElementsCirc dataElementsCirc(dataElementsVec.cbegin(), dataElementsVec.cend()); + Protocol::DecodeHeader(dataVec); for (auto const type : {Protocol::PacketType::Error, Protocol::PacketType::AuthV0, Protocol::PacketType::DataV0, Protocol::PacketType::DataV1}) { + Protocol::CreateDataPacket(dataElementsVec, type); + Protocol::CreateDataPacket(dataElementsCirc, type); Protocol::DecodeAuthPacket(type, dataVec); Protocol::DecodeDataPacket(type, dataVec); }