mirror of https://github.com/ipxe/ipxe.git
[test] Run self-tests as an embedded image
Allow iPXE to exit after running self-tests, rather than locking the machine. Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/6/head
parent
b0a1ad9242
commit
da76a489d6
|
@ -60,6 +60,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
#define ERRFILE_null_sanboot ( ERRFILE_CORE | 0x00140000 )
|
#define ERRFILE_null_sanboot ( ERRFILE_CORE | 0x00140000 )
|
||||||
#define ERRFILE_edd ( ERRFILE_CORE | 0x00150000 )
|
#define ERRFILE_edd ( ERRFILE_CORE | 0x00150000 )
|
||||||
#define ERRFILE_parseopt ( ERRFILE_CORE | 0x00160000 )
|
#define ERRFILE_parseopt ( ERRFILE_CORE | 0x00160000 )
|
||||||
|
#define ERRFILE_test ( ERRFILE_CORE | 0x00170000 )
|
||||||
|
|
||||||
#define ERRFILE_eisa ( ERRFILE_DRIVER | 0x00000000 )
|
#define ERRFILE_eisa ( ERRFILE_DRIVER | 0x00000000 )
|
||||||
#define ERRFILE_isa ( ERRFILE_DRIVER | 0x00010000 )
|
#define ERRFILE_isa ( ERRFILE_DRIVER | 0x00010000 )
|
||||||
|
|
|
@ -29,9 +29,11 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ipxe/test.h>
|
#include <ipxe/test.h>
|
||||||
#include <ipxe/init.h>
|
#include <ipxe/init.h>
|
||||||
|
#include <ipxe/image.h>
|
||||||
|
|
||||||
/** Current self-test set */
|
/** Current self-test set */
|
||||||
static struct self_test *current_tests;
|
static struct self_test *current_tests;
|
||||||
|
@ -100,8 +102,9 @@ static void run_tests ( struct self_test *tests ) {
|
||||||
/**
|
/**
|
||||||
* Run all self-tests
|
* Run all self-tests
|
||||||
*
|
*
|
||||||
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static void test_init ( void ) {
|
static int run_all_tests ( void ) {
|
||||||
struct self_test *tests;
|
struct self_test *tests;
|
||||||
unsigned int failures = 0;
|
unsigned int failures = 0;
|
||||||
unsigned int assertions = 0;
|
unsigned int assertions = 0;
|
||||||
|
@ -125,15 +128,50 @@ static void test_init ( void ) {
|
||||||
printf ( " with %d assertion failures", assertions );
|
printf ( " with %d assertion failures", assertions );
|
||||||
}
|
}
|
||||||
printf ( "\n" );
|
printf ( "\n" );
|
||||||
|
return -EINPROGRESS;
|
||||||
} else {
|
} else {
|
||||||
printf ( "OK: all %d tests passed\n", total );
|
printf ( "OK: all %d tests passed\n", total );
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Lock system */
|
static int test_image_probe ( struct image *image __unused ) {
|
||||||
while ( 1 ) {}
|
return -ENOTTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_image_exec ( struct image *image __unused ) {
|
||||||
|
return run_all_tests();
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct image_type test_image_type = {
|
||||||
|
.name = "self-tests",
|
||||||
|
.probe = test_image_probe,
|
||||||
|
.exec = test_image_exec,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test_image_free ( struct refcnt *refcnt __unused ) {
|
||||||
|
/* Do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct image test_image = {
|
||||||
|
.refcnt = REF_INIT ( test_image_free ),
|
||||||
|
.name = "<TESTS>",
|
||||||
|
.type = &test_image_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test_init ( void ) {
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Register self-tests image */
|
||||||
|
if ( ( rc = register_image ( &test_image ) ) != 0 ) {
|
||||||
|
DBG ( "Could not register self-test image: %s\n",
|
||||||
|
strerror ( rc ) );
|
||||||
|
/* No way to report failure */
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Self-test initialisation function */
|
/** Self-test initialisation function */
|
||||||
struct init_fn test_init_fn __init_fn ( INIT_NORMAL ) = {
|
struct init_fn test_init_fn __init_fn ( INIT_EARLY ) = {
|
||||||
.initialise = test_init,
|
.initialise = test_init,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue