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

#include <kc.h>
#include <kc_ut.h>
#include <kc_assert.h>
#include <kc_lock_guard.h>

// プロトタイプ宣言
static void test_lock_guard_init(void);
static void test_lock_guard_init_null(void);
static void test_lock_guard_init_invalid_mutex(void);
static void test_lock_guard_release_null(void);

/**
 * lock_guard 単体テストスイート
 */
void suite_lock_guard(void)
{
    KcUt *ut = KcUt_get_instance();
    ut->add(ut, UT_TESTCASE, "lock_gurad init/release", test_lock_guard_init);
    ut->add(ut, UT_TESTCASE, "lock_guard init failure (NULL)", test_lock_guard_init_null);
    ut->add(ut, UT_TESTCASE, "lock_guard init failure (invalid mutex)", test_lock_guard_init_invalid_mutex);
    ut->add(ut, UT_TESTCASE, "lock_guard release (NULL)", test_lock_guard_release_null);
}

/**
 * lock_guard 初期化/解放動作確認
 *
 * @process mtx_init を実施した mutex を渡し、kc_lock_guard_init を実行する。
 * @result  lock_guard が生成されること。
 *
 * @process lock_guard を渡し、kc_lock_guard_release を実行する。
 * @result lock_guard が解放され、lock_guard.mutex が NULL となること。
 */
static void test_lock_guard_init(void)
{
    mtx_t mutex;
    mtx_init(&mutex, mtx_plain | mtx_recursive);
    KcLockGuard lock_guard = kc_lock_guard_init(&mutex, __FILE__, __func__, __LINE__);
    assert_not_null(lock_guard.mutex);

    // Lock Guard 解放
    kc_lock_guard_release(&lock_guard);
    assert_null(lock_guard.mutex);
}

/**
 * lock_guard 初期化失敗動作確認(NULL指定)
 *
 * @process NULL を渡し、kc_lock_guard_init を実行する。
 * @result  errno が EINVAL に設定され、エラーが発生すること。
 */
static void test_lock_guard_init_null(void)
{
    KcLockGuard lock_guard = kc_lock_guard_init(NULL, __FILE__, __func__, __LINE__);
    assert_equals(EINVAL, errno);
    assert_null(lock_guard.mutex);
}

/**
 * lock_guard 初期化失敗動作確認(未初期化mutex指定)
 *
 * @process mtx_init を実施していない mutex を渡し、kc_lock_guard_init を実行する。
 * @result  初期化に失敗し、返された lock_gurad の mutex が NULL となること。
 */
static void test_lock_guard_init_invalid_mutex(void)
{
#if !(KC_IS_WINDOWS)
    // Windows の場合は、エラー応答でなく落ちる。
    mtx_t mutex;
    mtx_init(&mutex, mtx_plain | mtx_recursive);
    mtx_destroy(&mutex);
    KcLockGuard lock_guard = kc_lock_guard_init(&mutex, __FILE__, __func__, __LINE__);
    assert_null(lock_guard.mutex);
#endif
}

/**
 * lock_guard 解放(NULL) 指定
 *
 * @process mutex が NULL の KcLockGuard を指定し、kc_lock_guard_release を実行する。
 * @result 特にエラー等発生しないこと。
 */
static void test_lock_guard_release_null(void)
{
    mtx_t mutex;
    mtx_init(&mutex, mtx_plain | mtx_recursive);
    KcLockGuard lock_guard = kc_lock_guard_init(&mutex, __FILE__, __func__, __LINE__);
    assert_not_null(lock_guard.mutex);

    // Lock Guard 解放
    kc_lock_guard_release(&lock_guard);
    assert_null(lock_guard.mutex);

    kc_lock_guard_release(&lock_guard);
}