We have a little bit of assembly for processor-specific startup housekeeping, but that's mostly reused with small modifications for different boards. The rest of the code base is entirely C, managing functions such as ground communications, mobility (locomotion, navigation and control), thermal management, power management, fault detection and recovery, payload (e.g. science instrument) management and mission planning.
We need 100% branch code coverage at unit test level, and have function validation tests written in Java that validate the software against the requirements, running on simulated hardware. Similar tests are run against simulators with progressively more hardware-in-the-loop for more confidence.