tests: subsys: settings: stream encoding tests
Added tests for recently introduced sterem-style encoding. Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
This commit is contained in:
parent
76f8b97871
commit
84a88f107c
240
tests/subsys/settings/src/settings_enc.c
Normal file
240
tests/subsys/settings/src/settings_enc.c
Normal file
@ -0,0 +1,240 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include "settings_test.h"
|
||||
#include "settings_priv.h"
|
||||
|
||||
static char enc_buf[128];
|
||||
static int enc_buf_cnt;
|
||||
static u8_t test_rwbs = 1;
|
||||
#define ENC_CTX_VAL 0x2018
|
||||
|
||||
static int write_handler(void *ctx, off_t off, char const *buf, size_t len)
|
||||
{
|
||||
zassert_equal(ctx, (void *)ENC_CTX_VAL, "bad write calback context\n");
|
||||
|
||||
if (off % test_rwbs || len % test_rwbs) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
memcpy(&enc_buf[off], buf, len);
|
||||
enc_buf_cnt += len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void test_encoding_iteration(char const *name, char const *value,
|
||||
char const *pattern, int exp_len, u8_t wbs)
|
||||
{
|
||||
int rc;
|
||||
|
||||
test_rwbs = wbs;
|
||||
|
||||
settings_line_io_init(NULL, write_handler, wbs);
|
||||
|
||||
rc = settings_line_len_calc(name, strlen(value));
|
||||
|
||||
zassert_equal(rc, exp_len, "Wrong line length calculated, was %d.\n",
|
||||
rc);
|
||||
|
||||
enc_buf_cnt = 0;
|
||||
|
||||
rc = settings_line_write(name, value, strlen(value), 0,
|
||||
(void *)ENC_CTX_VAL);
|
||||
|
||||
zassert_equal(rc, 0, "Can't encode the line %d.\n", rc);
|
||||
|
||||
zassert_equal(enc_buf_cnt, exp_len, "Wrote more than expected\n");
|
||||
|
||||
zassert_true(memcmp(pattern, enc_buf, exp_len) == 0,
|
||||
"encoding defect, was : %s\nexpected: %s\n", enc_buf,
|
||||
pattern);
|
||||
}
|
||||
|
||||
void test_settings_encode(void)
|
||||
{
|
||||
char const name[] = "nordic";
|
||||
char const value[] = "Doubt. Only an evil man, master Geralt,"
|
||||
" is without it. And no one escapes his destiny";
|
||||
char const pattern[] = "nordic=RG91YnQuIE9ubHkgYW4gZXZpbCBtYW4sIG1hc3Rl"
|
||||
"ciBHZXJhbHQsIGlzIHdpdGhvdXQgaXQuIEFuZCBubyBvbmU"
|
||||
"gZXNjYXBlcyBoaXMgZGVzdGlueQ==\0";
|
||||
char const pattern2[] = "nordic=RG91YnQuIE9ubHkgYW4gZXZpbCBtYW4sIG1hc3R"
|
||||
"lciBHZXJhbHQsIGlzIHdpdGhvdXQgaXQuIEFuZCBubyBvb"
|
||||
"mUgZXNjYXBlcyBoaXMgZGVzdGlueQ==\0\0\0\0\0";
|
||||
char const name2[] = "nord";
|
||||
char const value2[] = "123";
|
||||
char const pattern3[] = "nord=MTIz\0\0\0";
|
||||
|
||||
test_encoding_iteration(name, value, pattern, 124, 4);
|
||||
test_encoding_iteration(name, value, pattern, 123, 1);
|
||||
test_encoding_iteration(name, value, pattern2, 128, 8);
|
||||
test_encoding_iteration(name2, value2, pattern3, 12, 4);
|
||||
test_encoding_iteration(name2, value2, pattern3, 9, 1);
|
||||
}
|
||||
|
||||
static int read_handle(void *ctx, off_t off, char *buf, size_t *len)
|
||||
{
|
||||
int r_len;
|
||||
|
||||
zassert_equal(ctx, (void *)ENC_CTX_VAL, "bad write calback context\n");
|
||||
|
||||
if (off % test_rwbs || *len % test_rwbs) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
r_len = min(sizeof(enc_buf) - off, *len);
|
||||
if (r_len <= 0) {
|
||||
*len = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(buf, &enc_buf[off], r_len);
|
||||
*len = r_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
char read_buf[128+10];
|
||||
|
||||
void test_raw_read_iteration(u8_t rbs, size_t off, size_t len)
|
||||
{
|
||||
test_rwbs = rbs;
|
||||
size_t len_read;
|
||||
int rc;
|
||||
size_t expected;
|
||||
|
||||
memset(read_buf, 0x00, sizeof(read_buf));
|
||||
|
||||
settings_line_io_init(read_handle, write_handler, rbs);
|
||||
|
||||
rc = settings_line_raw_read(off, &read_buf[4], len, &len_read,
|
||||
(void *)ENC_CTX_VAL);
|
||||
|
||||
zassert_equal(rc, 0, "Can't read the line %d.\n", rc);
|
||||
|
||||
expected = min((sizeof(enc_buf) - off), len);
|
||||
zassert_equal(expected, len_read, "Unexpected read size\n");
|
||||
|
||||
zassert_true(memcmp(&enc_buf[off], &read_buf[4], len_read) == 0,
|
||||
"read defect\n");
|
||||
|
||||
for (rc = 0; rc < 4; rc++) {
|
||||
zassert_equal(read_buf[rc], 0, "buffer lickage\n");
|
||||
}
|
||||
|
||||
for (rc = len_read + 4; rc < sizeof(read_buf); rc++) {
|
||||
zassert_equal(read_buf[rc], 0, "buffer lickage\n");
|
||||
}
|
||||
}
|
||||
|
||||
void test_setting_raw_read(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sizeof(enc_buf); i++) {
|
||||
enc_buf[i] = i + 1;
|
||||
}
|
||||
|
||||
test_raw_read_iteration(1, 0, 56);
|
||||
test_raw_read_iteration(1, 5, 128);
|
||||
test_raw_read_iteration(4, 1, 56);
|
||||
test_raw_read_iteration(4, 0, 128);
|
||||
test_raw_read_iteration(4, 3, 128);
|
||||
test_raw_read_iteration(8, 3, 128);
|
||||
test_raw_read_iteration(8, 0, 128);
|
||||
test_raw_read_iteration(8, 77, 3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void test_val_read_iteration(char const *src, size_t src_len,
|
||||
char const *pattern, size_t pattern_len,
|
||||
size_t len, u8_t rbs, size_t off, size_t val_off)
|
||||
{
|
||||
size_t len_read;
|
||||
int rc;
|
||||
|
||||
memcpy(enc_buf, src, src_len);
|
||||
|
||||
test_rwbs = rbs;
|
||||
|
||||
settings_line_io_init(read_handle, write_handler, rbs);
|
||||
|
||||
rc = settings_line_val_read(val_off, off, read_buf, len, &len_read,
|
||||
(void *)ENC_CTX_VAL);
|
||||
|
||||
zassert_equal(rc, 0, "Can't read the value.\n");
|
||||
|
||||
zassert_equal(len_read, pattern_len, "Bad length (was %d).\n",
|
||||
len_read);
|
||||
read_buf[len_read] = 0;
|
||||
zassert_true(memcmp(pattern, read_buf, pattern_len) == 0,
|
||||
"encoding defect, was :\n%s\nexpected :\n%s\n", read_buf,
|
||||
pattern);
|
||||
}
|
||||
|
||||
void test_setting_val_read(void)
|
||||
{
|
||||
char const val_src[] = "V2FzIHdyaXR0ZW4gaW4gS3Jha293AA==";
|
||||
char const val_src2[] = "jozef/pilsodski="
|
||||
"V2FzIHdyaXR0ZW4gaW4gS3Jha293AA==";
|
||||
char const val_pattern[] = "Was written in Krakow";
|
||||
|
||||
test_val_read_iteration(val_src, sizeof(val_src), val_pattern,
|
||||
sizeof(val_pattern), 128, 1, 0, 0);
|
||||
test_val_read_iteration(val_src, sizeof(val_src), &val_pattern[1],
|
||||
sizeof(val_pattern) - 1, 128, 1, 1, 0);
|
||||
test_val_read_iteration(val_src, sizeof(val_src), val_pattern,
|
||||
sizeof(val_pattern), sizeof(val_pattern), 1, 0,
|
||||
0);
|
||||
|
||||
for (int j = 1; j < sizeof(val_pattern); j++) {
|
||||
for (int i = 0; i < sizeof(val_pattern) - j; i++) {
|
||||
test_val_read_iteration(val_src, sizeof(val_src),
|
||||
&val_pattern[i], j, j, 1, i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 1; j < sizeof(val_pattern); j++) {
|
||||
for (int i = 0; i < sizeof(val_pattern) - j; i++) {
|
||||
test_val_read_iteration(val_src2, sizeof(val_src2),
|
||||
&val_pattern[i], j, j, 1, i,
|
||||
16);
|
||||
}
|
||||
}
|
||||
|
||||
test_val_read_iteration(val_src, sizeof(val_src), val_pattern,
|
||||
sizeof(val_pattern), 128, 4, 0, 0);
|
||||
test_val_read_iteration(val_src, sizeof(val_src), &val_pattern[1],
|
||||
sizeof(val_pattern) - 1, 128, 4, 1, 0);
|
||||
test_val_read_iteration(val_src, sizeof(val_src), val_pattern,
|
||||
sizeof(val_pattern), sizeof(val_pattern), 4, 0,
|
||||
0);
|
||||
|
||||
for (int j = 1; j < sizeof(val_pattern); j++) {
|
||||
for (int i = 0; i < sizeof(val_pattern) - j; i++) {
|
||||
test_val_read_iteration(val_src, sizeof(val_src),
|
||||
&val_pattern[i], j, j, 4, i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
test_val_read_iteration(val_src, sizeof(val_src), val_pattern,
|
||||
sizeof(val_pattern), 128, 8, 0, 0);
|
||||
test_val_read_iteration(val_src, sizeof(val_src), &val_pattern[1],
|
||||
sizeof(val_pattern) - 1, 128, 8, 1, 0);
|
||||
test_val_read_iteration(val_src, sizeof(val_src), val_pattern,
|
||||
sizeof(val_pattern), sizeof(val_pattern), 8, 0,
|
||||
0);
|
||||
|
||||
for (int j = 1; j < sizeof(val_pattern); j++) {
|
||||
for (int i = 0; i < sizeof(val_pattern) - j; i++) {
|
||||
test_val_read_iteration(val_src, sizeof(val_src),
|
||||
&val_pattern[i], j, j, 8, i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user