#!/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([openocd, '--version']) == 0
        cmd_openocd = [
            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
