SCP: Add support for library unit test routines
This commit is contained in:
parent
8ac1845b30
commit
0daa80e03d
10 changed files with 149 additions and 106 deletions
124
scp.c
124
scp.c
|
@ -14430,101 +14430,10 @@ return cptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compiled in unit tests for the various device oriented library
|
* Compiled in unit tests for the various device oriented library
|
||||||
modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc.
|
* 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)
|
static t_stat sim_library_unit_tests (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -14532,17 +14441,24 @@ DEVICE *dptr;
|
||||||
t_stat stat = SCPE_OK;
|
t_stat stat = SCPE_OK;
|
||||||
|
|
||||||
for (i = 0; (dptr = sim_devices[i]) != NULL; i++) {
|
for (i = 0; (dptr = sim_devices[i]) != NULL; i++) {
|
||||||
if (DEV_TYPE(dptr) == DEV_CARD)
|
switch (DEV_TYPE(dptr)) {
|
||||||
stat = test_card (dptr);
|
#if defined(USE_SIM_CARD)
|
||||||
else
|
case DEV_CARD:
|
||||||
if (DEV_TYPE(dptr) == DEV_TAPE)
|
stat = sim_card_test (dptr);
|
||||||
stat = test_tape (dptr);
|
break;
|
||||||
else
|
#endif
|
||||||
if (DEV_TYPE(dptr) == DEV_DISK)
|
case DEV_DISK:
|
||||||
stat = test_disk (dptr);
|
stat = sim_disk_test (dptr);
|
||||||
else
|
break;
|
||||||
if (DEV_TYPE(dptr) == DEV_ETHER)
|
case DEV_ETHER:
|
||||||
stat = test_ether (dptr);
|
stat = sim_ether_test (dptr);
|
||||||
|
break;
|
||||||
|
case DEV_TAPE:
|
||||||
|
stat = sim_tape_test (dptr);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
22
scp.h
22
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_value (*sim_vm_pc_value) (void);
|
||||||
extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
82
sim_card.c
82
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;
|
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)
|
t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
|
||||||
{
|
{
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t_stat sim_card_test (DEVICE *dptr)
|
||||||
|
{
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* USE_SIM_CARD */
|
#endif /* USE_SIM_CARD */
|
||||||
|
|
|
@ -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 char sim_ascii_to_six[128]; /* Map 7 bit ASCII to BCD */
|
||||||
extern CONST uint8 sim_parity_table[64]; /* 64 entry odd parity table */
|
extern CONST uint8 sim_parity_table[64]; /* 64 entry odd parity table */
|
||||||
|
|
||||||
|
/* Unit test routine */
|
||||||
|
extern sim_card_test (DEVICE *dptr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -51,6 +51,7 @@ Public routines:
|
||||||
sim_disk_set_async enable asynchronous operation
|
sim_disk_set_async enable asynchronous operation
|
||||||
sim_disk_clr_async disable asynchronous operation
|
sim_disk_clr_async disable asynchronous operation
|
||||||
sim_disk_data_trace debug support
|
sim_disk_data_trace debug support
|
||||||
|
sim_disk_test unit test routine
|
||||||
|
|
||||||
Internal routines:
|
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);
|
return WriteVirtualDiskSectors(hVHD, buf, sects, sectswritten, ctx->sector_size, lba);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
t_stat sim_disk_test (DEVICE *dptr)
|
||||||
|
{
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -94,6 +94,7 @@ t_offset sim_disk_size (UNIT *uptr);
|
||||||
t_bool sim_disk_vhd_support (void);
|
t_bool sim_disk_vhd_support (void);
|
||||||
t_bool sim_disk_raw_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);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
static int _eth_get_system_id (char *buf, size_t buf_size)
|
||||||
{memset (buf, 0, buf_size); return 0;}
|
{memset (buf, 0, buf_size); return 0;}
|
||||||
|
t_stat sim_ether_test (DEVICE *dptr)
|
||||||
|
{return SCPE_OK;}
|
||||||
#else /* endif unimplemented */
|
#else /* endif unimplemented */
|
||||||
|
|
||||||
const char *eth_capabilities(void)
|
const char *eth_capabilities(void)
|
||||||
|
@ -4018,4 +4020,9 @@ if (dev->eth_api == ETH_API_NAT)
|
||||||
sim_slirp_show ((SLIRP *)dev->handle, st);
|
sim_slirp_show ((SLIRP *)dev->handle, st);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t_stat sim_ether_test (DEVICE *dptr)
|
||||||
|
{
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
#endif /* USE_NETWORK */
|
#endif /* USE_NETWORK */
|
||||||
|
|
|
@ -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,
|
const uint8 *data, int used, size_t len,
|
||||||
size_t crc_len, const uint8 *crc_data, int32 status);
|
size_t crc_len, const uint8 *crc_data, int32 status);
|
||||||
t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */
|
t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */
|
||||||
|
|
||||||
const char *eth_capabilities(void);
|
const char *eth_capabilities(void);
|
||||||
|
t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,8 @@
|
||||||
sim_tape_show_dens show tape density
|
sim_tape_show_dens show tape density
|
||||||
sim_tape_set_async enable asynchronous operation
|
sim_tape_set_async enable asynchronous operation
|
||||||
sim_tape_clr_async disable asynchronous operation
|
sim_tape_clr_async disable asynchronous operation
|
||||||
|
aim_tape_test unit test routine
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sim_defs.h"
|
#include "sim_defs.h"
|
||||||
|
@ -2747,3 +2749,8 @@ else { /* otherwise get the den
|
||||||
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t_stat sim_tape_test (DEVICE *dptr)
|
||||||
|
{
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -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_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_set_asynch (UNIT *uptr, int latency);
|
||||||
t_stat sim_tape_clr_asynch (UNIT *uptr);
|
t_stat sim_tape_clr_asynch (UNIT *uptr);
|
||||||
|
t_stat sim_tape_test (DEVICE *dptr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue