#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); }