Add test app(initial version) 12/138512/2
authorSangkoo Kim <sangkoo.kim@samsung.com>
Wed, 12 Jul 2017 10:26:20 +0000 (19:26 +0900)
committerSangkoo Kim <sangkoo.kim@samsung.com>
Wed, 12 Jul 2017 10:26:46 +0000 (10:26 +0000)
Change-Id: I356e66d1346f42dff96816b2ea06066b7185ec96
Signed-off-by: Sangkoo Kim <sangkoo.kim@samsung.com>
CMakeLists.txt
inc/controlee_firmware_resource.h
inc/controlee_firmware_resource_internal.h
packaging/controlee-firmware-resource.spec
src/controlee_firmware_resource.c
test/CMakeLists.txt [new file with mode: 0644]
test/controlee_firmware_test.c [new file with mode: 0644]

index 4b6c5b2..f87d5ab 100644 (file)
@@ -5,17 +5,15 @@ SET(VERSION "${VERSION_MAJOR}.1.0")
 SET(LIBDIR ${LIB_INSTALL_DIR})
 
 SET(CONTROLEE_FIRMWARE_SRCS
-    ${CMAKE_CURRENT_LIST_DIR}/src/controlee_firmware_resource.c
-    ${CMAKE_CURRENT_LIST_DIR}/src/controlee_firmware_resource_internal.c
-    ${CMAKE_CURRENT_LIST_DIR}/src/controlee_firmware_resource_http.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/controlee_firmware_resource.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/controlee_firmware_resource_internal.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/controlee_firmware_resource_http.c
 )
 
 INCLUDE_DIRECTORIES(
-    ${CMAKE_CURRENT_LIST_DIR}/inc/
+    ${CMAKE_CURRENT_SOURCE_DIR}/inc/
 )
 
-ADD_DEFINITIONS(-DRD_CLIENT)
-
 SET(API-HEADERS
     ${CMAKE_CURRENT_LIST_DIR}/inc/controlee_firmware_resource.h
     )
@@ -41,10 +39,11 @@ ENDFOREACH(flag)
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 
-SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
-
+FIND_LIBRARY(RD_LIB NAMES resource_directory PATHS /usr/lib)
 ADD_LIBRARY(${PROJECT_NAME} SHARED ${CONTROLEE_FIRMWARE_SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${${PROJECT_NAME}_LDFLAGS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${controlee_fw_pkgs_LDFLAGS} ${RD_LIB})
 SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR})
 
-INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR} COMPONENT RuntimeLibraries)
\ No newline at end of file
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR} COMPONENT RuntimeLibraries)
+
+ADD_SUBDIRECTORY(test)
index e1027bb..4cc6c69 100644 (file)
@@ -11,6 +11,9 @@
 #include <unistd.h>
 #include <glib.h>
 #include <octypes.h>
+#if 0
+#include <rd_client.h>
+#endif
 
 #ifndef EXPORT_API
 #define EXPORT_API     __attribute__((visibility("default")))
@@ -80,15 +83,15 @@ typedef void (*destroy_finish_cb)(OCStackResult result);
 typedef void (*state_changed_cb)(controlee_firmware_state_e value);
 
 
-EXPORT_API int controlee_create_firmware_resource(controlee_firmware_h *firmware_res_h);
+EXPORT_API int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h);
 
+#if 0
 EXPORT_API int controlee_publish_firmware_resource(controlee_firmware_h firmware_res_h,
                                         const char *server_url,
                                         publish_finish_cb callback);
+#endif
 
-EXPORT_API int controlee_destory_firmware_resource(controlee_firmware_h firmware_res_h,
-                                        const char *server_url,
-                                        destroy_finish_cb callback);
+EXPORT_API int controlee_destory_firmware_resource(OCResourceHandle firmware_res_h);
 
 EXPORT_API int controlee_set_firmware_download_path(const char *download_path);
 
index 3bb1894..ef9804f 100644 (file)
@@ -12,7 +12,6 @@
 #include <ocstack.h>
 #include <octypes.h>
 #include <ocpayload.h>
-#include <rd_client.h>
 #include <system_info.h>
 
 #include "controlee_firmware_resource.h"
index 0e7e797..1e877d0 100644 (file)
@@ -23,10 +23,16 @@ Description: Controlee firmware resource API
 License:               Apache-2.0
 Summary:               OCF-based firmware resource API for controlee (development)
 Group:                 Network & Connectivity/Libraries
-
 %description devel
 Description:   OCF-based firmware resource API for controlee (development)
 
+%package test
+License:               Apache-2.0
+Summary:               Test app for OCF-based firmware resource API
+Group:                 Network & Connectivity/Testing
+%description test
+Description:   Test program for OCF-based firmware resource API
+
 %prep
 %setup -q
 
@@ -55,4 +61,7 @@ rm -rf %{buildroot}
 %files devel
 %{_libdir}/libcontrolee_firmware_resource.so
 %{_libdir}/pkgconfig/controlee-firmware-resource.pc
-%{_includedir}/controlee-firmware-resource/*
\ No newline at end of file
+%{_includedir}/controlee-firmware-resource/*
+
+%files test
+%{_bindir}/controlee_firmware_test
index 9a58280..1dcc0ae 100644 (file)
@@ -7,7 +7,7 @@ state_changed_cb g_state_changed_cb = NULL;
 char *g_download_path = NULL;
 
 
-int controlee_create_firmware_resource(controlee_firmware_h *firmware_res_h)
+int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h)
 {
        if (!firmware_res_h)
                return CONTROLEE_FIRMWARE_NULL_PTR;
@@ -33,8 +33,8 @@ int controlee_create_firmware_resource(controlee_firmware_h *firmware_res_h)
 
        tmp_firmware_res->resource_handle = oc_handle;
 
-       *firmware_res_h = (controlee_firmware_h)tmp_firmware_res;
        g_firmware_resource = tmp_firmware_res;
+       *firmware_res_h = oc_handle;
 
        return CONTROLEE_FIRMWARE_SUCCESS;
 }
@@ -79,7 +79,7 @@ OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle
        return OC_STACK_KEEP_TRANSACTION;
 }
 
-
+#if 0
 int controlee_publish_firmware_resource(controlee_firmware_h firmware_res_h, const char *server_url, publish_finish_cb callback)
 {
        if (!firmware_res_h)
@@ -99,42 +99,29 @@ int controlee_publish_firmware_resource(controlee_firmware_h firmware_res_h, con
 
        return CONTROLEE_FIRMWARE_SUCCESS;
 }
+#endif
 
-
-int controlee_destory_firmware_resource(controlee_firmware_h firmware_res_h, const char *server_url, destroy_finish_cb callback)
+int controlee_destory_firmware_resource(OCResourceHandle firmware_res_h)
 {
        if (!firmware_res_h)
                return CONTROLEE_FIRMWARE_NULL_PTR;
 
-       int err = CONTROLEE_FIRMWARE_SUCCESS;
-       controlee_firmware_s *firmware_res = (controlee_firmware_s *)firmware_res_h;
-
-       if (firmware_res->resource_handle) {
-               OCCallbackData cb_data = {NULL, NULL, NULL};
-               cb_data.cb = _handle_rd_delete_callback;
-               cb_data.context = (void *)callback;
-
-               if (OCRDDelete(server_url, CT_ADAPTER_TCP,
-                               firmware_res->resource_handle, 1,
-                               &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-                       //LOG("OCRDDelete() is failed");
-               }
-
-               if (OCDeleteResource(firmware_res->resource_handle) != OC_STACK_OK) {
-                       err = CONTROLEE_FIRMWARE_OPERATION_FAILED;
+       if (firmware_res_h == g_firmware_resource->resource_handle) {
+               if (OCDeleteResource(g_firmware_resource->resource_handle) != OC_STACK_OK) {
+                       printf("OCDeleteResource() failed for firmware_resource\n");
                }
-       }
 
-       g_free(firmware_res->current_version);
-       g_free(firmware_res->new_version);
-       g_free(firmware_res->package_uri);
-       g_free(firmware_res->manufacturer);
-       g_free(firmware_res->model_name);
-       g_free(firmware_res);
+               g_free(g_firmware_resource->current_version);
+               g_free(g_firmware_resource->new_version);
+               g_free(g_firmware_resource->package_uri);
+               g_free(g_firmware_resource->manufacturer);
+               g_free(g_firmware_resource->model_name);
+               g_free(g_firmware_resource);
 
-       g_firmware_resource = NULL;
+               g_firmware_resource = NULL;
+       }
 
-       return err;
+       return CONTROLEE_FIRMWARE_SUCCESS;
 }
 
 int controlee_set_firmware_download_path(const char *download_path)
@@ -200,9 +187,3 @@ int controlee_get_firmware_resource_value(controlee_firmware_h firmware_res_h,
 
        return result;
 }
-
-
-
-
-
-
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..a7027c8
--- /dev/null
@@ -0,0 +1,19 @@
+set(testapp "controlee_firmware_test")
+
+SET(CONTROLEE_FIRMWARE_TEST_SRCS
+    ${CMAKE_CURRENT_SOURCE_DIR}/controlee_firmware_test.c
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../inc)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(test_pkgs REQUIRED glib-2.0 iotivity)
+INCLUDE_DIRECTORIES(${test_pkgs_INCLUDE_DIRS})
+LINK_DIRECTORIES(${test_pkgs_LIBRARY_DIRS})
+
+FIND_LIBRARY(RD_LIB NAMES resource_directory PATHS /usr/lib)
+SET(LIBNAME controlee_firmware_resource)
+ADD_EXECUTABLE(${testapp} ${CONTROLEE_FIRMWARE_TEST_SRCS})
+TARGET_LINK_LIBRARIES(${testapp} ${test_pkgs_LIBRARIES} ${LIBNAME} ${RD_LIB})
+
+INSTALL(TARGETS ${testapp} DESTINATION bin/)
\ No newline at end of file
diff --git a/test/controlee_firmware_test.c b/test/controlee_firmware_test.c
new file mode 100644 (file)
index 0000000..93dba8c
--- /dev/null
@@ -0,0 +1,468 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <ocstack.h>
+#include <ocpayload.h>
+#include <rd_client.h>
+
+#include <controlee_firmware_resource.h>
+
+
+#define OCF_SERVER_URL ""
+#define DEFAULT_CONTEXT_VALUE 0x99
+
+
+OCResourceHandle aircon_handle = NULL;
+OCResourceHandle binary_switch_handle = NULL;
+OCResourceHandle firmware_handle = NULL;
+
+
+
+bool _compare_resource_interface(char *from, char *iface)
+{
+       char *str = g_strdup(from);
+       char *ptr = strtok(str, ";");
+
+       if(ptr == NULL) {
+               return false;
+       }
+
+       do {
+               if(strstr(ptr, ".if.")) {
+                       char *if_ptr = NULL;
+                       if_ptr = strtok(ptr, "=");
+                       if_ptr = strtok(NULL, "=");
+
+                       if(!g_strcmp0(if_ptr, iface)) {
+                               return true;
+                       }
+               }
+       } while ((ptr = strtok(NULL, ";")));
+
+       return false;
+}
+
+
+OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
+{
+       if( !(ehRequest->query) || \
+                       (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
+                       !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
+       {
+               //LOG("Not supported Interface");
+               return OC_EH_BAD_REQ;
+       }
+
+       return OC_EH_OK;
+}
+
+
+static OCEntityHandlerResult _handle_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
+{
+       OCEntityHandlerResult ehResult = OC_EH_ERROR;
+       if (!ehRequest) {
+               //LOG("Request is Null");
+               return ehResult;
+       }
+
+       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
+               //LOG("Incoming payload not a representation");
+               return ehResult;
+       }
+
+       OCRepPayload *getResp = NULL;
+       *payload = NULL;
+
+       if(ehRequest->resource == binary_switch_handle) {
+               if(_check_request_payload(ehRequest) != OC_EH_OK) {
+                       //LOG("Not supported Interface");
+                       return OC_EH_BAD_REQ;
+               } else {
+                       //getResp = _construct_response_of_firmware();
+               }
+       }
+
+       if (!getResp) {
+               //LOG("constructResponse failed");
+               return OC_EH_ERROR;
+       }
+
+       *payload = getResp;
+       ehResult = OC_EH_OK;
+
+       return ehResult;
+}
+
+
+static OCEntityHandlerResult _handle_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
+{
+       //LOG("ProcessPostRequest enter");
+       OCEntityHandlerResult ehResult = OC_EH_ERROR;
+       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
+               //LOG("Incoming payload not a representation");
+               return ehResult;
+       }
+
+       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
+       if (!input) {
+               //LOG("Failed to parse");
+               return ehResult;
+       }
+
+       if(ehRequest->resource == binary_switch_handle) {
+               if(_check_request_payload(ehRequest) != OC_EH_OK) {
+                       //LOG("Not supported Interface");
+                       return OC_EH_BAD_REQ;
+               } else {
+                       //_update_firmware_resource(input);
+               }
+       }
+
+       OCRepPayload *getResp = NULL;
+       //getResp = _construct_response_of_firmware();
+
+       if (!getResp) {
+               //LOG("constructResponse failed");
+               return OC_EH_ERROR;
+       }
+
+       *payload = getResp;
+       ehResult = OC_EH_OK;
+
+       return ehResult;
+}
+
+
+OCEntityHandlerResult _handle_oc_entity(OCEntityHandlerFlag flag,
+                                                                               OCEntityHandlerRequest *entityHandlerRequest,
+                                                                               void *callbackParam)
+{
+       OCEntityHandlerResult ehRet = OC_EH_OK;
+       OCEntityHandlerResponse response = { 0, 0, OC_EH_ERROR, 0, 0, \
+                                                                               { }, { 0 }, false };
+       OCRepPayload* payload = NULL;
+
+       if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
+               if (OC_REST_GET == entityHandlerRequest->method) {
+                       //LOG("Received OC_REST_GET request");
+                       ehRet = _handle_get_request(entityHandlerRequest, &payload);
+               } else if (OC_REST_PUT == entityHandlerRequest->method) {
+                       //LOG("Received OC_REST_PUT request, nothing to do");
+               } else if (OC_REST_POST == entityHandlerRequest->method) {
+                       //LOG("Received OC_REST_POST from client");
+                       ehRet = _handle_post_request(entityHandlerRequest, &payload);
+               }
+
+               // Format the response.  Note this requires some info about the request
+               response.requestHandle = entityHandlerRequest->requestHandle;
+               response.resourceHandle = entityHandlerRequest->resource;
+               response.ehResult = ehRet;
+               //response uses OCPaylod while all get,put methodes use OCRepPayload
+               response.payload = (OCPayload*)payload;
+               response.numSendVendorSpecificHeaderOptions = 0;
+               memset(response.sendVendorSpecificHeaderOptions, 0,
+                               sizeof(response.sendVendorSpecificHeaderOptions));
+               memset(response.resourceUri, 0, sizeof(response.resourceUri));
+               // Indicate that response is NOT in a persistent buffer
+               response.persistentBufferFlag = 0;
+
+               // Send the response
+               if (OCDoResponse(&response) != OC_STACK_OK) {
+                       //LOG("Error sending response");
+                       ehRet = OC_EH_ERROR;
+               }
+       }
+
+       if (entityHandlerRequest && (flag & OC_OBSERVE_FLAG)) {
+               //LOG("Flag includes OC_OBSERVE_FLAG");
+               if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
+                       //LOG ("Received OC_OBSERVE_REGISTER from Mediator");
+               } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
+                       //LOG ("Received OC_OBSERVE_DEREGISTER from Mediator");
+               }
+       }
+
+       return ehRet;
+}
+
+
+OCStackApplicationResult _handle_rd_publish_callback(void *ctx, OCDoHandle handle,
+        OCClientResponse *clientResponse)
+{
+       /* Debug */
+       if (clientResponse) {
+               //LOG("RD resource response received, code: %d", clientResponse->result);
+       }
+
+       publish_finish_cb callback = (publish_finish_cb)ctx;
+       if (callback)  {
+               if (clientResponse)
+                       callback(clientResponse->result);
+               else
+                       callback(OC_STACK_ERROR);
+       }
+
+       //controlee_check_firmware_upgraded();
+
+       return OC_STACK_KEEP_TRANSACTION;
+}
+
+
+OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle,
+        OCClientResponse *clientResponse)
+{
+       /* Debug */
+       if (clientResponse) {
+               //LOG("RD resource response received, code: %d", clientResponse->result);
+       }
+
+       publish_finish_cb callback = (destroy_finish_cb)ctx;
+       if (callback)  {
+               if (clientResponse)
+                       callback(clientResponse->result);
+               else
+                       callback(OC_STACK_ERROR);
+       }
+
+       return OC_STACK_KEEP_TRANSACTION;
+}
+
+int  _init_default_test_res()
+{
+       if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) {
+               printf("OCInit() failed\n");
+               return -1;
+       }
+
+       /* Create air conditioner resource handle */
+       if (OCCreateResource(&aircon_handle, "x.com.samsung.da.device",
+                                               OC_RSRVD_INTERFACE_DEFAULT,
+                                               "/sec/aircon/0",
+                                               _handle_oc_entity, NULL,
+                                               OC_DISCOVERABLE) != OC_STACK_OK) {
+               printf("OCCreateResource() failed\n");
+               return -1;
+       }
+
+       if (OCBindResourceInterfaceToResource(aircon_handle, OC_RSRVD_INTERFACE_BATCH) != OC_STACK_OK) {
+               printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_BATCH);
+       }
+
+       if (OCBindResourceInterfaceToResource(aircon_handle, OC_RSRVD_INTERFACE_LL) != OC_STACK_OK) {
+               printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_LL);
+       }
+
+       /* Create binary switch resource handle */
+       if (OCCreateResource(&binary_switch_handle, "oic.r.switch.binary",
+                                               OC_RSRVD_INTERFACE_DEFAULT,
+                                               "/power/0",
+                                               _handle_oc_entity, NULL,
+                                               OC_OBSERVABLE) != OC_STACK_OK) {
+               printf("OCCreateResource() failed\n");
+               return -1;
+       }
+
+
+       if (OCBindResource(aircon_handle, binary_switch_handle) != OC_STACK_OK) {
+               printf("OCBindResource() failed\n");
+               return -1;
+       }
+
+    OCDeviceInfo        devInfoAirConditioner;
+    OCStringLL          deviceType;
+
+    deviceType.value = "oic.d.airconditioner";
+    deviceType.next = NULL;
+    devInfoAirConditioner.deviceName = "FAC_2016";
+    devInfoAirConditioner.types = &deviceType;
+    devInfoAirConditioner.specVersion = NULL;
+    devInfoAirConditioner.dataModelVersions = NULL;
+
+   if (OCSetDeviceInfo(devInfoAirConditioner) != OC_STACK_OK) {
+               printf("OCSetDeviceInfo() failed\n");
+               return -1;
+       }
+
+   return 0;
+}
+
+
+int _create_fw_res()
+{
+       controlee_create_firmware_resource(&firmware_handle);
+
+       if (OCBindResource(aircon_handle, firmware_handle) != OC_STACK_OK) {
+               printf("OCBindResource() failed\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+
+int _publish_fw_res_to_rd()
+{
+       OCCallbackData cb_data = {NULL, NULL, NULL};
+       cb_data.cb = _handle_rd_publish_callback;
+       cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
+
+       if (OCRDPublish(OCF_SERVER_URL, CT_ADAPTER_TCP,
+                       aircon_handle, 3,
+                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+               printf("OCRDPublish() failed\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+
+int _delete_fw_res_from_rd()
+{
+       OCCallbackData cb_data = {NULL, NULL, NULL};
+       cb_data.cb = _handle_rd_delete_callback;
+       cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
+
+       if (OCRDDelete(OCF_SERVER_URL, CT_ADAPTER_TCP,
+                       aircon_handle, 3,
+                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+               printf("OCRDDelete() failed\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+
+int _destory_fw_res()
+{
+
+       if (controlee_destory_firmware_resource(firmware_handle) != CONTROLEE_FIRMWARE_SUCCESS) {
+               return -1;
+       }
+
+       return 0;
+}
+
+
+int _destory_default_res()
+{
+
+       if (OCDeleteResource(binary_switch_handle) != OC_STACK_OK) {
+               printf("OCDeleteResource() failed for binary_switch_handle\n");
+               return -1;
+       }
+
+       if (OCDeleteResource(aircon_handle) != OC_STACK_OK) {
+               printf("OCDeleteResource() failed for aircon_handle\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+void _show_menu()
+{
+       printf("============================================\n");
+       printf("=== Controlee firmware resource test app ===\n");
+       printf("============================================\n");
+       printf(" [1] Create default resource)\n");
+       printf(" [2] Create firmware resource\n");
+       printf(" [3] Publish resources to RD\n");
+       printf(" [4] Delete resources from RD\n");
+       printf(" [5] Destroy firmware resource\n");
+       printf(" [6] Destroy default resource\n");
+       printf(" [7] Set state changed callback\n");
+       printf(" [8] Unset state changed callback\n");
+       printf(" [9] Get firmware resource value\n");
+       printf(" [0] Exit\n");
+       printf("============================================\n");
+       printf("Input test menu : \n");
+}
+
+gboolean _main_thread(GIOChannel *channel, GIOCondition condition, gpointer data)
+{
+       if (condition != G_IO_IN)
+               return false;
+
+       int rv = 0;
+       gsize length;
+       gchar *str_ret;
+
+       g_io_channel_read_line(channel, &str_ret, &length, NULL, NULL);
+       if (!str_ret)
+               return false;
+
+       if (str_ret[0] == '\n' || str_ret[0] == '\r') {
+               _show_menu();
+       } else {
+               switch (str_ret[0]) {
+               case '1':
+                       rv = _init_default_test_res();
+                       break;
+               case '2':
+                       rv = _create_fw_res();
+                       break;
+               case '3':
+                       rv = _publish_fw_res_to_rd();
+                       break;
+               case '4':
+                       rv = _delete_fw_res_from_rd();
+                       break;
+               case '5':
+                       rv = _destory_fw_res();
+                       break;
+               case '6':
+                       rv = _destory_default_res();
+                       break;
+               case '7':
+                       //rv = _set_state_changed_cb();
+                       break;
+               case '8':
+                       //rv = _unset_state_changed_cb();
+                       break;
+               case '9':
+                       //rv = _get_fw_res_value();
+                       break;
+               case '0' :
+                       printf("Exit from test app!\n");
+                       exit(0);
+                       break;
+               default :
+                       break;
+               }
+
+               if (rv == 0)
+                       printf("operation succeeded!\n");
+               else
+                       printf("operation failed!\n");
+
+               printf("\n*** Press 'enter' to show menu *** \n");
+       }
+
+       g_free(str_ret);
+
+       return true;
+}
+
+int main(int argc, char *argv[])
+{
+       GMainLoop *mainloop;
+
+#if !GLIB_CHECK_VERSION(2, 36, 0)
+       g_type_init();
+#endif
+
+       mainloop = g_main_loop_new(NULL, false);
+
+       _show_menu();
+       GIOChannel *channel = g_io_channel_unix_new(0);
+       g_io_add_watch(channel, (G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL), _main_thread, NULL);
+       g_main_loop_run(mainloop);
+
+       return 0;
+}