Probando

La comunidad de Rust suele crear las pruebas unitarias en un módulo situado en el mismo archivo fuente que el código que se está probando. Este tema ya se ha tratado antes en el curso y tiene este aspecto:

#![allow(unused)]
fn main() {
#[cfg(test)]
mod tests {
    #[test]
    fn my_test() {
        todo!()
    }
}
}

En Chromium colocamos las pruebas unitarias en un archivo fuente independiente y continuamos con esta práctica con Rust. De esta forma, las pruebas se pueden encontrar de forma coherente y se evita volver a crear archivos .rs (en la configuración test).

Esta acción genera las siguientes opciones para probar el código de Rust en Chromium:

  • Pruebas nativas de Rust (es decir, #[test]). No se recomienda hacerlas fuera de //third_party/rust.
  • Pruebas gtest escritas en C++ y ejercicios con Rust mediante llamadas de FFI. Suficiente cuando el código de Rust es solo una capa fina de FFI y las pruebas unitarias existentes proporcionan suficiente cobertura para la función.
  • Pruebas gtest creadas en Rust y usando el crate en prueba a través de su API pública (mediante pub mod for_testing { ... } si es necesario). Este es el tema de las siguientes diapositivas.

Menciona que los bots de Chromium deberían hacer pruebas nativas de Rust de crates de terceros tarde o temprano. (Estas pruebas rara vez son necesarias, solo después de añadir o actualizar crates de terceros).

Algunos ejemplos pueden ayudarte a ilustrar cuándo se debe usar gtest de C++ o gtest de Rust:

  • QR cuenta con muy pocas funciones en la capa de Rust propia (solo es un código pegamento de FFI) y, por lo tanto, utiliza las pruebas unitarias de C++ existentes para probar la implementación de C++ y la de Rust (parametrizando las pruebas de modo que habiliten o inhabiliten Rust mediante un ScopedFeatureList).

  • La integración hipotética/WIP de PNG puede necesitar una implementación segura en memoria de las transformaciones de píxeles que proporciona libpng pero que faltan en el crate png, como por ejemplo, RGBA => BGRA o corrección gamma. Dicha función puede beneficiarse de pruebas independientes creadas en Rust.