# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
r"""Runs OpenOCD compliance test against Verilator target.

This test requires some configuration options. Use the following steps to run
the test manually after building Verilator and the boot_rom and hello_world
targets.

$ cd ${REPO_TOP}
$ pytest -s -v test/systemtest/openocd_verilator_test.py \
  --test_bin hello_world.elf \
  --rom_bin boot_rom.elf \
  --verilator_model build/lowrisc_systems_top_earlgrey_verilator_0.1/sim-verilator/Vtop_earlgrey_verilator

In some cases the pytest environment may not be able to find the openocd binary.
To work around this issue, run the test with an additional configuration option:

  --openocd /tools/openocd/bin/openocd
"""

import logging
import re
import subprocess
import time
import pytest

import test_utils

logging.basicConfig(level=logging.DEBUG)

class TestCoreVerilator:
    """Test core functionality in a Verilator-simulated hardware build."""

    @pytest.fixture
    def sim_top_earlgrey(self, tmp_path, sim_top_build, sw_test_bin, rom_bin):
        cmd_sim = [
            str(sim_top_build),
            '--meminit=flash,' + str(sw_test_bin),
            '--meminit=rom,' + str(rom_bin)
        ]
        p_sim = test_utils.Process(
            cmd_sim,
            logdir=str(tmp_path),
            cwd=str(tmp_path),
            startup_done_expect='Simulation running',
            startup_timeout=10)
        p_sim.run()

        yield p_sim

        p_sim.terminate()

    def test_openocd_riscv_compliancetest(self, tmp_path, sim_top_earlgrey,
                                          topsrcdir, openocd):
        """Run RISC-V Debug compliance test built into OpenOCD."""
        assert subprocess.call([str(openocd), '--version']) == 0
        cmd_openocd = [
            str(openocd),
            '-s', str(topsrcdir / 'util' / 'openocd'),
            '-f', 'board/lowrisc-earlgrey-verilator.cfg',
            '-c', 'init; riscv test_compliance; shutdown'
        ]
        p_openocd = test_utils.Process(
            cmd_openocd, logdir=str(tmp_path), cwd=str(tmp_path))
        p_openocd.run()

        logging.getLogger(__name__).info(
            "OpenOCD should terminate itself; give it up to 5 minutes")
        p_openocd.proc.wait(timeout=300)
        assert p_openocd.proc.returncode == 0

        logging.getLogger(__name__).info(
            "Now wait 60 seconds until the program has finished execution")
        time.sleep(60)

        try:
            p_openocd.terminate()
        except ProcessLookupError:
            # process is already dead
            pass
