chromium/extensions/browser/api/declarative_net_request/indexed_rule_fuzzer.cc

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

#include "extensions/browser/api/declarative_net_request/indexed_rule.h"

#include <fuzzer/FuzzedDataProvider.h>
#include <stdint.h>

#include <optional>
#include <string>
#include <utility>

#include "base/check.h"
#include "base/json/json_reader.h"
#include "base/types/expected.h"
#include "base/values.h"
#include "extensions/common/api/declarative_net_request.h"
#include "extensions/common/api/declarative_net_request/constants.h"
#include "url/gurl.h"

using extensions::api::declarative_net_request::Rule;
using extensions::declarative_net_request::IndexedRule;
using extensions::declarative_net_request::RulesetID;

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  FuzzedDataProvider provider(data, size);

  // Make a random `Rule`.
  std::optional<base::Value> value =
      base::JSONReader::Read(provider.ConsumeRandomLengthString());
  if (!value || !value->is_dict()) {
    return 0;
  }
  base::expected<Rule, std::u16string> rule = Rule::FromValue(value->GetDict());
  if (!rule.has_value()) {
    return 0;
  }

  // Make a random `GURL`.
  const GURL url(provider.ConsumeRandomLengthString());
  if (!url.is_valid()) {
    return 0;
  }

  // Make a random `RulesetID`.
  const RulesetID ruleset_id(provider.ConsumeIntegralInRange<int>(-1, 100));

  // Run code-under-test.
  IndexedRule indexed_rule;
  indexed_rule.CreateIndexedRule(std::move(*rule), url, ruleset_id,
                                 &indexed_rule);

  return 0;
}