mirror of https://gerrit.osmocom.org/libosmocore
Use value_string for ctrl_type
Use value_string for enum ctrl_type instead of custom code. Add corresponding unit tests. Related: OS#1615 Change-Id: Icd4e96dd9f00876cb70b43cfcf42ab4f10311b28
This commit is contained in:
parent
9756c4691d
commit
70c7d4160d
|
@ -59,7 +59,7 @@ tests/package.m4
|
|||
tests/testsuite
|
||||
tests/testsuite.dir/
|
||||
tests/testsuite.log
|
||||
|
||||
tests/ctrl/ctrl_test
|
||||
tests/utils/utils_test
|
||||
tests/stats/stats_test
|
||||
tests/kasumi/kasumi_test
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/core/write_queue.h>
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/vty/vector.h>
|
||||
|
||||
#define CTRL_CMD_ERROR -1
|
||||
|
@ -22,7 +22,7 @@ enum ctrl_node_type {
|
|||
};
|
||||
|
||||
enum ctrl_type {
|
||||
CTRL_TYPE_UNKNOWN,
|
||||
CTRL_TYPE_UNKNOWN = 0,
|
||||
CTRL_TYPE_GET,
|
||||
CTRL_TYPE_SET,
|
||||
CTRL_TYPE_GET_REPLY,
|
||||
|
@ -31,6 +31,8 @@ enum ctrl_type {
|
|||
CTRL_TYPE_ERROR
|
||||
};
|
||||
|
||||
extern const struct value_string ctrl_type_vals[];
|
||||
|
||||
struct ctrl_connection {
|
||||
struct llist_head list_entry;
|
||||
|
||||
|
|
|
@ -33,42 +33,22 @@
|
|||
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/talloc.h>
|
||||
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/vty/command.h>
|
||||
#include <osmocom/vty/vector.h>
|
||||
|
||||
extern vector ctrl_node_vec;
|
||||
|
||||
static struct ctrl_cmd_map ccm[] = {
|
||||
{"GET", CTRL_TYPE_GET},
|
||||
{"SET", CTRL_TYPE_SET},
|
||||
{"GET_REPLY", CTRL_TYPE_GET_REPLY},
|
||||
{"SET_REPLY", CTRL_TYPE_SET_REPLY},
|
||||
{"TRAP", CTRL_TYPE_TRAP},
|
||||
{"ERROR", CTRL_TYPE_ERROR},
|
||||
{NULL}
|
||||
const struct value_string ctrl_type_vals[] = {
|
||||
{ CTRL_TYPE_GET, "GET" },
|
||||
{ CTRL_TYPE_SET, "SET" },
|
||||
{ CTRL_TYPE_GET_REPLY, "GET_REPLY" },
|
||||
{ CTRL_TYPE_SET_REPLY, "SET_REPLY" },
|
||||
{ CTRL_TYPE_TRAP, "TRAP" },
|
||||
{ CTRL_TYPE_ERROR, "ERROR" },
|
||||
{ CTRL_TYPE_UNKNOWN, NULL }
|
||||
};
|
||||
|
||||
static int ctrl_cmd_str2type(char *s)
|
||||
{
|
||||
int i;
|
||||
for (i=0; ccm[i].cmd != NULL; i++) {
|
||||
if (strcasecmp(s, ccm[i].cmd) == 0)
|
||||
return ccm[i].type;
|
||||
}
|
||||
return CTRL_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
static char *ctrl_cmd_type2str(int type)
|
||||
{
|
||||
int i;
|
||||
for (i=0; ccm[i].cmd != NULL; i++) {
|
||||
if (ccm[i].type == type)
|
||||
return ccm[i].cmd;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Functions from libosmocom */
|
||||
extern vector cmd_make_descvec(const char *string, const char *descstr);
|
||||
|
||||
|
@ -308,7 +288,7 @@ struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg)
|
|||
goto err;
|
||||
}
|
||||
|
||||
cmd->type = ctrl_cmd_str2type(tmp);
|
||||
cmd->type = get_string_value(ctrl_type_vals, tmp);
|
||||
if (cmd->type == CTRL_TYPE_UNKNOWN) {
|
||||
cmd->type = CTRL_TYPE_ERROR;
|
||||
cmd->id = "err";
|
||||
|
@ -403,7 +383,8 @@ err:
|
|||
struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd)
|
||||
{
|
||||
struct msgb *msg;
|
||||
char *type, *tmp;
|
||||
const char *type;
|
||||
char *tmp;
|
||||
|
||||
if (!cmd->id)
|
||||
return NULL;
|
||||
|
@ -412,7 +393,7 @@ struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd)
|
|||
if (!msg)
|
||||
return NULL;
|
||||
|
||||
type = ctrl_cmd_type2str(cmd->type);
|
||||
type = get_value_string(ctrl_type_vals, cmd->type);
|
||||
|
||||
switch (cmd->type) {
|
||||
case CTRL_TYPE_GET:
|
||||
|
|
|
@ -11,7 +11,7 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test \
|
|||
logging/logging_test fr/fr_test codec/codec_test \
|
||||
loggingrb/loggingrb_test strrb/strrb_test \
|
||||
vty/vty_test comp128/comp128_test utils/utils_test \
|
||||
smscb/gsm0341_test stats/stats_test \
|
||||
smscb/gsm0341_test stats/stats_test ctrl/ctrl_test \
|
||||
bitvec/bitvec_test msgb/msgb_test bits/bitcomp_test \
|
||||
tlv/tlv_test gsup/gsup_test oap/oap_test fsm/fsm_test \
|
||||
write_queue/wqueue_test socket/socket_test
|
||||
|
@ -42,6 +42,9 @@ comp128_comp128_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/
|
|||
auth_milenage_test_SOURCES = auth/milenage_test.c
|
||||
auth_milenage_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la
|
||||
|
||||
ctrl_ctrl_test_SOURCES = ctrl/ctrl_test.c
|
||||
ctrl_ctrl_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/ctrl/libosmoctrl.la
|
||||
|
||||
gea_gea_test_SOURCES = gea/gea_test.c
|
||||
gea_gea_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la
|
||||
|
||||
|
@ -164,7 +167,7 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac
|
|||
EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \
|
||||
timer/timer_test.ok sms/sms_test.ok ussd/ussd_test.ok \
|
||||
smscb/smscb_test.ok bits/bitrev_test.ok a5/a5_test.ok \
|
||||
conv/conv_test.ok auth/milenage_test.ok \
|
||||
conv/conv_test.ok auth/milenage_test.ok ctrl/ctrl_test.ok \
|
||||
lapd/lapd_test.ok gsm0408/gsm0408_test.ok \
|
||||
gsm0808/gsm0808_test.ok gb/bssgp_fc_tests.err \
|
||||
gb/bssgp_fc_tests.ok gb/bssgp_fc_tests.sh \
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/ctrl/control_cmd.h>
|
||||
|
||||
inline void check_type(enum ctrl_type c)
|
||||
{
|
||||
const char *t = get_value_string(ctrl_type_vals, c);
|
||||
int v = get_string_value(ctrl_type_vals, t);
|
||||
|
||||
printf("ctrl type %d is %s ", c, t);
|
||||
if (v < 0)
|
||||
printf("[PARSE FAILED]\n");
|
||||
else
|
||||
printf("-> %d %s\n", v, c != v ? "FAIL" : "OK");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
printf("Checking ctrl types...\n");
|
||||
|
||||
check_type(CTRL_TYPE_UNKNOWN);
|
||||
check_type(CTRL_TYPE_GET);
|
||||
check_type(CTRL_TYPE_SET);
|
||||
check_type(CTRL_TYPE_GET_REPLY);
|
||||
check_type(CTRL_TYPE_SET_REPLY);
|
||||
check_type(CTRL_TYPE_TRAP);
|
||||
check_type(CTRL_TYPE_ERROR);
|
||||
check_type(64);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
Checking ctrl types...
|
||||
ctrl type 0 is unknown 0x0 [PARSE FAILED]
|
||||
ctrl type 1 is GET -> 1 OK
|
||||
ctrl type 2 is SET -> 2 OK
|
||||
ctrl type 3 is GET_REPLY -> 3 OK
|
||||
ctrl type 4 is SET_REPLY -> 4 OK
|
||||
ctrl type 5 is TRAP -> 5 OK
|
||||
ctrl type 6 is ERROR -> 6 OK
|
||||
ctrl type 64 is unknown 0x40 [PARSE FAILED]
|
|
@ -9,6 +9,12 @@ cat $abs_srcdir/a5/a5_test.ok > expout
|
|||
AT_CHECK([$abs_top_builddir/tests/a5/a5_test], [0], [expout])
|
||||
AT_CLEANUP
|
||||
|
||||
AT_SETUP([ctrl])
|
||||
AT_KEYWORDS([ctrl])
|
||||
cat $abs_srcdir/ctrl/ctrl_test.ok > expout
|
||||
AT_CHECK([$abs_top_builddir/tests/ctrl/ctrl_test], [0], [expout])
|
||||
AT_CLEANUP
|
||||
|
||||
AT_SETUP([kasumi])
|
||||
AT_KEYWORDS([kasumi])
|
||||
cat $abs_srcdir/kasumi/kasumi_test.ok > expout
|
||||
|
|
Loading…
Reference in New Issue