libtest: Change fixture scope method

Return the produced character count.  There is no need for a NUL
termination.

Update #3199.
This commit is contained in:
Sebastian Huber
2020-08-18 07:08:51 +02:00
parent 5869c64793
commit 5a8114c6c5
3 changed files with 86 additions and 67 deletions
+7 -2
View File
@@ -62,7 +62,7 @@ typedef struct T_fixture {
void (*setup)(void *);
void (*stop)(void *);
void (*teardown)(void *);
void (*scope)(void *, char *, size_t);
size_t (*scope)(void *, char *, size_t);
void *initial_context;
} T_fixture;
@@ -2324,14 +2324,19 @@ T_NO_RETURN void T_stop(void);
*
* @param second_indices is an array of indices defining which descriptive
* string is used for each entry in the description table.
*
* @return Returns the characters consumed from the buffer for the produced
* scope.
*/
void T_get_scope(
size_t T_get_scope(
const char * const * const *desc,
char *buf,
size_t n,
const size_t *second_indices
);
size_t T_str_copy(char *, const char *, size_t);
#ifdef __rtems__
#define T_TEST_CASE_FIXTURE(name, fixture) \
void T_case_body_##name(void); \
+75 -61
View File
@@ -244,9 +244,26 @@ T_cpu(void)
#endif
}
size_t
T_str_copy(char *dst, const char *src, size_t n)
{
size_t i;
i = 0;
while (*src != '\0' && i < n) {
*dst = *src;
++dst;
++src;
++i;
}
return i;
}
#if defined(__rtems__)
static const char *
T_object_name_to_string(Objects_Name name, char *buf)
static size_t
T_object_name_to_string(char *dst, Objects_Name name, size_t n)
{
uint32_t on;
size_t i;
@@ -260,18 +277,18 @@ T_object_name_to_string(Objects_Name name, char *buf)
c = (unsigned char)(on >> s);
if (c >= '!' && c <= '~') {
buf[i] = (char)c;
if (c >= '!' && c <= '~' && i < n) {
*dst = (char)c;
++dst;
++i;
}
}
buf[i] = '\0';
return buf;
return i;
}
static const char *
T_thread_name(const Thread_Control *th, char *buf)
static size_t
T_thread_name(char *dst, const Thread_Control *th, size_t n)
{
if (th != NULL) {
const char *name;
@@ -279,23 +296,21 @@ T_thread_name(const Thread_Control *th, char *buf)
name = th->Join_queue.Queue.name;
if (name != NULL && name[0] != '\0') {
return name;
} else {
return T_object_name_to_string(th->Object.name, buf);
return T_str_copy(dst, name, n);
}
} else {
buf[0] = '?';
buf[1] = '\0';
return buf;
return T_object_name_to_string(dst, th->Object.name, n);
}
return T_str_copy(dst, "?", n);
}
#endif
static const char *
T_scope(T_context *ctx, char *buf)
static size_t
T_scope(T_context *ctx, char *dst, size_t n)
{
const char *r;
T_fixture_node *node;
size_t len;
#if defined(__rtems__)
ISR_Level level;
@@ -309,31 +324,26 @@ T_scope(T_context *ctx, char *buf)
executing = _Per_CPU_Get_executing(cpu_self);
_ISR_Local_enable(level);
r = T_thread_name(executing, buf);
len = T_thread_name(dst, executing, n);
} else {
_ISR_Local_enable(level);
buf[0] = 'I';
buf[1] = 'S';
buf[2] = 'R';
buf[3] = '\0';
r = buf;
len = T_str_copy(dst, "ISR", n);
}
#elif defined(__linux__)
static __thread char name[128];
(void)buf;
if (name[0] == '\0') {
pthread_getname_np(pthread_self(), name, sizeof(name));
}
r = &name[0];
len = T_str_copy(dst, name, n);
#else
buf[0] = '?';
buf[1] = '\0';
r = buf;
len = T_str_copy(dst, "?", n);
#endif
dst += len;
n -= len;
node = &ctx->case_fixture;
do {
@@ -342,17 +352,18 @@ T_scope(T_context *ctx, char *buf)
fixture = node->fixture;
if (fixture != NULL && fixture->scope != NULL) {
size_t n;
size_t m;
n = strlen(r);
(*fixture->scope)(node->context, buf + n,
T_SCOPE_SIZE - n);
m = (*fixture->scope)(node->context, dst, n);
dst += m;
n -= m;
len += m;
}
node = node->previous;
} while (node != NULL);
return r;
return len;
}
static void
@@ -541,6 +552,7 @@ T_check(const T_check_context *t, bool ok, ...)
T_context *ctx;
va_list ap;
char scope[T_SCOPE_SIZE];
size_t len;
unsigned int step;
ctx = &T_instance;
@@ -551,27 +563,28 @@ T_check(const T_check_context *t, bool ok, ...)
step = UINT_MAX;
}
len = T_scope(ctx, scope, sizeof(scope) - 1);
scope[len] = '\0';
if ((t->flags & T_CHECK_STEP_FLAG) != 0 &&
step != T_CHECK_STEP_FROM_FLAGS(t->flags)) {
T_add_failure(ctx);
T_printf("F:%u:%i:%s:%s:%i:planned step (%u)\n", step,
T_cpu(), T_scope(ctx, scope), T_file(t), t->line,
T_CHECK_STEP_FROM_FLAGS(t->flags));
T_cpu(), scope, T_file(t),
t->line, T_CHECK_STEP_FROM_FLAGS(t->flags));
} else if (!ok) {
T_add_failure(ctx);
if (ctx->verbosity >= T_NORMAL) {
if ((t->flags & T_CHECK_QUIET) == 0) {
T_printf("F:%u:%i:%s:%s:%i",
step, T_cpu(), T_scope(ctx, scope),
T_file(t), t->line);
step, T_cpu(), scope, T_file(t), t->line);
} else if (t->line >= 0) {
T_printf("F:*:%i:%s:%s:%i", T_cpu(),
T_scope(ctx, scope), T_file(t),
t->line);
T_printf("F:*:%i:%s:%s:%i", T_cpu(), scope,
T_file(t), t->line);
} else {
T_printf("F:*:%i:%s:%s:*", T_cpu(),
T_scope(ctx, scope), T_file(t));
T_printf("F:*:%i:%s:%s:*", T_cpu(), scope,
T_file(t));
}
if ((t->flags & T_CHECK_FMT) != 0) {
@@ -593,8 +606,8 @@ T_check(const T_check_context *t, bool ok, ...)
}
} else if ((t->flags & T_CHECK_QUIET) == 0 &&
ctx->verbosity >= T_VERBOSE) {
T_printf("P:%u:%i:%s:%s:%i\n", step, T_cpu(),
T_scope(ctx, scope), T_file(t), t->line);
T_printf("P:%u:%i:%s:%s:%i\n", step, T_cpu(), scope, T_file(t),
t->line);
}
}
@@ -847,10 +860,13 @@ T_do_case_end(T_context *ctx, const T_case_context *tc)
if (ctx->verbosity >= T_NORMAL) {
char scope[T_SCOPE_SIZE];
size_t len;
len = T_scope(ctx, scope, sizeof(scope) - 1);
scope[len] = '\0';
T_printf("F:*:%i:%s:*:*:actual steps (%u), "
"planned steps (%u)\n", T_cpu(),
T_scope(ctx, scope), steps, planned_steps);
scope, steps, planned_steps);
}
}
@@ -1106,12 +1122,14 @@ T_pop_fixture(void)
memset(node, 0, sizeof(*node));
}
void
size_t
T_get_scope(const char * const * const *desc, char *buf, size_t n,
const size_t *second_indices)
{
size_t c;
size_t i;
c = n;
i = 0;
while (true) {
@@ -1121,26 +1139,22 @@ T_get_scope(const char * const * const *desc, char *buf, size_t n,
desc2 = desc[i];
if (desc2 == NULL) {
return;
break;
}
if (n > 1) {
if (c > 1) {
buf[0] = '/';
--n;
--c;
++buf;
} else {
return;
}
m = strlcpy(buf, desc2[second_indices[i]], n);
if (m < n) {
n -= m;
buf += m;
} else {
return;
break;
}
m = T_str_copy(buf, desc2[second_indices[i]], c);
buf += m;
c -= m;
++i;
}
return n - c;
}
+4 -4
View File
@@ -43,11 +43,11 @@ teardown(void *ctx)
T_log(T_QUIET, "teardown end");
}
static void
static size_t
scope(void *ctx, char *buf, size_t n)
{
strlcpy(buf, "/More", n);
return T_str_copy(buf, "/More", n);
}
static const T_fixture fixture = {
@@ -101,11 +101,11 @@ teardown_2(void *ctx)
T_log(T_QUIET, "teardown 2 end");
}
static void
static size_t
scope_2(void *ctx, char *buf, size_t n)
{
strlcpy(buf, "/AndMore", n);
return T_str_copy(buf, "/AndMore", n);
}
static const T_fixture fixture_2 = {