"""Unit tests for ELF parsing, symbol resolution and structure decoding.""" from __future__ import annotations import json import os import struct import tempfile import unittest from greeneye.elf import EM_RISCV, parse_elf, load_elf, write_relocated_elf from greeneye.errors import GreenEyeError from greeneye.structs import Field, Schema, decode, render, schema_from_json from greeneye.symbols import Symbol, SymbolDB DEMO_ELF = os.path.join(os.path.dirname(__file__), "..", "firmware", "uproc_demo", "build", "uproc_demo.elf") class ElfTests(unittest.TestCase): def test_parse_demo_elf(self): if not os.path.exists(DEMO_ELF): self.skipTest("demo firmware not built") image = load_elf(DEMO_ELF) self.assertTrue(image.is_riscv) self.assertEqual(image.e_machine, EM_RISCV) self.assertEqual(image.entry, 0x80000000) self.assertGreaterEqual(len(image.load_segments), 1) names = {s.name for s in image.symbols} self.assertIn("main", names) self.assertIn("rpc_ping", names) self.assertIn("gsp_ctrl", names) ctrl = next(s for s in image.symbols if s.name == "gsp_ctrl") self.assertGreaterEqual(ctrl.value, 0x80000000) self.assertEqual(ctrl.size, 0x190) plan = image.flat_load_plan() self.assertTrue(plan and plan[0][0] == 0x80000000) def test_not_elf(self): with self.assertRaises(Exception): parse_elf(b"not an elf") def test_write_relocated_elf(self): if not os.path.exists(DEMO_ELF): self.skipTest("demo firmware not built") image = load_elf(DEMO_ELF) with tempfile.TemporaryDirectory(prefix="greeneye-reloc-") as tmp: out = os.path.join(tmp, "relocated.elf") path = write_relocated_elf(DEMO_ELF, out, 0x1000) with open(path, "rb") as fh: data = fh.read() self.assertEqual(struct.unpack_from("