# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: CC0-1.0

import logging

import pytest
from pytest_embedded import Dut

MEM_TEST_UNICORE = {
    'esp32s2': [
        ['IRAM0_SRAM', 'WRX'],
        ['IRAM0_RTCFAST', 'WRX'],
        ['DRAM0_SRAM', 'WR'],
        ['DRAM0_RTCFAST', 'WR'],
        ['PERI1_RTCSLOW', 'WR'],
        ['PERI2_RTCSLOW_0', 'WRX'],
        ['PERI2_RTCSLOW_1', 'WRX']
    ],
    'esp32c3': [
        ['IRAM0_SRAM', 'WRX'],
        ['DRAM0_SRAM', 'WR'],
        ['IRAM0_RTCFAST', 'WRX']
    ],
    'esp32s3': [
        ['IRAM0_SRAM (core 0)', 'WRX'],
        ['DRAM0_SRAM (core 0)', 'WR']
        # temporarily disabled unless IDF-5208 gets merged
        # ['IRAM0_RTCFAST', 'WR'],
    ],
}

MEM_TEST_MULTICORE = {
    'esp32s3': [
        # instruction execute test temporarily disabled
        # ['IRAM0_SRAM (core 0)', 'WRX'],
        ['IRAM0_SRAM (core 0)', 'WR'],
        ['DRAM0_SRAM (core 0)', 'WR'],
        # instruction execute test temporarily disabled
        # ['IRAM0_SRAM (core 1)', 'WRX'],
        ['IRAM0_SRAM (core 1)', 'WR'],
        ['DRAM0_SRAM (core 1)', 'WR']
        # temporarily disabled unless IDF-5208 gets merged
        # ['IRAM0_RTCFAST', 'WR'],
    ]
}


@pytest.mark.esp32s2
@pytest.mark.esp32s3
@pytest.mark.esp32c3
@pytest.mark.generic
def test_sys_memprot(dut: Dut) -> None:

    current_target = dut.target

    unicore = dut.app.sdkconfig.get('FREERTOS_UNICORE')

    mem_test_cfg = MEM_TEST_UNICORE if unicore else MEM_TEST_MULTICORE

    logging.info(f'Test cfg: {current_target}')

    for i in mem_test_cfg[current_target]:
        if 'R' in i[1]:
            dut.expect_exact(i[0] + ' read low: OK')
            dut.expect_exact(i[0] + ' read high: OK')
        if 'W' in i[1]:
            dut.expect_exact(i[0] + ' write low: OK')
            dut.expect_exact(i[0] + ' write high: OK')
        if 'X' in i[1]:
            dut.expect_exact(i[0] + ' exec low: OK')
            dut.expect_exact(i[0] + ' exec high: OK')