aboutsummaryrefslogtreecommitdiff
path: root/string/test/memmove.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2020-04-16 11:46:02 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2020-04-24 13:28:47 +0100
commit22fd93176f9eca0ee38954e233826d05fdb31b0f (patch)
treef0e6908e1804a1943a56a445ebec861f31a967d6 /string/test/memmove.c
parent563b710ddc13810bd89fc17f057f4f7f8479e744 (diff)
downloadarm-optimized-routines-22fd93176f9eca0ee38954e233826d05fdb31b0f.tar.gz
string: test cleanups
Tests printed too much output on broken string function and the output was not entirely useful. Added a new header file with some common logic for printing buffers nicely. In str* tests len now means string length (not buffer size which was confusing).
Diffstat (limited to 'string/test/memmove.c')
-rw-r--r--string/test/memmove.c40
1 files changed, 16 insertions, 24 deletions
diff --git a/string/test/memmove.c b/string/test/memmove.c
index 7891b14..04f4c3c 100644
--- a/string/test/memmove.c
+++ b/string/test/memmove.c
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include <string.h>
#include "stringlib.h"
+#include "stringtest.h"
static const struct fun
{
@@ -28,9 +29,6 @@ F(__memmove_aarch64_simd)
{0, 0}
};
-static int test_status;
-#define ERR(...) (test_status=1, printf(__VA_ARGS__))
-
#define A 32
#define LEN 250000
static unsigned char dbuf[LEN+2*A];
@@ -53,6 +51,8 @@ static void test(const struct fun *fun, int dalign, int salign, int len)
void *p;
int i;
+ if (err_count >= ERR_LIMIT)
+ return;
if (len > LEN || dalign >= A || salign >= A)
abort();
for (i = 0; i < len+A; i++) {
@@ -68,8 +68,8 @@ static void test(const struct fun *fun, int dalign, int salign, int len)
for (i = 0; i < len+A; i++) {
if (dst[i] != want[i]) {
ERR("%s(align %d, align %d, %d) failed\n", fun->name, dalign, salign, len);
- ERR("got : %.*s\n", dalign+len+1, dst);
- ERR("want: %.*s\n", dalign+len+1, want);
+ quoteat("got", dst, len+A, i);
+ quoteat("want", want, len+A, i);
break;
}
}
@@ -78,13 +78,15 @@ static void test(const struct fun *fun, int dalign, int salign, int len)
static void test_overlap(const struct fun *fun, int dalign, int salign, int len)
{
unsigned char *src = alignup(sbuf);
- unsigned char *dst = alignup(sbuf);
+ unsigned char *dst = src;
unsigned char *want = wbuf;
unsigned char *s = src + salign;
unsigned char *d = dst + dalign;
unsigned char *w = wbuf + dalign;
void *p;
+ if (err_count >= ERR_LIMIT)
+ return;
if (len > LEN || dalign >= A || salign >= A)
abort();
@@ -92,16 +94,9 @@ static void test_overlap(const struct fun *fun, int dalign, int salign, int len)
src[i] = want[i] = '?';
for (int i = 0; i < len; i++)
- s[i] = w[i] = 'a' + i%23;
-
- /* Copy the potential overlap range. */
- if (s < d) {
- for (int i = 0; i < (uintptr_t)d-(uintptr_t)s; i++)
- want[salign+i] = src[salign+i];
- } else {
- for (int i = 0; i < (uintptr_t)s-(uintptr_t)d; i++)
- want[len + dalign + i] = src[len + dalign + i];
- }
+ s[i] = want[salign+i] = 'a' + i%23;
+ for (int i = 0; i < len; i++)
+ w[i] = s[i];
p = fun->fun(d, s, len);
if (p != d)
@@ -109,9 +104,8 @@ static void test_overlap(const struct fun *fun, int dalign, int salign, int len)
for (int i = 0; i < len+A; i++) {
if (dst[i] != want[i]) {
ERR("%s(align %d, align %d, %d) failed\n", fun->name, dalign, salign, len);
- ERR("got : %.*s\n", dalign+len+1, dst);
- ERR("want: %.*s\n", dalign+len+1, want);
- abort();
+ quoteat("got", dst, len+A, i);
+ quoteat("want", want, len+A, i);
break;
}
}
@@ -119,11 +113,9 @@ static void test_overlap(const struct fun *fun, int dalign, int salign, int len)
int main()
{
- test_overlap(funtab+0, 2, 1, 1);
-
int r = 0;
for (int i=0; funtab[i].name; i++) {
- test_status = 0;
+ err_count = 0;
for (int d = 0; d < A; d++)
for (int s = 0; s < A; s++) {
int n;
@@ -136,8 +128,8 @@ int main()
test_overlap(funtab+i, d, s, n);
}
}
- printf("%s %s\n", test_status ? "FAIL" : "PASS", funtab[i].name);
- if (test_status)
+ printf("%s %s\n", err_count ? "FAIL" : "PASS", funtab[i].name);
+ if (err_count)
r = -1;
}
return r;