// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/affiliations/core/browser/lookup_affiliation_response_parser.h"

#include <stdlib.h>

#include "base/at_exit.h"
#include "base/i18n/icu_util.h"
#include "components/affiliations/core/browser/affiliation_api.pb.h"
#include "components/affiliations/core/browser/affiliation_api_fuzzable.pb.h"
#include "testing/libfuzzer/proto/lpm_interface.h"

namespace affiliations {
namespace {

struct IcuEnvironment {
  IcuEnvironment() { CHECK(base::i18n::InitializeICU()); }
  // used by ICU integration.
  base::AtExitManager at_exit_manager;
};

// We run ParseLookupAffiliationResponse twice with two hardcoded vectors of
// FacetURI. This approach can be extended to generating not only
// LookupAffiliationResponse, but also the vector of FacetURI.
// See more details about the fuzzer extending at
// https://crrev.com/c/1131185/1/components/affiliations/core/browser/lookup_affiliation_response_parser_fuzzer.cc#25
DEFINE_BINARY_PROTO_FUZZER(
    const fuzzable::affiliation_pb::LookupAffiliationByHashPrefixResponse&
        fuzzable_response) {
  static IcuEnvironment env;

  // Serialize fuzzable proto and then deserialize as production proto.
  std::string serialized = fuzzable_response.SerializeAsString();
  affiliation_pb::LookupAffiliationByHashPrefixResponse response;
  // Recursion limits can cause parsing to fail.
  if (!response.ParseFromString(serialized)) {
    return;
  }

  AffiliationFetcherInterface::ParsedFetchResponse result;

  std::vector<FacetURI> uris;
  ParseLookupAffiliationResponse(uris, response, &result);

  uris.push_back(FacetURI::FromCanonicalSpec("https://www.example.com"));
  ParseLookupAffiliationResponse(uris, response, &result);
}

}  // namespace
}  // namespace affiliations
