Add unittest for auto coverage 55/234655/4
authorJihoon Jung <jh8801.jung@samsung.com>
Wed, 27 May 2020 23:26:01 +0000 (08:26 +0900)
committerJihoon Jung <jh8801.jung@samsung.com>
Thu, 28 May 2020 06:35:14 +0000 (15:35 +0900)
Change-Id: Ifd256d2ee3ad0b0b4ccfedc36654f1e037dcd938
Signed-off-by: Jihoon Jung <jh8801.jung@samsung.com>
18 files changed:
CMakeLists.txt
packaging/capi-network-smartcard.spec
unittest/CMakeLists.txt [new file with mode: 0644]
unittest/include/assert_local.h [new file with mode: 0755]
unittest/include/tct_common.h [new file with mode: 0755]
unittest/include/testcase.h [new file with mode: 0755]
unittest/mock/smartcard-mock.c [new file with mode: 0755]
unittest/run_coverage.sh [new file with mode: 0755]
unittest/tct-smartcard-core.cpp [new file with mode: 0755]
unittest/tct-smartcard-core_mobile.h [new file with mode: 0755]
unittest/tct-smartcard-core_tizeniot.h [new file with mode: 0755]
unittest/tct-smartcard-core_wearable.h [new file with mode: 0755]
unittest/utc-smartcard-channel.c [new file with mode: 0755]
unittest/utc-smartcard-reader.c [new file with mode: 0755]
unittest/utc-smartcard-service.c [new file with mode: 0755]
unittest/utc-smartcard-session.c [new file with mode: 0755]
unittest/utc-smartcard.c [new file with mode: 0755]
unittest/utc-smartcard.h [new file with mode: 0755]

index e056d1ea4bcf853787e3f9da0e99eee01f2fc2d0..7c86e57bf12be1c8902f56dea61834bfed761399 100644 (file)
@@ -83,4 +83,6 @@ CONFIGURE_FILE(
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIBDIR}/pkgconfig)
 
 ADD_SUBDIRECTORY(test)
-
+IF(BUILD_GCOV)
+       ADD_SUBDIRECTORY(unittest)
+ENDIF(BUILD_GCOV)
index e9c7557152507cb61c6aa712712aea2a222e0821..f0806a412adbe0b70acbeaa7e98b84e822549386 100644 (file)
@@ -13,6 +13,11 @@ BuildRequires:  pkgconfig(smartcard-service-common)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(capi-system-info)
 
+%if 0%{?gcov:1}
+BuildRequires:  gtest-devel
+BuildRequires:  lcov
+%endif
+
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 
@@ -68,6 +73,13 @@ mkdir -p %{buildroot}%{_datadir}/gcov/obj
 install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj
 %endif
 
+%check
+%if 0%{?gcov:1}
+pushd unittest
+./run_coverage.sh
+popd
+%endif
+
 %post -p /sbin/ldconfig
 
 %postun -p /sbin/ldconfig
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f3409c2
--- /dev/null
@@ -0,0 +1,48 @@
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
+
+SET(UNITTEST_NAME "tct-smartcard-core")
+
+SET(CAPI_LIB "capi-network-smartcard")
+SET(TC_SOURCES
+    utc-smartcard-channel.c
+    utc-smartcard-reader.c
+    utc-smartcard-service.c
+    utc-smartcard-session.c
+    utc-smartcard.c
+)
+
+PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED
+    capi-base-common
+    dlog
+    capi-system-info
+    glib-2.0
+    gio-unix-2.0
+)
+
+INCLUDE_DIRECTORIES(
+    ${${CAPI_LIB}_INCLUDE_DIRS}
+    ${CMAKE_SOURCE_DIR}/src/include
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
+)
+
+ADD_DEFINITIONS( -DMOBILE )
+
+SET(SMARTCARD_MOCK "smartcard-mock")
+SET(SMARTCARD_MOCK_SRCS
+       mock/smartcard-mock.c)
+SET(SMARTCARD_MOCK_CFLAGS "${CMAKE_C_FLAGS}" )
+ADD_LIBRARY(${SMARTCARD_MOCK} SHARED ${SMARTCARD_MOCK_SRCS})
+SET_TARGET_PROPERTIES(${SMARTCARD_MOCK} PROPERTIES
+       COMPILE_FLAGS ${SMARTCARD_MOCK_CFLAGS}
+)
+
+ADD_EXECUTABLE(${UNITTEST_NAME} ${UNITTEST_NAME}.cpp ${TC_SOURCES} )
+TARGET_LINK_LIBRARIES(${UNITTEST_NAME}
+    ${${CAPI_LIB}_LIBRARIES}
+    ${LIB_NAME}
+    gtest
+    pthread
+    capi-network-smartcard
+)
+
+# INSTALL(PROGRAMS ${UNITTEST_NAME} DESTINATION ${BIN_INSTALL_DIR})
diff --git a/unittest/include/assert_local.h b/unittest/include/assert_local.h
new file mode 100755 (executable)
index 0000000..7c88a02
--- /dev/null
@@ -0,0 +1,118 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _ASSERT_H_
+#define _ASSERT_H_
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define assert(exp) \
+    do { \
+        if (!(exp)) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert Fail; Following expression is not true: %s\n", \
+                __FILE__, __LINE__, #exp); \
+            return 1; \
+        } \
+    } while (0)
+
+#define assert_eq(var, ref) \
+    do { \
+        if (var != ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) and (%s == 0x%x) are not equal\n", \
+                __FILE__, __LINE__, #var, (int)var, #ref, (int)ref); \
+            return 1; \
+        } \
+    } while (0)
+
+#define assert_eq_no_return(var, ref) \
+    do { \
+        if (var != ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) and (%s == 0x%x) are not equal\n", \
+                __FILE__, __LINE__, #var, (int)var, #ref, (int)ref); \
+            return ; \
+        } \
+    } while (0)
+
+#define assert_neq_no_return(var, ref) \
+    do { \
+        if (var == ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) and (%s == 0x%x) are equal\n", \
+                __FILE__, __LINE__,  #var, (int)var, #ref, (int)ref); \
+            return ; \
+        } \
+    } while (0)
+
+#define assert_neq(var, ref) \
+    do { \
+        if (var == ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) and (%s == 0x%x) are equal\n", \
+                __FILE__, __LINE__,  #var, (int)var, #ref, (int)ref); \
+            return 1; \
+        } \
+    } while (0)
+
+#define assert_gt(var, ref) \
+    do { \
+        if (var <= ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) is not greater than (%s == 0x%x)\n", \
+            __FILE__, __LINE__,  #var, (int)var, #ref, (int)ref); \
+            return 1; \
+        } \
+    } while (0)
+
+#define assert_geq(var, ref) \
+    do { \
+        if (var < ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) is not greater than or equal to (%s == 0x%x)\n", \
+                __FILE__, __LINE__,  #var, (int)var, #ref, (int)ref); \
+            return 1; \
+        } \
+    } while (0)
+
+#define assert_lt(var, ref) \
+    do { \
+        if (var >= ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) is not lower than (%s == 0x%x)\n", \
+                __FILE__, __LINE__,  #var, (int)var, #ref, (int)ref); \
+            return 1; \
+        } \
+    } while (0)
+
+#define assert_leq(var, ref) \
+    do { \
+        if (var > ref) { \
+            fprintf(stderr, \
+                "\n[TCT][%s][Line : %d] Assert fail; Values (%s == 0x%x) is not lower than or equal to (%s == 0x%x)\n", \
+            __FILE__, __LINE__,  #var, (int)var, #ref, (int)ref); \
+            return 1; \
+        } \
+    } while (0)
+
+#ifdef __cplusplus
+}
+#endif
+#endif //  _ASSERT_H_
diff --git a/unittest/include/tct_common.h b/unittest/include/tct_common.h
new file mode 100755 (executable)
index 0000000..ebe9193
--- /dev/null
@@ -0,0 +1,218 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _TCT_COMMON_H_
+#define _TCT_COMMON_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "assert_local.h"
+
+#include <malloc.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#define CONFIG_LINE_LEN_MAX                    2048
+#define CONFIG_VALUE_LEN_MAX           1024
+
+#define UTC_LOG "utc.log"
+#define ERR_UTC_LOG "utc_error.log"
+#define TC_RESULT "tc_result.log"
+
+FILE *g_fpLog;
+FILE *g_fpLogDump;
+int g_Serr;
+
+int old_Serr;
+
+#define FPRINTF(...) {\
+       g_fpLog = fopen(ERR_LOG, "a");\
+       fprintf(g_fpLog, __VA_ARGS__);\
+       fclose(g_fpLog);\
+}
+
+#define DUMP_UTC_ERRLOG() {\
+       g_Serr = dup(fileno(stderr));\
+       g_fpLogDump = freopen(ERR_UTC_LOG, "w", stderr);\
+       fflush(stderr);\
+}
+
+#define CLOSE_UTC_ERRLOG() {\
+       if(g_fpLogDump) \
+       {\
+               if (g_Serr != -1)\
+               {\
+                       old_Serr = fileno(stderr);\
+                       if(old_Serr != -1)\
+                       {\
+                               dup2(g_Serr, old_Serr);\
+                       }\
+                       close(g_Serr);\
+               }\
+               fclose(g_fpLogDump);\
+       }\
+}
+
+#define PRINT_TC_RESULT(...) {\
+       g_fpLog = fopen(TC_RESULT, "w");\
+       fprintf(g_fpLog, __VA_ARGS__);\
+       fclose(g_fpLog);\
+}
+
+
+#define FREE_MEMORY_TC(buffer) {\
+       if ( buffer != NULL )\
+{\
+       free(buffer);\
+       buffer = NULL;\
+}\
+}
+
+
+#define IS_FEATURE_SUPPORTED(feature_name, featureFlag, ModuleName)\
+{\
+       if ( !(TCTCheckSystemInfoFeatureSupported(feature_name, ModuleName)) )\
+{\
+       featureFlag = false;\
+}\
+       else\
+{\
+       featureFlag = true;\
+}\
+}
+
+#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+       else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+       return 1;\
+}\
+}
+
+#define PRINT_RESULT_NORETURN(eCompare, eRetVal, API, Error) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+       else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+}\
+}
+
+#define PRINT_RESULT_CLEANUP(eCompare, eRetVal, API, Error, FreeResource) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+       FreeResource;\
+       return 1;\
+}\
+}
+
+#define CHECK_VALUE_STRING(StringVariable, API) {\
+       if ( StringVariable == NULL )\
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
+       return 1;\
+}\
+       else if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] value returned = %s\\n", __LINE__, API_NAMESPACE, StringVariable);\
+}\
+       free(StringVariable);\
+       StringVariable = NULL;\
+}
+
+#define CHECK_VALUE_INT(Variable, API) {\
+       if ( Variable == 0 )\
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is Zero\\n", __LINE__, API_NAMESPACE, API);\
+       return 1;\
+}\
+       else if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] value returned = %d\\n", __LINE__, API_NAMESPACE, Variable);\
+}\
+}
+
+#define CHECK_HANDLE(Handle, API) {\
+       if ( Handle == NULL )\
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = Handle returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
+       return 1;\
+}\
+}
+
+#define FREE_MEMORY(buffer) {\
+       if ( buffer != NULL )\
+{\
+       free(buffer);\
+       buffer = NULL;\
+}\
+}
+
+bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName){
+    return false;
+}
+char* TCTSystemInfoGetError(int nRet){
+    return NULL;
+}
+bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule){
+    return false;
+}
+bool GetValueForTCTSetting(char* pstrKeyString, char* pstrValue, char* pstrModule){
+    return false;
+}
+
+#define dlog_print( type, tag, ...) do{ \
+    fprintf(stdout,  ##__VA_ARGS__ ); \
+    fprintf(stdout,  "\n" ); \
+} while(0)
+
+#define PRINT_UTC_LOG(...) do{ \
+    fprintf(stdout,  ##__VA_ARGS__ ); \
+    fprintf(stdout,  "\n" ); \
+} while(0)
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _TCT_COMMON_H_
diff --git a/unittest/include/testcase.h b/unittest/include/testcase.h
new file mode 100755 (executable)
index 0000000..febac28
--- /dev/null
@@ -0,0 +1,40 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _TESTCASE_H_
+#define _TESTCASE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* pointer to startup/cleanup functions */
+typedef void (*void_fun_ptr)(void);
+
+/* pointer to testcase functions */
+typedef int (*tc_fun_ptr)(void);
+
+/* struct describing specific testcase */
+typedef struct testcase_s {
+    const char* name;
+    tc_fun_ptr function;
+    void_fun_ptr startup;
+    void_fun_ptr cleanup;
+} testcase;
+
+#ifdef __cplusplus
+}
+#endif
+#endif // _TESTCASE_H_
diff --git a/unittest/mock/smartcard-mock.c b/unittest/mock/smartcard-mock.c
new file mode 100755 (executable)
index 0000000..e342d54
--- /dev/null
@@ -0,0 +1,321 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include <system_info.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#ifndef API
+#define API __attribute__ ((visibility("default")))
+#endif
+
+struct _SmartcardServiceSeService;
+typedef struct _SmartcardServiceSeService SmartcardServiceSeService;
+typedef struct _SmartcardServiceSeServiceIface SmartcardServiceSeServiceIface;
+
+struct _SmartcardServiceSeServiceIface
+{
+  GTypeInterface parent_iface;
+
+  gboolean (*handle_se_service) (
+    SmartcardServiceSeService *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_shutdown) (
+    SmartcardServiceSeService *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id);
+
+  void (*reader_inserted) (
+    SmartcardServiceSeService *object,
+    guint arg_reader_id,
+    const gchar *arg_reader_name);
+
+  void (*reader_removed) (
+    SmartcardServiceSeService *object,
+    guint arg_reader_id,
+    const gchar *arg_reader_name);
+};
+
+struct _SmartcardServiceReader;
+typedef struct _SmartcardServiceReader SmartcardServiceReader;
+typedef struct _SmartcardServiceReaderIface SmartcardServiceReaderIface;
+
+struct _SmartcardServiceReaderIface
+{
+  GTypeInterface parent_iface;
+
+  gboolean (*handle_open_session) (
+    SmartcardServiceReader *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id,
+    guint arg_reader_id);
+};
+
+struct _SmartcardServiceSession;
+typedef struct _SmartcardServiceSession SmartcardServiceSession;
+typedef struct _SmartcardServiceSessionIface SmartcardServiceSessionIface;
+
+struct _SmartcardServiceSessionIface
+{
+  GTypeInterface parent_iface;
+
+  gboolean (*handle_close_session) (
+    SmartcardServiceSession *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id,
+    guint arg_session_id);
+
+  gboolean (*handle_get_atr) (
+    SmartcardServiceSession *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id,
+    guint arg_session_id);
+
+  gboolean (*handle_open_channel) (
+    SmartcardServiceSession *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id,
+    guint arg_session_id,
+    guint arg_type,
+    GVariant *arg_aid,
+    guchar arg_P2);
+};
+
+struct _SmartcardServiceChannel;
+typedef struct _SmartcardServiceChannel SmartcardServiceChannel;
+typedef struct _SmartcardServiceChannelIface SmartcardServiceChannelIface;
+
+struct _SmartcardServiceChannelIface
+{
+  GTypeInterface parent_iface;
+
+  gboolean (*handle_close_channel) (
+    SmartcardServiceChannel *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id,
+    guint arg_channel_id);
+
+  gboolean (*handle_transmit) (
+    SmartcardServiceChannel *object,
+    GDBusMethodInvocation *invocation,
+    guint arg_service_id,
+    guint arg_channel_id,
+    GVariant *arg_command);
+};
+
+static GVariant *_convert_array_to_variant(unsigned char *array, int size)
+{
+       GVariantBuilder builder;
+       int i;
+
+       g_variant_builder_init(&builder, G_VARIANT_TYPE("a(y)"));
+
+       for (i = 0; i < size; i++)
+               g_variant_builder_add(&builder, "(y)", array[i]);
+
+       return g_variant_builder_end(&builder);
+}
+
+API int system_info_get_platform_bool(const char *key, bool *value)
+{
+       *value = true;
+       return SYSTEM_INFO_ERROR_NONE;
+}
+
+API gulong g_signal_connect_data(gpointer instance,
+               const gchar *detailed_signal,
+               GCallback c_handler,
+               gpointer data,
+               GClosureNotify destroy_data,
+               GConnectFlags connect_flags)
+{
+       return 0;
+}
+
+API SmartcardServiceSeService *smartcard_service_se_service_proxy_new_for_bus_sync (
+               GBusType             bus_type,
+               GDBusProxyFlags      flags,
+               const gchar         *name,
+               const gchar         *object_path,
+               GCancellable        *cancellable,
+               GError             **error)
+{
+       return (void *)1234;
+}
+
+API gboolean smartcard_service_se_service_call_se_service_sync (
+               SmartcardServiceSeService *proxy,
+               gint *out_result,
+               guint *out_handle,
+               GVariant **out_readers,
+               GCancellable *cancellable,
+               GError **error)
+{
+       *out_handle = 1234;
+       *out_result = 0;
+
+       GVariantBuilder *builder = NULL;
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a(us)"));
+       g_variant_builder_open(builder, G_VARIANT_TYPE("(us)"));
+       g_variant_builder_add(builder, "u", g_variant_new_uint32(1));
+       g_variant_builder_add(builder, "s", "SIM");
+       g_variant_builder_close(builder);
+       *out_readers = g_variant_builder_end(builder);
+
+       return true;
+}
+
+API gboolean smartcard_service_se_service_call_shutdown_sync (
+               SmartcardServiceSeService *proxy,
+               guint arg_service_id,
+               gint *out_result,
+               GCancellable *cancellable,
+               GError **error)
+{
+       *out_result = 0;
+       return true;
+}
+
+API SmartcardServiceReader *smartcard_service_reader_proxy_new_for_bus_sync (
+               GBusType             bus_type,
+               GDBusProxyFlags      flags,
+               const gchar         *name,
+               const gchar         *object_path,
+               GCancellable        *cancellable,
+               GError             **error)
+{
+       return (void *)1234;
+}
+
+API gboolean smartcard_service_reader_call_open_session_sync (
+               SmartcardServiceReader *proxy,
+               guint arg_service_id,
+               guint arg_reader_id,
+               gint *out_result,
+               guint *out_handle,
+               GCancellable *cancellable,
+               GError **error)
+{
+       *out_handle = 1234;
+       *out_result = 0;
+       return true;
+}
+
+API SmartcardServiceSession *smartcard_service_session_proxy_new_for_bus_sync (
+               GBusType             bus_type,
+               GDBusProxyFlags      flags,
+               const gchar         *name,
+               const gchar         *object_path,
+               GCancellable        *cancellable,
+               GError             **error)
+{
+       return (void *)1234;
+}
+
+API gboolean smartcard_service_session_call_get_atr_sync (
+               SmartcardServiceSession *proxy,
+               guint arg_service_id,
+               guint arg_session_id,
+               gint *out_result,
+               GVariant **out_atr,
+               GCancellable *cancellable,
+               GError **error)
+{
+       unsigned char array[] = {0x01, 0x02, 0x03};
+       *out_atr = _convert_array_to_variant(array, 3);
+       *out_result = 0;
+       return true;
+}
+
+API gboolean smartcard_service_session_call_open_channel_sync (
+               SmartcardServiceSession *proxy,
+               guint arg_service_id,
+               guint arg_session_id,
+               guint arg_type,
+               GVariant *arg_aid,
+               guchar arg_P2,
+               gint *out_result,
+               guint *out_handle,
+               gint *out_channel_number,
+               GVariant **out_select_response,
+               GCancellable *cancellable,
+               GError **error)
+{
+       unsigned char array[] = {0x01, 0x02, 0x03};
+       *out_result = 0;
+       *out_handle = 1234;
+       *out_channel_number = 1;
+       *out_select_response = _convert_array_to_variant(array, 3);
+       return true;
+}
+
+API gboolean smartcard_service_session_call_close_session_sync (
+               SmartcardServiceSession *proxy,
+               guint arg_service_id,
+               guint arg_session_id,
+               gint *out_result,
+               GCancellable *cancellable,
+               GError **error)
+{
+       *out_result = 0;
+       return true;
+}
+
+
+API SmartcardServiceChannel *smartcard_service_channel_proxy_new_for_bus_sync (
+               GBusType             bus_type,
+               GDBusProxyFlags      flags,
+               const gchar         *name,
+               const gchar         *object_path,
+               GCancellable        *cancellable,
+               GError             **error)
+{
+       return (void *)1234;
+}
+
+API gboolean smartcard_service_channel_call_transmit_sync (
+               SmartcardServiceChannel *proxy,
+               guint arg_service_id,
+               guint arg_channel_id,
+               GVariant *arg_command,
+               gint *out_result,
+               GVariant **out_response,
+               GCancellable *cancellable,
+               GError **error)
+{
+       unsigned char array[] = {0x01, 0x02, 0x03};
+       *out_response = _convert_array_to_variant(array, 3);
+       *out_result = 0;
+       return true;
+}
+
+
+API gboolean smartcard_service_channel_call_close_channel_sync (
+               SmartcardServiceChannel *proxy,
+               guint arg_service_id,
+               guint arg_channel_id,
+               gint *out_result,
+               GCancellable *cancellable,
+               GError **error)
+{
+       *out_result = 0;
+       return true;
+}
diff --git a/unittest/run_coverage.sh b/unittest/run_coverage.sh
new file mode 100755 (executable)
index 0000000..38d5cb3
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+export LD_LIBRARY_PATH=..:.:$LD_LIBRARY_PATH
+pushd ../
+RootDir=$PWD
+popd
+
+unitTestFile=tct-smartcard-core
+if [ ! -x  "./$unitTestFile" ]
+then
+    echo "$unitTestFile file does not exist!"
+    exit -1
+fi
+
+LD_PRELOAD=./libsmartcard-mock.so ./$unitTestFile
+
+CMakeDir=${RootDir}/CMakeFiles/capi-network-smartcard.dir/src
+CoverageDir=${RootDir}/coverage
+
+pushd $CMakeDir
+
+    for obj in `ls *.o`
+    do
+        gcov -b -c $obj
+    done
+
+    if [ -f /usr/bin/lcov ]
+    then
+        lcov -c -d . --exclude "/usr/lib/gcc/armv7l-tizen-linux-gnueabi/9.2.0/include/c++/*" -o cov.info
+        genhtml cov.info -o ${CoverageDir}
+        echo "Coverage test result created! [${CoverageDir}]"
+    else
+        echo "lcov does not exist!"
+    fi
+popd
diff --git a/unittest/tct-smartcard-core.cpp b/unittest/tct-smartcard-core.cpp
new file mode 100755 (executable)
index 0000000..763e076
--- /dev/null
@@ -0,0 +1,108 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <stdio.h>
+#include <string.h>
+#include "tct_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef MOBILE
+#include "tct-smartcard-core_mobile.h"
+#endif
+
+#ifdef WEARABLE
+#include "tct-smartcard-core_wearable.h"
+#endif
+
+#ifdef TIZENIOT
+#include "tct-smartcard-core_tizeniot.h"
+#endif //TIZENIOT
+
+#ifdef TV
+#include "tct-smartcard-core_tv.h"
+#endif // TV
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <gtest/gtest.h>
+
+#include <malloc.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <stdbool.h>
+
+TEST(smartcard, smartcard){
+       char *pszGetTCName = NULL;
+    pszGetTCName = (char*)malloc( 256 );
+    memset( pszGetTCName, 0x00, 256);
+    strcpy( pszGetTCName, "utc_smartcard");
+       int i=0, result=0;
+
+       dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Executing TC Name = %s", __FUNCTION__, __LINE__, pszGetTCName);
+
+    int successCnt = 0;
+    int errorCnt = 0;
+       for ( i = 0; tc_array[i].name; i++ )
+       {
+               if ( 0 == strncmp(pszGetTCName, tc_array[i].name, strlen(pszGetTCName)) )
+               {
+                       if ( tc_array[i].startup )
+                       {
+                               tc_array[i].startup();
+                       }
+
+                       result = tc_array[i].function();
+
+            if( result == 0 ){
+                successCnt++;
+            }
+            else {
+                           dlog_print(DLOG_INFO, "NativeTCT", "[Error][%d] %s returns value = %d", i, tc_array[i].name, result);
+                errorCnt++;
+            }
+
+            EXPECT_EQ(result, 0);
+            // ASSERT_EQ(result, 0);
+
+                       if ( tc_array[i].cleanup )
+                       {
+                               tc_array[i].cleanup();
+                       }
+               }
+        else {
+                       dlog_print(DLOG_INFO, "NativeTCT", "Name check error! [%s][%s]", pszGetTCName, tc_array[i].name);
+            ASSERT_EQ(0, 1);
+        }
+       }
+
+       dlog_print(DLOG_INFO, "NativeTCT", "==========================");
+       dlog_print(DLOG_INFO, "NativeTCT", "Success [%4d / %4d]", successCnt, successCnt + errorCnt);
+       dlog_print(DLOG_INFO, "NativeTCT", "Error   [%4d / %4d]", errorCnt, successCnt + errorCnt);
+       dlog_print(DLOG_INFO, "NativeTCT", "==========================");
+
+       FREE_MEMORY_TC(pszGetTCName);
+}
+
+int main(int argc, char** argv) {
+    ::testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
diff --git a/unittest/tct-smartcard-core_mobile.h b/unittest/tct-smartcard-core_mobile.h
new file mode 100755 (executable)
index 0000000..24baa81
--- /dev/null
@@ -0,0 +1,110 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef __TCT_SMARTCARD_NATIVE_H__
+#define __TCT_SMARTCARD_NATIVE_H__
+
+#include "testcase.h"
+#include "tct_common.h"
+
+extern void utc_smartcard_service_startup(void);
+extern void utc_smartcard_service_cleanup(void);
+extern void utc_smartcard_reader_startup(void);
+extern void utc_smartcard_reader_cleanup(void);
+extern void utc_smartcard_session_startup(void);
+extern void utc_smartcard_session_cleanup(void);
+extern void utc_smartcard_channel_startup(void);
+extern void utc_smartcard_channel_cleanup(void);
+
+extern int utc_smartcard_smartcard_initialize_p(void);
+extern int utc_smartcard_smartcard_deinitialize_p(void);
+extern int utc_smartcard_smartcard_deinitialize_n(void);
+extern int utc_smartcard_smartcard_get_version_p(void);
+extern int utc_smartcard_smartcard_get_version_n(void);
+extern int utc_smartcard_smartcard_get_readers_p(void);
+extern int utc_smartcard_smartcard_get_readers_n(void);
+extern int utc_smartcard_smartcard_reader_get_name_p(void);
+extern int utc_smartcard_smartcard_reader_get_name_n(void);
+extern int utc_smartcard_smartcard_reader_is_secure_element_present_p(void);
+extern int utc_smartcard_smartcard_reader_is_secure_element_present_n(void);
+extern int utc_smartcard_smartcard_reader_open_session_p(void);
+extern int utc_smartcard_smartcard_reader_open_session_n(void);
+extern int utc_smartcard_smartcard_reader_close_sessions_p(void);
+extern int utc_smartcard_smartcard_reader_close_sessions_n(void);
+extern int utc_smartcard_smartcard_reader_set_event_cb_p(void);
+extern int utc_smartcard_smartcard_reader_set_event_cb_n(void);
+extern int utc_smartcard_smartcard_session_get_reader_p(void);
+extern int utc_smartcard_smartcard_session_get_reader_n(void);
+extern int utc_smartcard_smartcard_session_get_atr_p(void);
+extern int utc_smartcard_smartcard_session_get_atr_n(void);
+extern int utc_smartcard_smartcard_session_close_p(void);
+extern int utc_smartcard_smartcard_session_close_n(void);
+extern int utc_smartcard_smartcard_session_is_closed_p(void);
+extern int utc_smartcard_smartcard_session_is_closed_n(void);
+extern int utc_smartcard_smartcard_session_close_channels_p(void);
+extern int utc_smartcard_smartcard_session_close_channels_n(void);
+extern int utc_smartcard_smartcard_session_open_basic_channel_n(void);
+extern int utc_smartcard_smartcard_session_open_logical_channel_n(void);
+extern int utc_smartcard_smartcard_channel_close_n(void);
+extern int utc_smartcard_smartcard_channel_is_basic_channel_n(void);
+extern int utc_smartcard_smartcard_channel_is_closed_n(void);
+extern int utc_smartcard_smartcard_channel_get_select_response_n(void);
+extern int utc_smartcard_smartcard_channel_get_session_n(void);
+extern int utc_smartcard_smartcard_channel_transmit_n(void);
+extern int utc_smartcard_smartcard_channel_transmit_retrieve_response_n(void);
+extern int utc_smartcard_smartcard_channel_select_next_n(void);
+
+testcase tc_array[] = {
+       {"utc_smartcard_smartcard_initialize_p",utc_smartcard_smartcard_initialize_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_deinitialize_p",utc_smartcard_smartcard_deinitialize_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_deinitialize_n",utc_smartcard_smartcard_deinitialize_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_version_p",utc_smartcard_smartcard_get_version_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_version_n",utc_smartcard_smartcard_get_version_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_readers_p",utc_smartcard_smartcard_get_readers_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_readers_n",utc_smartcard_smartcard_get_readers_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_reader_get_name_p",utc_smartcard_smartcard_reader_get_name_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_get_name_n",utc_smartcard_smartcard_reader_get_name_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_is_secure_element_present_p",utc_smartcard_smartcard_reader_is_secure_element_present_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_is_secure_element_present_n",utc_smartcard_smartcard_reader_is_secure_element_present_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_open_session_p",utc_smartcard_smartcard_reader_open_session_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_open_session_n",utc_smartcard_smartcard_reader_open_session_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_close_sessions_p",utc_smartcard_smartcard_reader_close_sessions_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_close_sessions_n",utc_smartcard_smartcard_reader_close_sessions_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_set_event_cb_p",utc_smartcard_smartcard_reader_set_event_cb_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_set_event_cb_n",utc_smartcard_smartcard_reader_set_event_cb_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_session_get_reader_p",utc_smartcard_smartcard_session_get_reader_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_reader_n",utc_smartcard_smartcard_session_get_reader_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_atr_p",utc_smartcard_smartcard_session_get_atr_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_atr_n",utc_smartcard_smartcard_session_get_atr_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_p",utc_smartcard_smartcard_session_close_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_n",utc_smartcard_smartcard_session_close_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_is_closed_p",utc_smartcard_smartcard_session_is_closed_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_is_closed_n",utc_smartcard_smartcard_session_is_closed_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_channels_p",utc_smartcard_smartcard_session_close_channels_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_channels_n",utc_smartcard_smartcard_session_close_channels_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_open_basic_channel_n",utc_smartcard_smartcard_session_open_basic_channel_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_open_logical_channel_n",utc_smartcard_smartcard_session_open_logical_channel_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_channel_close_n",utc_smartcard_smartcard_channel_close_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_is_basic_channel_n",utc_smartcard_smartcard_channel_is_basic_channel_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_is_closed_n",utc_smartcard_smartcard_channel_is_closed_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_get_select_response_n",utc_smartcard_smartcard_channel_get_select_response_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_get_session_n",utc_smartcard_smartcard_channel_get_session_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_transmit_n",utc_smartcard_smartcard_channel_transmit_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_transmit_retrieve_response_n",utc_smartcard_smartcard_channel_transmit_retrieve_response_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_select_next_n",utc_smartcard_smartcard_channel_select_next_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {NULL, NULL}
+};
+
+#endif // __TCT_SMARTCARD_NATIVE_H__
diff --git a/unittest/tct-smartcard-core_tizeniot.h b/unittest/tct-smartcard-core_tizeniot.h
new file mode 100755 (executable)
index 0000000..51d63d3
--- /dev/null
@@ -0,0 +1,110 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef __TCT_SMARTCARD-NATIVE_H__
+#define __TCT_SMARTCARD-NATIVE_H__
+
+#include "testcase.h"
+#include "tct_common.h"
+
+extern void utc_smartcard_service_startup(void);
+extern void utc_smartcard_service_cleanup(void);
+extern void utc_smartcard_reader_startup(void);
+extern void utc_smartcard_reader_cleanup(void);
+extern void utc_smartcard_session_startup(void);
+extern void utc_smartcard_session_cleanup(void);
+extern void utc_smartcard_channel_startup(void);
+extern void utc_smartcard_channel_cleanup(void);
+
+extern int utc_smartcard_smartcard_initialize_p(void);
+extern int utc_smartcard_smartcard_deinitialize_p(void);
+extern int utc_smartcard_smartcard_deinitialize_n(void);
+extern int utc_smartcard_smartcard_get_version_p(void);
+extern int utc_smartcard_smartcard_get_version_n(void);
+extern int utc_smartcard_smartcard_get_readers_p(void);
+extern int utc_smartcard_smartcard_get_readers_n(void);
+extern int utc_smartcard_smartcard_reader_get_name_p(void);
+extern int utc_smartcard_smartcard_reader_get_name_n(void);
+extern int utc_smartcard_smartcard_reader_is_secure_element_present_p(void);
+extern int utc_smartcard_smartcard_reader_is_secure_element_present_n(void);
+extern int utc_smartcard_smartcard_reader_open_session_p(void);
+extern int utc_smartcard_smartcard_reader_open_session_n(void);
+extern int utc_smartcard_smartcard_reader_close_sessions_p(void);
+extern int utc_smartcard_smartcard_reader_close_sessions_n(void);
+extern int utc_smartcard_smartcard_reader_set_event_cb_p(void);
+extern int utc_smartcard_smartcard_reader_set_event_cb_n(void);
+extern int utc_smartcard_smartcard_session_get_reader_p(void);
+extern int utc_smartcard_smartcard_session_get_reader_n(void);
+extern int utc_smartcard_smartcard_session_get_atr_p(void);
+extern int utc_smartcard_smartcard_session_get_atr_n(void);
+extern int utc_smartcard_smartcard_session_close_p(void);
+extern int utc_smartcard_smartcard_session_close_n(void);
+extern int utc_smartcard_smartcard_session_is_closed_p(void);
+extern int utc_smartcard_smartcard_session_is_closed_n(void);
+extern int utc_smartcard_smartcard_session_close_channels_p(void);
+extern int utc_smartcard_smartcard_session_close_channels_n(void);
+extern int utc_smartcard_smartcard_session_open_basic_channel_n(void);
+extern int utc_smartcard_smartcard_session_open_logical_channel_n(void);
+extern int utc_smartcard_smartcard_channel_close_n(void);
+extern int utc_smartcard_smartcard_channel_is_basic_channel_n(void);
+extern int utc_smartcard_smartcard_channel_is_closed_n(void);
+extern int utc_smartcard_smartcard_channel_get_select_response_n(void);
+extern int utc_smartcard_smartcard_channel_get_session_n(void);
+extern int utc_smartcard_smartcard_channel_transmit_n(void);
+extern int utc_smartcard_smartcard_channel_transmit_retrieve_response_n(void);
+extern int utc_smartcard_smartcard_channel_select_next_n(void);
+
+testcase tc_array[] = {
+       {"utc_smartcard_smartcard_initialize_p",utc_smartcard_smartcard_initialize_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_deinitialize_p",utc_smartcard_smartcard_deinitialize_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_deinitialize_n",utc_smartcard_smartcard_deinitialize_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_version_p",utc_smartcard_smartcard_get_version_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_version_n",utc_smartcard_smartcard_get_version_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_readers_p",utc_smartcard_smartcard_get_readers_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_readers_n",utc_smartcard_smartcard_get_readers_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_reader_get_name_p",utc_smartcard_smartcard_reader_get_name_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_get_name_n",utc_smartcard_smartcard_reader_get_name_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_is_secure_element_present_p",utc_smartcard_smartcard_reader_is_secure_element_present_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_is_secure_element_present_n",utc_smartcard_smartcard_reader_is_secure_element_present_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_open_session_p",utc_smartcard_smartcard_reader_open_session_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_open_session_n",utc_smartcard_smartcard_reader_open_session_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_close_sessions_p",utc_smartcard_smartcard_reader_close_sessions_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_close_sessions_n",utc_smartcard_smartcard_reader_close_sessions_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_set_event_cb_p",utc_smartcard_smartcard_reader_set_event_cb_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_set_event_cb_n",utc_smartcard_smartcard_reader_set_event_cb_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_session_get_reader_p",utc_smartcard_smartcard_session_get_reader_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_reader_n",utc_smartcard_smartcard_session_get_reader_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_atr_p",utc_smartcard_smartcard_session_get_atr_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_atr_n",utc_smartcard_smartcard_session_get_atr_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_p",utc_smartcard_smartcard_session_close_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_n",utc_smartcard_smartcard_session_close_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_is_closed_p",utc_smartcard_smartcard_session_is_closed_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_is_closed_n",utc_smartcard_smartcard_session_is_closed_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_channels_p",utc_smartcard_smartcard_session_close_channels_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_channels_n",utc_smartcard_smartcard_session_close_channels_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_open_basic_channel_n",utc_smartcard_smartcard_session_open_basic_channel_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_open_logical_channel_n",utc_smartcard_smartcard_session_open_logical_channel_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_channel_close_n",utc_smartcard_smartcard_channel_close_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_is_basic_channel_n",utc_smartcard_smartcard_channel_is_basic_channel_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_is_closed_n",utc_smartcard_smartcard_channel_is_closed_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_get_select_response_n",utc_smartcard_smartcard_channel_get_select_response_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_get_session_n",utc_smartcard_smartcard_channel_get_session_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_transmit_n",utc_smartcard_smartcard_channel_transmit_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_transmit_retrieve_response_n",utc_smartcard_smartcard_channel_transmit_retrieve_response_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_select_next_n",utc_smartcard_smartcard_channel_select_next_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {NULL, NULL}
+};
+
+#endif // __TCT_SMARTCARD-NATIVE_H__
diff --git a/unittest/tct-smartcard-core_wearable.h b/unittest/tct-smartcard-core_wearable.h
new file mode 100755 (executable)
index 0000000..51d63d3
--- /dev/null
@@ -0,0 +1,110 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef __TCT_SMARTCARD-NATIVE_H__
+#define __TCT_SMARTCARD-NATIVE_H__
+
+#include "testcase.h"
+#include "tct_common.h"
+
+extern void utc_smartcard_service_startup(void);
+extern void utc_smartcard_service_cleanup(void);
+extern void utc_smartcard_reader_startup(void);
+extern void utc_smartcard_reader_cleanup(void);
+extern void utc_smartcard_session_startup(void);
+extern void utc_smartcard_session_cleanup(void);
+extern void utc_smartcard_channel_startup(void);
+extern void utc_smartcard_channel_cleanup(void);
+
+extern int utc_smartcard_smartcard_initialize_p(void);
+extern int utc_smartcard_smartcard_deinitialize_p(void);
+extern int utc_smartcard_smartcard_deinitialize_n(void);
+extern int utc_smartcard_smartcard_get_version_p(void);
+extern int utc_smartcard_smartcard_get_version_n(void);
+extern int utc_smartcard_smartcard_get_readers_p(void);
+extern int utc_smartcard_smartcard_get_readers_n(void);
+extern int utc_smartcard_smartcard_reader_get_name_p(void);
+extern int utc_smartcard_smartcard_reader_get_name_n(void);
+extern int utc_smartcard_smartcard_reader_is_secure_element_present_p(void);
+extern int utc_smartcard_smartcard_reader_is_secure_element_present_n(void);
+extern int utc_smartcard_smartcard_reader_open_session_p(void);
+extern int utc_smartcard_smartcard_reader_open_session_n(void);
+extern int utc_smartcard_smartcard_reader_close_sessions_p(void);
+extern int utc_smartcard_smartcard_reader_close_sessions_n(void);
+extern int utc_smartcard_smartcard_reader_set_event_cb_p(void);
+extern int utc_smartcard_smartcard_reader_set_event_cb_n(void);
+extern int utc_smartcard_smartcard_session_get_reader_p(void);
+extern int utc_smartcard_smartcard_session_get_reader_n(void);
+extern int utc_smartcard_smartcard_session_get_atr_p(void);
+extern int utc_smartcard_smartcard_session_get_atr_n(void);
+extern int utc_smartcard_smartcard_session_close_p(void);
+extern int utc_smartcard_smartcard_session_close_n(void);
+extern int utc_smartcard_smartcard_session_is_closed_p(void);
+extern int utc_smartcard_smartcard_session_is_closed_n(void);
+extern int utc_smartcard_smartcard_session_close_channels_p(void);
+extern int utc_smartcard_smartcard_session_close_channels_n(void);
+extern int utc_smartcard_smartcard_session_open_basic_channel_n(void);
+extern int utc_smartcard_smartcard_session_open_logical_channel_n(void);
+extern int utc_smartcard_smartcard_channel_close_n(void);
+extern int utc_smartcard_smartcard_channel_is_basic_channel_n(void);
+extern int utc_smartcard_smartcard_channel_is_closed_n(void);
+extern int utc_smartcard_smartcard_channel_get_select_response_n(void);
+extern int utc_smartcard_smartcard_channel_get_session_n(void);
+extern int utc_smartcard_smartcard_channel_transmit_n(void);
+extern int utc_smartcard_smartcard_channel_transmit_retrieve_response_n(void);
+extern int utc_smartcard_smartcard_channel_select_next_n(void);
+
+testcase tc_array[] = {
+       {"utc_smartcard_smartcard_initialize_p",utc_smartcard_smartcard_initialize_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_deinitialize_p",utc_smartcard_smartcard_deinitialize_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_deinitialize_n",utc_smartcard_smartcard_deinitialize_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_version_p",utc_smartcard_smartcard_get_version_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_version_n",utc_smartcard_smartcard_get_version_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_readers_p",utc_smartcard_smartcard_get_readers_p,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_get_readers_n",utc_smartcard_smartcard_get_readers_n,utc_smartcard_service_startup,utc_smartcard_service_cleanup},
+       {"utc_smartcard_smartcard_reader_get_name_p",utc_smartcard_smartcard_reader_get_name_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_get_name_n",utc_smartcard_smartcard_reader_get_name_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_is_secure_element_present_p",utc_smartcard_smartcard_reader_is_secure_element_present_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_is_secure_element_present_n",utc_smartcard_smartcard_reader_is_secure_element_present_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_open_session_p",utc_smartcard_smartcard_reader_open_session_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_open_session_n",utc_smartcard_smartcard_reader_open_session_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_close_sessions_p",utc_smartcard_smartcard_reader_close_sessions_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_close_sessions_n",utc_smartcard_smartcard_reader_close_sessions_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_set_event_cb_p",utc_smartcard_smartcard_reader_set_event_cb_p,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_reader_set_event_cb_n",utc_smartcard_smartcard_reader_set_event_cb_n,utc_smartcard_reader_startup,utc_smartcard_reader_cleanup},
+       {"utc_smartcard_smartcard_session_get_reader_p",utc_smartcard_smartcard_session_get_reader_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_reader_n",utc_smartcard_smartcard_session_get_reader_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_atr_p",utc_smartcard_smartcard_session_get_atr_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_get_atr_n",utc_smartcard_smartcard_session_get_atr_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_p",utc_smartcard_smartcard_session_close_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_n",utc_smartcard_smartcard_session_close_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_is_closed_p",utc_smartcard_smartcard_session_is_closed_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_is_closed_n",utc_smartcard_smartcard_session_is_closed_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_channels_p",utc_smartcard_smartcard_session_close_channels_p,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_close_channels_n",utc_smartcard_smartcard_session_close_channels_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_open_basic_channel_n",utc_smartcard_smartcard_session_open_basic_channel_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_session_open_logical_channel_n",utc_smartcard_smartcard_session_open_logical_channel_n,utc_smartcard_session_startup,utc_smartcard_session_cleanup},
+       {"utc_smartcard_smartcard_channel_close_n",utc_smartcard_smartcard_channel_close_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_is_basic_channel_n",utc_smartcard_smartcard_channel_is_basic_channel_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_is_closed_n",utc_smartcard_smartcard_channel_is_closed_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_get_select_response_n",utc_smartcard_smartcard_channel_get_select_response_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_get_session_n",utc_smartcard_smartcard_channel_get_session_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_transmit_n",utc_smartcard_smartcard_channel_transmit_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_transmit_retrieve_response_n",utc_smartcard_smartcard_channel_transmit_retrieve_response_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {"utc_smartcard_smartcard_channel_select_next_n",utc_smartcard_smartcard_channel_select_next_n,utc_smartcard_channel_startup,utc_smartcard_channel_cleanup},
+       {NULL, NULL}
+};
+
+#endif // __TCT_SMARTCARD-NATIVE_H__
diff --git a/unittest/utc-smartcard-channel.c b/unittest/utc-smartcard-channel.c
new file mode 100755 (executable)
index 0000000..3444345
--- /dev/null
@@ -0,0 +1,192 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "utc-smartcard.h"
+
+static int _init_state = SMARTCARD_ERROR_NONE;
+
+/**
+ * @function           utc_smartcard_channel_startup
+ * @description                Called before each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_channel_startup(void)
+{
+       _init_state = smartcard_initialize();
+}
+
+/**
+ * @function           utc_smartcard_channel_cleanup
+ * @description                Called after each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_channel_cleanup(void)
+{
+       smartcard_deinitialize();
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_close_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_close_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_close(0);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_is_basic_channel_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_is_basic_channel_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_is_basic_channel(0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_is_closed_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_is_closed_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_is_closed(0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_get_select_response_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_get_select_response_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_get_select_response(0, NULL, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_get_session_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_get_session_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_get_session(0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_transmit_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_transmit_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_transmit(0, NULL, 0, NULL, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_transmit_retrieve_response_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_transmit_retrieve_response_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_transmit_retrieve_response(0, NULL, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_channel_select_next_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_channel_select_next_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_channel_select_next(0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
diff --git a/unittest/utc-smartcard-reader.c b/unittest/utc-smartcard-reader.c
new file mode 100755 (executable)
index 0000000..e96ac34
--- /dev/null
@@ -0,0 +1,257 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "utc-smartcard.h"
+
+static int reader;
+static int _init_state = SMARTCARD_ERROR_NONE;
+
+/**
+ * @function           utc_smartcard_reader_startup
+ * @description                Called before each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_reader_startup(void)
+{
+       int length;
+       int* readers;
+
+       _init_state = smartcard_initialize();
+       if(SMARTCARD_ERROR_NONE == _init_state)
+       {
+               _init_state = smartcard_get_readers(&readers, &length);
+               if(SMARTCARD_ERROR_NONE == _init_state && length > 0)
+                       reader = readers[0];
+               else
+                       _init_state = SMARTCARD_ERROR_GENERAL;
+       }
+}
+
+/**
+ * @function           utc_smartcard_reader_cleanup
+ * @description                Called after each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_reader_cleanup(void)
+{
+       smartcard_deinitialize();
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_get_name_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_get_name_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       char *reader_name;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_get_name(reader, &reader_name);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_get_name_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_get_name_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_get_name(reader, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_is_secure_element_present_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_is_secure_element_present_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       bool is_present = false;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_is_secure_element_present(reader, &is_present);
+       // process end
+
+       //if ispresent is true
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_is_secure_element_present_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_is_secure_element_present_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_is_secure_element_present(reader, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_open_session_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_open_session_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       int session;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_open_session(reader, &session);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_open_session_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_open_session_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_open_session(reader, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_close_sessions_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_close_sessions_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_close_sessions(reader);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_close_sessions_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_reader_close_sessions_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_close_sessions(0);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+static void __reader_event_cb(int reader_id, smartcard_reader_event_type_e event_type, void *user_data)
+{
+       return;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_close_sessions_p
+ * @since_tizen                3.0
+ * @description
+ */
+int utc_smartcard_smartcard_reader_set_event_cb_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_set_event_cb(__reader_event_cb, NULL);
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+
+       ret = smartcard_reader_unset_event_cb();
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       // process end
+
+       return 0;
+
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_reader_close_sessions_n
+ * @since_tizen                3.0
+ * @description
+ */
+int utc_smartcard_smartcard_reader_set_event_cb_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_reader_set_event_cb(NULL, NULL);
+
+       if (ret == SMARTCARD_ERROR_INVALID_PARAMETER) {
+               smartcard_deinitialize();
+               ret = smartcard_reader_unset_event_cb();
+
+               SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NOT_INITIALIZED);
+       } else {
+               SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       }
+       // process end
+
+       return 0;
+}
diff --git a/unittest/utc-smartcard-service.c b/unittest/utc-smartcard-service.c
new file mode 100755 (executable)
index 0000000..6e6597c
--- /dev/null
@@ -0,0 +1,176 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "utc-smartcard.h"
+
+static int _init_state = SMARTCARD_ERROR_NONE;
+
+/**
+ * @function           utc_smartcard_service_startup
+ * @description                Called before each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_service_startup(void)
+{
+       _init_state = smartcard_initialize();
+}
+
+/**
+ * @function           utc_smartcard_service_cleanup
+ * @description                Called after each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_service_cleanup(void)
+{
+       smartcard_deinitialize();
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_initialize_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_initialize_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_initialize();
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_deinitialize_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_deinitialize_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_deinitialize();
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_deinitialize_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_deinitialize_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       smartcard_deinitialize();
+       ret = smartcard_deinitialize();
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NOT_INITIALIZED);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_get_version_p
+ * @since_tizen                3.0
+ * @description
+ */
+int utc_smartcard_smartcard_get_version_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       char *version = NULL;
+
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_get_version(&version);
+
+       if (version != NULL)
+               free(version);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_get_version_n
+ * @since_tizen                3.0
+ * @description
+ */
+int utc_smartcard_smartcard_get_version_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_get_version(NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_get_readers_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_get_readers_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       int length;
+       int* readers;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_get_readers(&readers, &length);
+       // process end
+
+       // if length is 0, assert
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_get_readers_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_get_readers_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_get_readers(NULL, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
diff --git a/unittest/utc-smartcard-session.c b/unittest/utc-smartcard-session.c
new file mode 100755 (executable)
index 0000000..0f488bb
--- /dev/null
@@ -0,0 +1,279 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "utc-smartcard.h"
+
+static int session;
+static int _init_state = SMARTCARD_ERROR_NONE;
+
+/**
+ * @function           utc_smartcard_session_startup
+ * @description                Called before each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_session_startup(void)
+{
+       int length;
+       int* readers;
+
+       _init_state = smartcard_initialize();
+       if(SMARTCARD_ERROR_NONE == _init_state)
+       {
+               _init_state = smartcard_get_readers(&readers, &length);
+               if(SMARTCARD_ERROR_NONE == _init_state && length > 0)
+               {
+                       _init_state = smartcard_reader_open_session(readers[0], &session);
+                       if(_init_state != SMARTCARD_ERROR_NONE || session == 0)
+                               _init_state = SMARTCARD_ERROR_GENERAL;
+               }
+               else
+               {
+                       _init_state = SMARTCARD_ERROR_GENERAL;
+               }
+       }
+}
+
+/**
+ * @function           utc_smartcard_session_cleanup
+ * @description                Called after each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_smartcard_session_cleanup(void)
+{
+       smartcard_deinitialize();
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_get_reader_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_get_reader_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       int reader;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_get_reader(session, &reader);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_get_reader_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_get_reader_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_get_reader(0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_get_atr_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_get_atr_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       int length;
+       unsigned char* atr = NULL;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_get_atr(session, &atr, &length);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_get_atr_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_get_atr_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_get_atr(0, NULL, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_close_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_close_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_close(session);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_close_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_close_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_close(0);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_is_closed_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_is_closed_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       bool is_closed;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_is_closed(session, &is_closed);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_is_closed_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_is_closed_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_is_closed(0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_close_channels_p
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_close_channels_p(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_close_channels(session);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_NONE);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_close_channels_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_close_channels_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_close_channels(0);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_open_basic_channel_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_open_basic_channel_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_open_basic_channel(0, NULL, 0, 0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
+
+/**
+ * @testcase           utc_smartcard_smartcard_session_open_logical_channel_n
+ * @since_tizen                2.3
+ * @description
+ */
+int utc_smartcard_smartcard_session_open_logical_channel_n(void)
+{
+       int ret = SMARTCARD_ERROR_NONE;
+       SMARTCARD_ASSERT(_init_state, SMARTCARD_ERROR_NONE);
+
+       // process start
+       ret = smartcard_session_open_logical_channel(0, NULL, 0, 0, NULL);
+       // process end
+
+       SMARTCARD_ASSERT(ret, SMARTCARD_ERROR_INVALID_PARAMETER);
+       return 0;
+}
diff --git a/unittest/utc-smartcard.c b/unittest/utc-smartcard.c
new file mode 100755 (executable)
index 0000000..f0cb6d7
--- /dev/null
@@ -0,0 +1,39 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "utc-smartcard.h"
+#include <system_info.h>
+
+#define  SE_FEATURE "http://tizen.org/feature/network.secure_element"
+#define  SE_UICC_FEATURE "http://tizen.org/feature/network.secure_element.uicc"
+#define  SE_ESE_FEATURE "http://tizen.org/feature/network.secure_element.ese"
+
+bool _is_support_smartcard()
+{
+       bool ret = false;
+       bool is_supported_se = false;
+       bool is_supported_se_uicc = false;
+       bool is_supported_se_ese = false;
+
+       system_info_get_platform_bool(SE_FEATURE, &is_supported_se);
+       system_info_get_platform_bool(SE_UICC_FEATURE, &is_supported_se_uicc);
+       system_info_get_platform_bool(SE_ESE_FEATURE, &is_supported_se_ese);
+
+       if(is_supported_se && (is_supported_se_uicc || is_supported_se_ese))
+               ret = true;
+
+       return ret;
+}
diff --git a/unittest/utc-smartcard.h b/unittest/utc-smartcard.h
new file mode 100755 (executable)
index 0000000..0fde84b
--- /dev/null
@@ -0,0 +1,40 @@
+//
+// Copyright (c) 2020 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef __UTC_SMARTCARD_H__
+#define __UTC_SMARTCARD_H__
+
+#include "assert_local.h"
+#include <smartcard.h>
+
+//& set: Smartcard
+bool _is_support_smartcard();
+
+#define SMARTCARD_ASSERT(ret, errno) \
+do{\
+    { \
+        if(_is_support_smartcard() == false) \
+        { \
+            assert_eq(ret, SMARTCARD_ERROR_NOT_SUPPORTED); \
+        } \
+        else \
+        { \
+                          assert_eq(ret, errno); \
+        } \
+    } \
+}while(0);
+
+#endif