apple2ix/src/test/testcommon.c

189 lines
5.3 KiB
C

/*
* Apple // emulator for *ix
*
* This software package is subject to the GNU General Public License
* version 3 or later (your choice) as published by the Free Software
* Foundation.
*
* Copyright 2013-2015 Aaron Culliney
*
*/
#include "testcommon.h"
bool test_do_reboot = true;
char mdstr[(SHA_DIGEST_LENGTH*2)+1];
void (*testing_cyclesOverflow)(void) = NULL;
unsigned long (*testing_getCyclesCount)(void) = NULL;
// ----------------------------------------------------------------------------
void test_common_setup(void) {
}
void test_type_input(const char *input) {
debugger_setInputText(input, false);
}
void test_type_input_deterministically(const char *input) {
debugger_setInputText(input, true);
}
void test_breakpoint(void *arg) {
fprintf(GREATEST_STDOUT, "DISPLAY NOTE: busy-spinning in test_breakpoint(), needs gdb/lldb intervention to continue...\n");
volatile bool debug_continue = false;
while (!debug_continue) {
struct timespec ts = { .tv_sec=0, .tv_nsec=33333333 };
nanosleep(&ts, NULL);
}
}
void test_common_init(void) {
GREATEST_SET_BREAKPOINT_CB(test_breakpoint, NULL);
do_logging = false;// silence regular emulator logging
extern void emulator_ctors(void);
emulator_ctors();
char *envvar = NULL;
ASPRINTF(&envvar, "APPLE2IX_JSON=%s/.apple2.test.json", HOMEDIR);
assert(envvar);
putenv(envvar);
LEAK(envvar);
prefs_load();
prefs_setLongValue(PREF_DOMAIN_VIDEO, PREF_COLOR_MODE, COLOR);
prefs_setBoolValue(PREF_DOMAIN_KEYBOARD, PREF_KEYBOARD_CAPS, true);
prefs_setFloatValue(PREF_DOMAIN_VM, PREF_CPU_SCALE, CPU_SCALE_FASTEST);
prefs_setFloatValue(PREF_DOMAIN_VM, PREF_CPU_SCALE_ALT, CPU_SCALE_FASTEST);
prefs_save();
c_debugger_set_watchpoint(WATCHPOINT_ADDR);
if (0) {
c_debugger_set_timeout(15);
} else {
fprintf(stderr, "NOTE : RUNNING WITH DISPLAY\n");
fprintf(stderr, "Will spinloop on failed tests for debugger intervention\n");
c_debugger_set_timeout(0);
}
}
int test_setup_boot_disk(const char *fileName, int readonly) {
int err = 0;
char **path = NULL;
const unsigned int pathsCount = 4;
char *paths[pathsCount + 1] = {
NULL,
NULL,
NULL,
NULL,
NULL,
};
const char *fmts[pathsCount + 1] = {
"%s%sdisks/%s",
"%s%sdisks/demo/%s",
"%s%sdisks/blanks/%s",
"%s%sdisks/3rd-party-test/%s",
NULL,
};
#if defined(__APPLE__)
# if TARGET_OS_SIMULATOR || !TARGET_OS_EMBEDDED
const char *prefixPath = "";
const char *sep = "";
# else // TARGET_OS_EMBEDDED
const char *prefixPath = data_dir;
const char *sep = "/";
# endif
do {
const char **fmtPtr = &fmts[0];
unsigned int idx = 0;
while (*fmtPtr) {
const char *fmt = *fmtPtr;
char *diskFile = NULL;
CFStringRef fileString = NULL;
CFURLRef fileURL = NULL;
ASPRINTF(&diskFile, fmt, prefixPath, sep, fileName);
assert(diskFile);
fileString = CFStringCreateWithCString(kCFAllocatorDefault, diskFile, kCFStringEncodingUTF8);
assert(fileString);
# if TARGET_OS_SIMULATOR || !TARGET_OS_EMBEDDED
// Use disks directly out of bundle ... is this OKAY?
fileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), fileString, NULL, NULL);
# else
// AppDelegate should have copied disks to a R/W location
fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, fileString, kCFURLPOSIXPathStyle, /*isDirectory*/false);
# endif
if (fileURL) {
CFStringRef filePath = CFURLCopyFileSystemPath(fileURL, kCFURLPOSIXPathStyle);
assert(filePath);
CFIndex length = CFStringGetLength(filePath);
CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8);
char *disk0 = (char *)MALLOC(maxSize);
if (CFStringGetCString(filePath, disk0, maxSize, kCFStringEncodingUTF8)) {
paths[idx++] = disk0;
}
CFRELEASE(filePath);
CFRELEASE(fileURL);
}
FREE(diskFile);
CFRELEASE(fileString);
++fmtPtr;
}
} while (0);
#else // !__APPLE__
do {
const char **fmtPtr = &fmts[0];
unsigned int idx = 0;
while (*fmtPtr) {
const char *fmt = *fmtPtr++;
ASPRINTF(&paths[idx++], fmt, data_dir, "/", fileName);
}
} while (0);
#endif
path = &paths[0];
while (*path) {
char *disk = *path;
++path;
err = disk6_insert(0, disk, readonly) != NULL;
if (!err) {
break;
}
size_t len = strlen(disk);
disk[len-3] = '\0'; // try again without '.gz' extension
err = disk6_insert(0, disk, readonly) != NULL;
if (!err) {
break;
}
}
path = &paths[0];
while (*path) {
char *disk = *path;
++path;
FREE(disk);
}
return err;
}
void sha1_to_str(const uint8_t * const md, char *buf) {
int i=0;
for (int j=0; j<SHA_DIGEST_LENGTH; j++, i+=2) {
sprintf(buf+i, "%02X", md[j]);
}
}