test-journal-toggle.c [plain text]
#include <TargetConditionals.h>
#if !TARGET_OS_EMBEDDED
#include <unistd.h>
#include <pthread.h>
#include "hfs-tests.h"
#include "test-utils.h"
#include "disk-image.h"
#include "systemx.h"
TEST(journal_toggle)
#define DMG "/tmp/journal-toggle.sparseimage"
static disk_image_t *di;
static volatile bool run = true;
void *thread1func(__unused void *arg)
{
char *file;
asprintf(&file, "%s/file", di->mount_point);
while (run) {
assert(!systemx("/usr/bin/touch", file, NULL));
assert(!systemx("/bin/rm", file, NULL));
}
pthread_exit(NULL);
}
void *thread2func(__unused void *arg)
{
while (run) {
assert(!systemx("/usr/sbin/diskutil", SYSTEMX_QUIET, "disableJournal", di->mount_point, NULL));
assert(!systemx("/usr/sbin/diskutil", SYSTEMX_QUIET, "enableJournal", di->mount_point, NULL));
}
pthread_exit(NULL);
}
int run_journal_toggle(__unused test_ctx_t *ctx)
{
di = disk_image_create(DMG, &(disk_image_opts_t){
.size = 32 * 1024 * 1024
});
pthread_t thread1, thread2;
assert(!pthread_create(&thread1, NULL, thread1func, NULL));
assert(!pthread_create(&thread2, NULL, thread2func, NULL));
sleep(10);
run = false;
void *ret1, *ret2;
assert(!pthread_join(thread1, &ret1));
assert(!pthread_join(thread2, &ret2));
return 0;
}
#endif // !TARGET_OS_EMBEDDED