Newer
Older
libkc / modules / test / src / test_thread.c
#include <stdio.h>
#include <errno.h>

#include <kc.h>
#include <kc_ut.h>
#include <kc_assert.h>
#include <kc_memory.h>
#include <kc_threads.h>

#include "ut.h"

// プロトタイプ宣言
static void test_thread_new(void);
static void test_thread_sleep(void);
static void test_thread_memory_error(void);

/**
 * KcThread 単体テストスイート
 */
void suite_thread(void)
{
    KcUt *ut = KcUt_get_instance();
    ut->add(ut, UT_TESTCASE, "thread new/delete", test_thread_new);
    ut->add(ut, UT_TESTCASE, "thread sleep", test_thread_sleep);
    ut->add(ut, UT_TESTCASE, "thread memory error", test_thread_memory_error);
}

static int pass_value = 0;
static int test_func(void *args)
{
    int *value = (int *)args;
    if (*value == 1)
    {
        pass_value &= 0x01;
    }
    if (*value == 2)
    {
        pass_value &= 0x02;
    }
    for (int i = 0; i < 10; i++)
    {
        printf("Thread %d : %03d\n", *value, i);
        KcThread_msleep(1, true);
    }
    return 0;
}

/**
 * Thread 生成/破棄。
 *
 * @process KcThread_new を実行する。。
 * @result KcThread が生成されること。
 *
 * @process KcThread_delete にて Thread を破棄する。
 * @result Thread が破棄されること。
 */
static void test_thread_new(void)
{
    KcThread *thread_1 = KcThread_new(test_func);
    KcThread *thread_2 = KcThread_new(test_func);

    pass_value = 0;
    bool is_alive_1 = thread_1->is_alive(thread_1);
    bool is_alive_2 = thread_2->is_alive(thread_2);
    assert_false(is_alive_1);
    assert_false(is_alive_2);
    int val_1 = 1;
    int val_2 = 2;
    thread_1->start(thread_1, &val_1);
    thread_2->start(thread_2, &val_2);
    KcThread_msleep(10, false);
    is_alive_1 = thread_1->is_alive(thread_1);
    is_alive_2 = thread_2->is_alive(thread_2);
    assert_true(is_alive_1);
    assert_true(is_alive_2);
    thread_1->join(thread_1);
    thread_2->join(thread_2);
    KcThread_delete(thread_1);
    KcThread_delete(thread_2);
}

/**
 * Thread sleep テスト。
 */
static void test_thread_sleep(void)
{
    KcThread_sleep(0, 100, false);
}

/**
 * メモリ確保エラー
 */
static void test_thread_memory_error(void)
{
    ut_alloc_control(0)
    {
        KcThread *thread = KcThread_new(test_func);
        assert_null(thread);
    }
}