From 0daa80e03d1a821c237e75ab3dbbf6132b9de0f3 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 26 Aug 2018 18:15:30 -0700 Subject: [PATCH] SCP: Add support for library unit test routines --- scp.c | 124 +++++++++------------------------------------------- scp.h | 22 ++++++++++ sim_card.c | 82 +++++++++++++++++++++++++++++++++- sim_card.h | 3 ++ sim_disk.c | 6 +++ sim_disk.h | 1 + sim_ether.c | 7 +++ sim_ether.h | 2 +- sim_tape.c | 7 +++ sim_tape.h | 1 + 10 files changed, 149 insertions(+), 106 deletions(-) diff --git a/scp.c b/scp.c index 461d3ea8..d93910e7 100644 --- a/scp.c +++ b/scp.c @@ -14430,101 +14430,10 @@ return cptr; } /* - Compiled in unit tests for the various device oriented library - modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc. + * Compiled in unit tests for the various device oriented library + * modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc. */ -static t_stat create_card_file (const char *filename, int cards) -{ -FILE *f; -int i; - -f = fopen (filename, "w"); -if (f == NULL) - return SCPE_OPENERR; -for (i=0; iunits->flags & UNIT_RO) == 0) /* Punch device? */ - return SCPE_OK; - -sim_printf ("Testing %s device sim_card APIs\n", dptr->name); - -(void)remove("file1.deck"); -(void)remove("file2.deck"); -(void)remove("file3.deck"); -(void)remove("file4.deck"); - -TST(create_card_file ("File10.deck", 10)); -TST(create_card_file ("File20.deck", 20)); -TST(create_card_file ("File30.deck", 30)); -TST(create_card_file ("File40.deck", 40)); - -sprintf (cmd, "%s File10.deck", dptr->name); -TST(attach_cmd (0, cmd)); -sprintf (cmd, "%s File20.deck", dptr->name); -TST(attach_cmd (0, cmd)); -sprintf (cmd, "%s -S File30.deck", dptr->name); -TST(attach_cmd (0, cmd)); -sprintf (cmd, "%s -S -E File40.deck", dptr->name); -TST(attach_cmd (0, cmd)); -sprintf (saved_filename, "%s %s", dptr->name, dptr->units->filename); -show_cmd (0, dptr->name); -sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); -sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); -while (!sim_card_eof (dptr->units)) - TST(sim_read_card (dptr->units, card_image)); -sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); -sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); -sim_printf ("Detaching %s\n", dptr->name); -TST(detach_cmd (0, dptr->name)); -show_cmd (0, dptr->name); -sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); -sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); -sim_printf ("Attaching Saved Filenames: %s\n", saved_filename + strlen(dptr->name)); -TST(attach_cmd (0, saved_filename)); -show_cmd (0, dptr->name); -sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); -sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); -TST(detach_cmd (0, dptr->name)); -done: -(void)remove ("file10.deck"); -(void)remove ("file20.deck"); -(void)remove ("file30.deck"); -(void)remove ("file40.deck"); -#endif /* defined(USE_SIM_CARD) && defined(SIM_CARD_API) */ -return stat; -} - -static t_stat test_tape (DEVICE *dptr) -{ -return SCPE_OK; -} - -static t_stat test_disk (DEVICE *dptr) -{ -return SCPE_OK; -} - -static t_stat test_ether (DEVICE *dptr) -{ -return SCPE_OK; -} - - static t_stat sim_library_unit_tests (void) { int i; @@ -14532,17 +14441,24 @@ DEVICE *dptr; t_stat stat = SCPE_OK; for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { - if (DEV_TYPE(dptr) == DEV_CARD) - stat = test_card (dptr); - else - if (DEV_TYPE(dptr) == DEV_TAPE) - stat = test_tape (dptr); - else - if (DEV_TYPE(dptr) == DEV_DISK) - stat = test_disk (dptr); - else - if (DEV_TYPE(dptr) == DEV_ETHER) - stat = test_ether (dptr); + switch (DEV_TYPE(dptr)) { +#if defined(USE_SIM_CARD) + case DEV_CARD: + stat = sim_card_test (dptr); + break; +#endif + case DEV_DISK: + stat = sim_disk_test (dptr); + break; + case DEV_ETHER: + stat = sim_ether_test (dptr); + break; + case DEV_TAPE: + stat = sim_tape_test (dptr); + break; + default: + break; + } } return stat; } diff --git a/scp.h b/scp.h index 8d6fe6ef..b7b00bd7 100644 --- a/scp.h +++ b/scp.h @@ -412,6 +412,28 @@ extern t_bool (*sim_vm_fprint_stopped) (FILE *st, t_stat reason); extern t_value (*sim_vm_pc_value) (void); extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs); +/* Core SCP libraries can potentially have unit test routines. + These defines help implement consistent unit test functionality */ + +#define SIM_TEST_INIT \ + int test_stat; \ + const char *sim_test; \ + jmp_buf sim_test_env; \ + if ((test_stat = setjmp (sim_test_env))) { \ + sim_printf ("Error: %d - '%s' processing: %s\n", \ + test_stat, sim_error_text(test_stat), \ + sim_test); \ + return test_stat; \ + } +#define SIM_TEST(_stat) \ + do { \ + if (SCPE_OK != (test_stat = (_stat))) { \ + sim_test = #_stat; \ + longjmp (sim_test_env, test_stat); \ + } \ + } while (0) + + #ifdef __cplusplus } #endif diff --git a/sim_card.c b/sim_card.c index 9bfd34ba..ba62d8a9 100644 --- a/sim_card.c +++ b/sim_card.c @@ -1380,11 +1380,91 @@ t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, cons return SCPE_OK; } -#else +static t_stat create_card_file (const char *filename, int cards) +{ +FILE *f; +int i; + +f = fopen (filename, "w"); +if (f == NULL) + return SCPE_OPENERR; +for (i=0; i + +t_stat sim_card_test (DEVICE *dptr) +{ +t_stat stat = SCPE_OK; +#if defined(USE_SIM_CARD) && defined(SIM_CARD_API) +char cmd[CBUFSIZE]; +char saved_filename[4*CBUFSIZE]; +uint16 card_image[80]; +SIM_TEST_INIT; + +if ((dptr->units->flags & UNIT_RO) == 0) /* Punch device? */ + return SCPE_OK; + +sim_printf ("Testing %s device sim_card APIs\n", dptr->name); + +(void)remove("file1.deck"); +(void)remove("file2.deck"); +(void)remove("file3.deck"); +(void)remove("file4.deck"); + +SIM_TEST(create_card_file ("File10.deck", 10)); +SIM_TEST(create_card_file ("File20.deck", 20)); +SIM_TEST(create_card_file ("File30.deck", 30)); +SIM_TEST(create_card_file ("File40.deck", 40)); + +sprintf (cmd, "%s File10.deck", dptr->name); +SIM_TEST(attach_cmd (0, cmd)); +sprintf (cmd, "%s File20.deck", dptr->name); +SIM_TEST(attach_cmd (0, cmd)); +sprintf (cmd, "%s -S File30.deck", dptr->name); +SIM_TEST(attach_cmd (0, cmd)); +sprintf (cmd, "%s -S -E File40.deck", dptr->name); +SIM_TEST(attach_cmd (0, cmd)); +sprintf (saved_filename, "%s %s", dptr->name, dptr->units->filename); +show_cmd (0, dptr->name); +sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); +sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); +while (!sim_card_eof (dptr->units)) + SIM_TEST(sim_read_card (dptr->units, card_image)); +sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); +sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); +sim_printf ("Detaching %s\n", dptr->name); +SIM_TEST(detach_cmd (0, dptr->name)); +show_cmd (0, dptr->name); +sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); +sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); +sim_printf ("Attaching Saved Filenames: %s\n", saved_filename + strlen(dptr->name)); +SIM_TEST(attach_cmd (0, saved_filename)); +show_cmd (0, dptr->name); +sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units)); +sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units)); +SIM_TEST(detach_cmd (0, dptr->name)); +(void)remove ("file10.deck"); +(void)remove ("file20.deck"); +(void)remove ("file30.deck"); +(void)remove ("file40.deck"); +#endif /* defined(USE_SIM_CARD) && defined(SIM_CARD_API) */ +return stat; +} + +#else /* !defined(USE_SIM_CARD) */ t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { return SCPE_OK; } +t_stat sim_card_test (DEVICE *dptr) +{ + return SCPE_OK; +} + #endif /* USE_SIM_CARD */ diff --git a/sim_card.h b/sim_card.h index 05af7add..7bafdc28 100644 --- a/sim_card.h +++ b/sim_card.h @@ -130,6 +130,9 @@ extern CONST char sim_six_to_ascii[64]; /* Map BCD to ASCII */ extern CONST char sim_ascii_to_six[128]; /* Map 7 bit ASCII to BCD */ extern CONST uint8 sim_parity_table[64]; /* 64 entry odd parity table */ +/* Unit test routine */ +extern sim_card_test (DEVICE *dptr); + #ifdef __cplusplus } #endif diff --git a/sim_disk.c b/sim_disk.c index 66a62e92..855ae0b1 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -51,6 +51,7 @@ Public routines: sim_disk_set_async enable asynchronous operation sim_disk_clr_async disable asynchronous operation sim_disk_data_trace debug support + sim_disk_test unit test routine Internal routines: @@ -4663,3 +4664,8 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; return WriteVirtualDiskSectors(hVHD, buf, sects, sectswritten, ctx->sector_size, lba); } #endif + +t_stat sim_disk_test (DEVICE *dptr) +{ +return SCPE_OK; +} diff --git a/sim_disk.h b/sim_disk.h index 1f332479..a6fff7b1 100644 --- a/sim_disk.h +++ b/sim_disk.h @@ -94,6 +94,7 @@ t_offset sim_disk_size (UNIT *uptr); t_bool sim_disk_vhd_support (void); t_bool sim_disk_raw_support (void); void sim_disk_data_trace (UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason); +t_stat sim_disk_test (DEVICE *dptr); #ifdef __cplusplus } diff --git a/sim_ether.c b/sim_ether.c index c29e5dc3..af48bbab 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -968,6 +968,8 @@ void eth_show_dev (FILE* st, ETH_DEV* dev) {} static int _eth_get_system_id (char *buf, size_t buf_size) {memset (buf, 0, buf_size); return 0;} +t_stat sim_ether_test (DEVICE *dptr) + {return SCPE_OK;} #else /* endif unimplemented */ const char *eth_capabilities(void) @@ -4018,4 +4020,9 @@ if (dev->eth_api == ETH_API_NAT) sim_slirp_show ((SLIRP *)dev->handle, st); #endif } + +t_stat sim_ether_test (DEVICE *dptr) +{ +return SCPE_OK; +} #endif /* USE_NETWORK */ diff --git a/sim_ether.h b/sim_ether.h index b331086d..2c95ff89 100644 --- a/sim_ether.h +++ b/sim_ether.h @@ -378,8 +378,8 @@ void ethq_insert_data(ETH_QUE* que, int32 type, /* insert item into FIFO const uint8 *data, int used, size_t len, size_t crc_len, const uint8 *crc_data, int32 status); t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */ - const char *eth_capabilities(void); +t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */ #ifdef __cplusplus } diff --git a/sim_tape.c b/sim_tape.c index 3bbd2275..3d1004c3 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -88,6 +88,8 @@ sim_tape_show_dens show tape density sim_tape_set_async enable asynchronous operation sim_tape_clr_async disable asynchronous operation + aim_tape_test unit test routine + */ #include "sim_defs.h" @@ -2747,3 +2749,8 @@ else { /* otherwise get the den return SCPE_OK; } + +t_stat sim_tape_test (DEVICE *dptr) +{ +return SCPE_OK; +} diff --git a/sim_tape.h b/sim_tape.h index 9c5fc88d..b78f2d1f 100644 --- a/sim_tape.h +++ b/sim_tape.h @@ -209,6 +209,7 @@ t_stat sim_tape_set_dens (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_tape_show_dens (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat sim_tape_set_asynch (UNIT *uptr, int latency); t_stat sim_tape_clr_asynch (UNIT *uptr); +t_stat sim_tape_test (DEVICE *dptr); #ifdef __cplusplus }