SCP: Add support for library unit test routines

This commit is contained in:
Mark Pizzolato 2018-08-26 18:15:30 -07:00
parent 8ac1845b30
commit 0daa80e03d
10 changed files with 149 additions and 106 deletions

124
scp.c
View file

@ -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; i<cards; i++)
fprintf (f, "%05d ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n", i);
fclose (f);
return SCPE_OK;
}
#define TST(_stat) do { if (SCPE_OK != (stat = (_stat))) {sim_printf ("Error: %d - '%s' processing: " #_stat "\n", stat, sim_error_text(stat)); goto done; }} while (0)
static t_stat test_card (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];
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");
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;
}

22
scp.h
View file

@ -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

View file

@ -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<cards; i++)
fprintf (f, "%05d ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n", i);
fclose (f);
return SCPE_OK;
}
#include <setjmp.h>
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 */

View file

@ -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

View file

@ -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;
}

View file

@ -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
}

View file

@ -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 */

View file

@ -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
}

View file

@ -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;
}

View file

@ -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
}