static void run_tests()
{
    qeo_factory_t *factory;
    clock_t start = clock();

    pid_t pid = getpid();

    for (unsigned int i = 0; i < N; ++i){
        log_verbose("[PID %d] Creating factory %d", pid, i);
        assert(NULL != (factory = qeo_factory_create_by_id(QEO_IDENTITY_DEFAULT)));
        usleep(100000);
        log_verbose("[PID %d] Closing factory %d", pid, i);
        qeo_factory_close(factory);
    }
    double time_seconds = ((clock() - start) * 1.0) / CLOCKS_PER_SEC;
    printf("[PID %d] Creating/closing %d factories took %2.3fs CPU time\r\n", pid, N, time_seconds);
}
static void run_test_read()
{
    qeo_factory_t *factory;
    qeo_state_reader_t *reader;
    qeo_state_reader_listener_t sr_cbs = {
        .on_update = on_update
    };
    sem_init(&_sync, 0, 0);

    _pid = getpid();

    log_verbose("[PID %d] Creating factory", _pid);
    assert(NULL != (factory = qeo_factory_create_by_id(QEO_IDENTITY_DEFAULT)));
    assert(NULL != (reader = qeo_factory_create_state_reader(factory, _tsm_types, &sr_cbs, 0)));
    sem_wait(&_sync);

    log_verbose("[PID %d] Closing factory", _pid);
    //qeo_state_change_reader_close(change);
    qeo_state_reader_close(reader);
    qeo_factory_close(factory);
}
static bool run_test_write()
{
    qeo_factory_t *factory;
    qeo_state_writer_t *writer;
    int status;
    int ok = 0;

    pid_t pid = getpid();

    log_verbose("[PID %d] Creating factory", pid);
    assert(NULL != (factory = qeo_factory_create_by_id(QEO_IDENTITY_DEFAULT)));
    assert(NULL != (writer = qeo_factory_create_state_writer(factory, _tsm_types, NULL, 0)));
    _current = &_types1;
    
    log_verbose("[PID %d] Writing sample 1", pid);
    _current->string = string1;
    _current->i8 = 1;
    qeo_state_writer_write(writer, _current);
    sleep(1);

    log_verbose("go to suspend");
    qeo_bgns_suspend();
    log_verbose("[PID %d] Writing sample 3", pid); //should not arrive since suspended!
    _current->string = string3;
    _current->i8 = 3;
    qeo_state_writer_write(writer, _current);
    sleep(1);

    log_verbose("[PID %d] Closing factory", pid);
    qeo_state_writer_close(writer);
    qeo_factory_close(factory);

    log_verbose("[PID %d] Creating factory", pid);
    assert(NULL != (factory = qeo_factory_create_by_id(QEO_IDENTITY_DEFAULT)));
    assert(NULL != (writer = qeo_factory_create_state_writer(factory, _tsm_types, NULL, 0)));

    log_verbose("[PID %d] Writing sample 2", pid);
    _current->string = string2;
    _current->i8 = 2;
    qeo_state_writer_write(writer, _current);


        log_verbose("Waiting for process with ID %d", _pid);
        assert(_pid == waitpid(_pid, &status, 0));
        if (WIFEXITED(status)) {
            ok = 1;
            printf("ok\n");
        } else if (WIFSIGNALED(status)) {
            printf("killed by signal %s\n", strsignal(WTERMSIG(status)));
        } else if (WIFSTOPPED(status)) {
            printf("stopped by signal %s\n", strsignal(WSTOPSIG(status)));
        } else if (WIFCONTINUED(status)) {
            printf("continued\n");
        }


    log_verbose("[PID %d] Closing factory", pid);
    qeo_state_writer_close(writer);
    qeo_factory_close(factory);
    return (ok == 1);

}