#!/usr/bin/env python3
# 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 sw/boot_rom and
sw/examples/hello_world targets.

$ cd ${REPO_TOP}
$ pytest -s -v test/systemtest/openocd_verilator_test.py \
  --test_bin sw/examples/hello_world/sw.vmem \
  --rom_bin sw/boot_rom/rom.vmem \
  --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', str(sw_test_bin),
            '--rominit', 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
