// Copyright 2015 The Chromium 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 <stddef.h>
#include <stdint.h>

#include <string>

#include "base/strings/string_tokenizer.h"

void GetAllTokens(gurl_base::StringTokenizer& t) {
  while (t.GetNext()) {
    (void)t.token();
  }
}

// Entry point for LibFuzzer.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  uint8_t size_t_bytes = sizeof(size_t);
  if (size < size_t_bytes + 1) {
    return 0;
  }

  // Calculate pattern size based on remaining bytes, otherwise fuzzing is
  // inefficient with bailouts in most cases.
  size_t pattern_size =
      *reinterpret_cast<const size_t*>(data) % (size - size_t_bytes);

  std::string pattern(reinterpret_cast<const char*>(data + size_t_bytes),
                      pattern_size);
  std::string input(
      reinterpret_cast<const char*>(data + size_t_bytes + pattern_size),
      size - pattern_size - size_t_bytes);

  // Allow quote_chars and options to be set. Otherwise full coverage
  // won't be possible since IsQuote, FullGetNext and other functions
  // won't be called.
  for (bool return_delims : {false, true}) {
    for (bool return_empty_strings : {false, true}) {
      int options = 0;
      if (return_delims)
        options |= gurl_base::StringTokenizer::RETURN_DELIMS;
      if (return_empty_strings)
        options |= gurl_base::StringTokenizer::RETURN_EMPTY_TOKENS;

      gurl_base::StringTokenizer t(input, pattern);
      t.set_options(options);
      GetAllTokens(t);

      gurl_base::StringTokenizer t_quote(input, pattern);
      t_quote.set_quote_chars("\"");
      t_quote.set_options(options);
      GetAllTokens(t_quote);
    }
  }

  return 0;
}
