blob: 9368b69047c5cc35a3eb7ffa110976e44bc0dc20 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/fidl/cpp/binding.h>
#include <lib/fit/function.h>
#include <algorithm>
#include <string>
#include "src/ledger/bin/p2p_provider/impl/p2p_provider_impl.h"
#include "src/ledger/bin/p2p_provider/public/p2p_provider.h"
#include "src/ledger/bin/p2p_sync/impl/user_communicator_impl.h"
#include "src/ledger/bin/storage/public/page_sync_client.h"
#include "src/ledger/bin/storage/testing/page_storage_empty_impl.h"
#include "src/ledger/lib/coroutine/coroutine_impl.h"
#include "src/lib/fxl/macros.h"
namespace p2p_sync {
namespace {
class TestPageStorage : public storage::PageStorageEmptyImpl {
public:
TestPageStorage() = default;
~TestPageStorage() {}
storage::PageId GetId() override { return "page"; }
void SetSyncDelegate(storage::PageSyncDelegate* page_sync) override {
return;
}
};
class FuzzingP2PProvider : public p2p_provider::P2PProvider {
public:
FuzzingP2PProvider() = default;
void Start(Client* client) override { client_ = client; }
bool SendMessage(fxl::StringView destination, fxl::StringView data) override {
FXL_NOTIMPLEMENTED();
return false;
}
Client* client_;
};
// Fuzz the peer-to-peer messages received by a |UserCommunicatorImpl|.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) {
std::string bytes(reinterpret_cast<const char*>(Data), Size);
coroutine::CoroutineServiceImpl coroutine_service;
auto provider = std::make_unique<FuzzingP2PProvider>();
FuzzingP2PProvider* provider_ptr = provider.get();
UserCommunicatorImpl user_communicator(std::move(provider),
&coroutine_service);
user_communicator.Start();
auto ledger_communicator = user_communicator.GetLedgerCommunicator("ledger");
storage::PageStorageEmptyImpl page_storage;
auto page_communicator =
ledger_communicator->GetPageCommunicator(&page_storage, &page_storage);
provider_ptr->client_->OnDeviceChange("device",
p2p_provider::DeviceChangeType::NEW);
provider_ptr->client_->OnNewMessage("device", bytes);
return 0;
}
} // namespace
} // namespace p2p_sync