#include <string.h>
#include <sc_unittest.h>
#include <sc_mmgr.h>
#include <sc_thread.h>
static void UT_SC_Thread_start(void);
static void UT_SC_Thread_start_null(void);
static void UT_SC_Mutex_lock(void);
static void UT_SC_Thread_testThreadMethod(void* data);
static int UT_SC_Thread_runThreadCount;
static void* UT_SC_Thread_runThreadLastData;
static mutex_t UT_SC_Mutex_mutex;
void UT_regist_sc_thread(void)
{
SC_Unittest_add("SC_Thread_start" , UT_SC_Thread_start);
SC_Unittest_add("SC_Thread_start_null" , UT_SC_Thread_start_null);
SC_Unittest_add("SC_Mutex_lock" , UT_SC_Mutex_lock);
}
static
void UT_SC_Thread_testThreadMethod(void* data)
{
UT_SC_Thread_runThreadCount++;
UT_SC_Thread_runThreadLastData = data;
}
static
void UT_SC_Mutex_testThreadMethod1(void* data)
{
int i;
SC_Mutex_lock(&UT_SC_Mutex_mutex);
UT_SC_Thread_runThreadLastData = data;
for (i = 0; i < 100; i++)
{
SC_sleep(1);
SC_assertNumber(i, UT_SC_Thread_runThreadCount);
UT_SC_Thread_runThreadCount++;
}
SC_Mutex_unlock(&UT_SC_Mutex_mutex);
}
static
void UT_SC_Mutex_testThreadMethod2(void* data)
{
int i;
SC_Mutex_lock(&UT_SC_Mutex_mutex);
UT_SC_Thread_runThreadLastData = data;
for (i = 0; i < 100; i++)
{
SC_sleep(1);
SC_assertNumber((i + 100), UT_SC_Thread_runThreadCount);
UT_SC_Thread_runThreadCount++;
}
SC_Mutex_unlock(&UT_SC_Mutex_mutex);
}
static
void UT_SC_Thread_start(void)
{
UT_SC_Thread_runThreadCount = 0;
UT_SC_Thread_runThreadLastData = NULL;
SC_Thread* thread = SC_Thread_new(
UT_SC_Thread_testThreadMethod, "ABC", 4);
thread->start(thread);
thread->join(thread);
SC_assertNumber(1, UT_SC_Thread_runThreadCount);
SC_assertString("ABC", UT_SC_Thread_runThreadLastData);
SC_Thread_delete(thread);
}
static
void UT_SC_Thread_start_null(void)
{
UT_SC_Thread_runThreadCount = 0;
UT_SC_Thread_runThreadLastData = NULL;
SC_Thread* thread = SC_Thread_new(
UT_SC_Thread_testThreadMethod, NULL, 0);
thread->start(thread);
thread->join(thread);
SC_assertNumber(1, UT_SC_Thread_runThreadCount);
SC_assert(NULL == UT_SC_Thread_runThreadLastData);
SC_Thread_delete(thread);
}
static
void UT_SC_Mutex_lock(void)
{
UT_SC_Thread_runThreadCount = 0;
UT_SC_Thread_runThreadLastData = NULL;
SC_Thread* thread1 = SC_Thread_new(
UT_SC_Mutex_testThreadMethod1, "ABC", 4);
SC_Thread* thread2 = SC_Thread_new(
UT_SC_Mutex_testThreadMethod2, "XYZ", 4);
SC_Mutex_init(&UT_SC_Mutex_mutex);
thread1->start(thread1);
SC_sleep(10);
thread2->start(thread2);
thread1->join(thread1);
thread2->join(thread2);
SC_Thread_delete(thread1);
SC_Thread_delete(thread2);
SC_Mutex_destroy(&UT_SC_Mutex_mutex);
}