/* Self tests for simple_search_memory for GDB, the GNU debugger.

   Copyright (C) 2020-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "gdbsupport/common-defs.h"
#include "gdbsupport/selftest.h"
#include "gdbsupport/search.h"

namespace selftests {
namespace search_memory_tests {

static void
run_tests ()
{
  size_t size = 2 * SEARCH_CHUNK_SIZE + 1;

  std::vector<gdb_byte> data (size);
  data[size - 1] = 'x';

  bool read_fully = false;
  bool read_off_end = false;
  auto read_memory = [&] (CORE_ADDR from, gdb_byte *out, size_t len)
    {
      if (from + len > data.size ())
	read_off_end = true;
      else
	memcpy (out, &data[from], len);
      if (from + len == data.size ())
	read_fully = true;
      return true;
    };

  gdb_byte pattern = 'x';

  CORE_ADDR addr = 0;
  int result = simple_search_memory (read_memory, 0, data.size (),
				     &pattern, 1, &addr);
  /* In this case we don't care if read_fully was set or not.  */
  SELF_CHECK (result == 1);
  SELF_CHECK (!read_off_end);
  SELF_CHECK (addr == size - 1);

  addr = 0;
  read_fully = false;
  read_off_end = false;
  pattern = 'q';
  result = simple_search_memory (read_memory, 0, data.size (),
				 &pattern, 1, &addr);
  SELF_CHECK (result == 0);
  SELF_CHECK (!read_off_end);
  SELF_CHECK (read_fully);
  SELF_CHECK (addr == 0);

  /* Setup from PR gdb/17756.  */
  size = 0x7bb00;
  data = std::vector<gdb_byte> (size);
  const CORE_ADDR base_addr = 0x08370000;
  const gdb_byte wpattern[] = { 0x90, 0x8b, 0x98, 0x8 };
  const CORE_ADDR found_addr = 0x837bac8;
  memcpy (&data[found_addr - base_addr], wpattern, sizeof (wpattern));

  auto read_memory_2 = [&] (CORE_ADDR from, gdb_byte *out, size_t len)
    {
      memcpy (out, &data[from - base_addr], len);
      return true;
    };

  result = simple_search_memory (read_memory_2, base_addr, data.size (),
				 wpattern, sizeof (wpattern), &addr);
  SELF_CHECK (result == 1);
  SELF_CHECK (addr == found_addr);
}

} /* namespace search_memory_tests */
} /* namespace selftests */


void _initialize_search_memory_selftests ();
void
_initialize_search_memory_selftests ()
{
  selftests::register_test ("search_memory",
			    selftests::search_memory_tests::run_tests);
}
