{ ARG_SENSORS, required_argument, NULL, ARG_S_SENSORS },
{ ARG_SDB, required_argument, NULL, ARG_S_SDB },
{ ARG_SDBD_LISTEN_PORT, required_argument, NULL, ARG_S_SDBD_LISTEN_PORT },
+ { ARG_HELP, no_argument, NULL, ARG_S_HELP },
+ { ARG_USAGE, no_argument, NULL, ARG_S_USAGE },
{ NULL, 0, NULL, 0 }
};
return SDBD_COMMANDLINE_FAILURE;
}
break;
+ case ARG_S_HELP:
+ return SDBD_COMMANDLINE_HELP;
+ case ARG_S_USAGE:
+ return SDBD_COMMANDLINE_USAGE;
case 1:
return SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT;
case '?':
memset(sdbd_args, 0, sizeof(SdbdCommandlineArgs));
}
+
+
+void print_sdbd_usage_message(FILE *stream) {
+ const char *format = "Usage sdbd [OPTION]...\n"
+ "\t-%c, --%s=HOST:PORT\temulator's name and forward port\n"
+ "\t-%c, --%s=HOST:PORT\thostname or IP and port of sdb listening on host\n"
+ "\t-%c, --%s=HOST:PORT \thostname or IP and port of sensors daemon\n"
+ "\t-%c, --%s=PORT \tport on which sdbd shall be listening on\n"
+ "\t-%c, --%s \tprint help message\n"
+ "\t-%c, --%s \tprint this usage message\n"
+ ;
+
+ fprintf(stream, format,
+ ARG_S_EMULATOR_VM_NAME, ARG_EMULATOR_VM_NAME,
+ ARG_S_SDB, ARG_SDB,
+ ARG_S_SENSORS, ARG_SENSORS,
+ ARG_S_SDBD_LISTEN_PORT, ARG_SDBD_LISTEN_PORT,
+ ARG_S_HELP, ARG_HELP,
+ ARG_S_USAGE, ARG_USAGE
+ );
+}
#define ARG_SENSORS "sensors"
#define ARG_S_SENSORS 's'
+#define ARG_HELP "help"
+#define ARG_S_HELP 'h'
+
+#define ARG_USAGE "usage"
+#define ARG_S_USAGE 'u'
+
#define SDBD_COMMANDLINE_SUCCESS 0 ///< Success
#define SDBD_COMMANDLINE_FAILURE -1 ///< Generic failure
#define SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT -2 ///< Unknown option
+#define SDBD_COMMANDLINE_HELP 1 ///< Help request
+#define SDBD_COMMANDLINE_USAGE 2 ///< Usage message request
/*!
* @struct HostPort
int sdbd_port; ///< Port to listen on in tcp mode
} SdbdCommandlineArgs;
+#include <stdio.h>
/*!
* @fn int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[])
*/
void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args);
+/*!
+ * @fn void print_usage_message(FILE *stream)
+ * @brief Prints usage message to specified \stream
+ *
+ * @param stream Stream to print to
+ */
+void print_sdbd_usage_message(FILE *stream);
+
#endif /* COMMANDLINE_SDBD_H */
recovery_mode = 1;
}
#endif
+
+ apply_sdbd_commandline_defaults(&sdbd_commandline_args);
+ int parse_ret = parse_sdbd_commandline(&sdbd_commandline_args, argc, argv);
+
+ // TODO: Add detailed error messages
+ // TODO: Add individual messages for help and usage
+ if(parse_ret != SDBD_COMMANDLINE_SUCCESS) {
+ if (parse_ret == SDBD_COMMANDLINE_HELP
+ || parse_ret == SDBD_COMMANDLINE_USAGE) {
+ // User requested help or usage
+ print_sdbd_usage_message(stdout);
+ return EXIT_SUCCESS;
+ }
+
+ // Print usage message because of invalid options
+ print_sdbd_usage_message(stderr);
+ return EXIT_FAILURE;
+ }
+
#if !SDB_HOST
if (daemonize() < 0)
fatal("daemonize() failed: %.200s", strerror(errno));
//sdbd will never die on emulator!
signal(SIGTERM, handle_sig_term); /* tizen specific */
- apply_sdbd_commandline_defaults(&sdbd_commandline_args);
- parse_sdbd_commandline(&sdbd_commandline_args, argc, argv);
return sdb_main(0, DEFAULT_SDB_PORT);
#endif
}
print_nullable((hp)->host), (hp)->port, print_nullable(h), (p)))
+#define array_size(a) \
+ (sizeof(a) / sizeof((a)[0]))
+
+
void setup(void) {
}
}
-START_TEST(test_ok) {
- char *argv[] = {
+START_TEST(test_all_opts) {
+ char *test_argv[] = {
"./test",
"--emulator=tizen:101",
"--listen-port=101",
SdbdCommandlineArgs sdbd_args = {0};
apply_sdbd_commandline_defaults(&sdbd_args);
- int parse_res = parse_sdbd_commandline(&sdbd_args, 5, argv);
+ int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv);
if (parse_res != SDBD_COMMANDLINE_SUCCESS) {
ck_abort_msg("parsing commandline failed");
START_TEST(test_empty) {
- char *argv[] = {
+ char *test_argv[] = {
"./test"
};
SdbdCommandlineArgs sdbd_args = {0};
- int parse_res = parse_sdbd_commandline(&sdbd_args, 1, argv);
+ int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv);
if (parse_res != SDBD_COMMANDLINE_SUCCESS) {
ck_abort_msg("parsing commandline failed");
START_TEST(test_unknown) {
- char *argv[] = {
+ char *test_argv[] = {
"./test",
"--emulator=tizen:26101",
"--unknown=true"
SdbdCommandlineArgs sdbd_args = {0};
- int parse_res = parse_sdbd_commandline(&sdbd_args, 3, argv);
+ int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv);
if (parse_res != SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT) {
ck_abort_msg("parsing commandline failed");
} END_TEST
+START_TEST(test_usage_message) {
+ FILE *stream;
+ char *buffer = NULL;
+ size_t buf_len = 0;
+
+ stream = open_memstream(&buffer, &buf_len);
+ print_sdbd_usage_message(stream);
+ fclose(stream);
+
+ // Just check if all options are mentioned in usage message
+ ck_assert(strstr(buffer, "--"ARG_EMULATOR_VM_NAME) != NULL);
+ ck_assert(strstr(buffer, "--"ARG_SDBD_LISTEN_PORT) != NULL);
+ ck_assert(strstr(buffer, "--"ARG_SDB) != NULL);
+ ck_assert(strstr(buffer, "--"ARG_SENSORS) != NULL);
+ ck_assert(strstr(buffer, "--"ARG_HELP) != NULL);
+ ck_assert(strstr(buffer, "--"ARG_USAGE) != NULL);
+
+ free(buffer);
+} END_TEST
+
+START_TEST(test_usage) {
+ char *test_argv[] = {
+ "./test",
+ "--usage"
+ };
+
+ SdbdCommandlineArgs sdbd_args = {0};
+
+ int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv);
+ ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_USAGE);
+
+} END_TEST
+
+
+START_TEST(test_help) {
+ char *test_argv[] = {
+ "./test",
+ "--help"
+ };
+
+ SdbdCommandlineArgs sdbd_args = {0};
+
+ int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv);
+ ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_HELP);
+
+} END_TEST
+
+
+START_TEST(test_help_other_opt) {
+ char *test_argv[] = {
+ "./test",
+ "--listen-port=1234",
+ "--help"
+ };
+
+ SdbdCommandlineArgs sdbd_args = {0};
+
+ int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv);
+ ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_HELP);
+
+} END_TEST
+
+
Suite *sdbd_commandline_suite (void) {
Suite *s = suite_create ("sdbd commandline");
TCase *tc_core = tcase_create ("Core");
tcase_add_checked_fixture(tc_core, setup, teardown);
- tcase_add_test (tc_core, test_ok);
+ tcase_add_test (tc_core, test_all_opts);
tcase_add_test (tc_core, test_empty);
tcase_add_test (tc_core, test_unknown);
tcase_add_test (tc_core, test_clear_args);
tcase_add_test (tc_core, test_double_clear);
tcase_add_test (tc_core, test_default_args);
+ tcase_add_test (tc_core, test_usage_message);
+ tcase_add_test (tc_core, test_usage);
+ tcase_add_test (tc_core, test_help);
+ tcase_add_test (tc_core, test_help_other_opt);
suite_add_tcase (s, tc_core);
return s;