Skip to content

Commit

Permalink
lib: lte_link_control: Periodic search clean up
Browse files Browse the repository at this point in the history
Cleaning up the code related to lte_lc_periodic_search_get()
to make it easier to test. Added few tests to cover
periodic search functions with 100% branch coverage.

Signed-off-by: Tommi Rantanen <[email protected]>
  • Loading branch information
trantanen authored and tmon-nordic committed Aug 19, 2024
1 parent 2a92b1a commit 37e656c
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 44 deletions.
16 changes: 7 additions & 9 deletions lib/lte_link_control/lte_lc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1662,7 +1662,7 @@ int lte_lc_periodic_search_set(const struct lte_lc_periodic_search_cfg *const cf
return -EFAULT;
} else if (err > 0) {
/* The modem responded with "ERROR". */
LOG_ERR("The modem rejected the configuration");
LOG_ERR("The modem rejected the configuration, err: %d", err);
return -EBADMSG;
}

Expand Down Expand Up @@ -1721,7 +1721,7 @@ int lte_lc_periodic_search_get(struct lte_lc_periodic_search_cfg *const cfg)
} else if (err < 0) {
return -EFAULT;
} else if (err < 4) {
/* No pattern found */
/* Not all parameters and at least one pattern found */
return -EBADMSG;
}

Expand All @@ -1732,14 +1732,12 @@ int lte_lc_periodic_search_get(struct lte_lc_periodic_search_cfg *const cfg)
*/
cfg->pattern_count = err - 3;

if (cfg->pattern_count >= 1) {
LOG_DBG("Pattern 1: %s", pattern_buf[0]);
LOG_DBG("Pattern 1: %s", pattern_buf[0]);

err = parse_periodic_search_pattern(pattern_buf[0], &cfg->patterns[0]);
if (err) {
LOG_ERR("Failed to parse periodic search pattern");
return err;
}
err = parse_periodic_search_pattern(pattern_buf[0], &cfg->patterns[0]);
if (err) {
LOG_ERR("Failed to parse periodic search pattern");
return err;
}

if (cfg->pattern_count >= 2) {
Expand Down
49 changes: 14 additions & 35 deletions lib/lte_link_control/lte_lc_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -1449,7 +1449,7 @@ int parse_mdmev(const char *at_response, enum lte_lc_modem_evt *modem_evt)
char *periodic_search_pattern_get(char *const buf, size_t buf_size,
const struct lte_lc_periodic_search_pattern *const pattern)
{
int err;
int len = 0;

__ASSERT_NO_MSG(buf != NULL);
__ASSERT_NO_MSG(pattern != NULL);
Expand All @@ -1460,67 +1460,46 @@ char *periodic_search_pattern_get(char *const buf, size_t buf_size,
* <pattern_end_point>"
*/
if (pattern->range.time_to_final_sleep != -1) {
err = snprintk(buf, buf_size, "\"0,%u,%u,%u,%u\"",
len = snprintk(buf, buf_size, "\"0,%u,%u,%u,%u\"",
pattern->range.initial_sleep, pattern->range.final_sleep,
pattern->range.time_to_final_sleep,
pattern->range.pattern_end_point);
if (err < 0 || err >= buf_size) {
goto error;
}
} else {
err = snprintk(buf, buf_size, "\"0,%u,%u,,%u\"",
len = snprintk(buf, buf_size, "\"0,%u,%u,,%u\"",
pattern->range.initial_sleep, pattern->range.final_sleep,
pattern->range.pattern_end_point);
if (err < 0 || err >= buf_size) {
goto error;
}
}
} else if (pattern->type == LTE_LC_PERIODIC_SEARCH_PATTERN_TABLE) {
/* Table format: "<type>,<val1>[,<val2>][,<val3>][,<val4>][,<val5>]". */
if (pattern->table.val_2 == -1) {
err = snprintk(buf, buf_size, "\"1,%u\"", pattern->table.val_1);
if (err < 0 || err >= buf_size) {
goto error;
}
len = snprintk(buf, buf_size, "\"1,%u\"", pattern->table.val_1);
} else if (pattern->table.val_3 == -1) {
err = snprintk(buf, buf_size, "\"1,%u,%u\"",
len = snprintk(buf, buf_size, "\"1,%u,%u\"",
pattern->table.val_1, pattern->table.val_2);
if (err < 0 || err >= buf_size) {
goto error;
}
} else if (pattern->table.val_4 == -1) {
err = snprintk(buf, buf_size, "\"1,%u,%u,%u\"",
len = snprintk(buf, buf_size, "\"1,%u,%u,%u\"",
pattern->table.val_1, pattern->table.val_2,
pattern->table.val_3);
if (err < 0 || err >= buf_size) {
goto error;
}
} else if (pattern->table.val_5 == -1) {
err = snprintk(buf, buf_size, "\"1,%u,%u,%u,%u\"",
len = snprintk(buf, buf_size, "\"1,%u,%u,%u,%u\"",
pattern->table.val_1, pattern->table.val_2,
pattern->table.val_3, pattern->table.val_4);
if (err < 0 || err >= buf_size) {
goto error;
}
} else {
err = snprintk(buf, buf_size, "\"1,%u,%u,%u,%u,%u\"",
len = snprintk(buf, buf_size, "\"1,%u,%u,%u,%u,%u\"",
pattern->table.val_1, pattern->table.val_2,
pattern->table.val_3, pattern->table.val_4,
pattern->table.val_5);
if (err < 0 || err >= buf_size) {
goto error;
}
}
} else {
LOG_WRN("Unrecognized periodic search pattern type");
LOG_ERR("Unrecognized periodic search pattern type");
buf[0] = '\0';
}

return buf;

error:
LOG_ERR("An error occurred, the pattern string is empty. Error code %d", err);
buf[0] = '\0';
if (len >= buf_size) {
LOG_ERR("Encoding periodic search pattern failed. Too small buffer (%d/%d)",
len, buf_size);
buf[0] = '\0';
}

return buf;
}
Expand Down
46 changes: 46 additions & 0 deletions tests/lib/lte_lc_api/src/lte_lc_api_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -3748,6 +3748,52 @@ void test_lte_lc_periodic_search_set_patterns4_success(void)
TEST_ASSERT_EQUAL(EXIT_SUCCESS, ret);
}

void test_lte_lc_periodic_search_set_max_values_fail(void)
{
int ret;
struct lte_lc_periodic_search_cfg cfg = { 0 };

cfg.pattern_count = 1;
cfg.loop = 0;
cfg.return_to_pattern = 1;
cfg.band_optimization = 1;
cfg.patterns[0].type = 2; /* Unknown type */
cfg.patterns[0].table.val_1 = 10;
cfg.patterns[0].table.val_2 = 20;
cfg.patterns[0].table.val_3 = 30;
cfg.patterns[0].table.val_4 = 40;
cfg.patterns[0].table.val_5 = 50;

__mock_nrf_modem_at_printf_ExpectAndReturn(
"AT%PERIODICSEARCHCONF=0,0,1,1,", 65536);

ret = lte_lc_periodic_search_set(&cfg);
TEST_ASSERT_EQUAL(-EBADMSG, ret);
}

void test_lte_lc_periodic_search_set_unknown_search_pattern_type_fail(void)
{
int ret;
struct lte_lc_periodic_search_cfg cfg = { 0 };

cfg.pattern_count = 1;
cfg.loop = 0;
cfg.return_to_pattern = 1;
cfg.band_optimization = 1;
cfg.patterns[0].type = 1;
cfg.patterns[0].table.val_1 = INT_MAX;
cfg.patterns[0].table.val_2 = INT_MAX;
cfg.patterns[0].table.val_3 = INT_MAX;
cfg.patterns[0].table.val_4 = INT_MAX;
cfg.patterns[0].table.val_5 = INT_MAX;

__mock_nrf_modem_at_printf_ExpectAndReturn(
"AT%PERIODICSEARCHCONF=0,0,1,1,", 65536);

ret = lte_lc_periodic_search_set(&cfg);
TEST_ASSERT_EQUAL(-EBADMSG, ret);
}

void test_lte_lc_periodic_search_set_at_fail(void)
{
int ret;
Expand Down

0 comments on commit 37e656c

Please sign in to comment.