lib/libc/tests/string/memcmp_test.c: extend test to support custom memcmp function

Extend the tests to permit loading an external memcmp function
and testing it over using the libc version. This was added by the
example of other tests in the test suite doing the same thing and
helped tremendously in development.

This change was originally part of D41442 but was taken out to
permit separate review as extrapolated from @ngie's request in
D41349.

Sponsored by:	FreeBSD Foundation
Approved by:	ngie
Differential Revision:	https://reviews.freebsd.org/D41528

(cherry picked from commit b166580681e3af173ec368656019d02ba1cc55ad)
This commit is contained in:
Robert Clausecker 2023-07-14 11:56:12 +00:00
parent c35334b085
commit 7aaa37fa1d

View file

@ -25,18 +25,21 @@
*/
#include <assert.h>
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atf-c.h>
static int (*memcmp_fn)(const void *, const void *, size_t);
ATF_TC_WITHOUT_HEAD(zero);
ATF_TC_BODY(zero, tc)
{
assert(memcmp("a", "b", 0) == 0);
assert(memcmp("", "", 0) == 0);
assert(memcmp_fn("a", "b", 0) == 0);
assert(memcmp_fn("", "", 0) == 0);
}
ATF_TC_WITHOUT_HEAD(eq);
@ -48,9 +51,9 @@ ATF_TC_BODY(eq, tc)
for (i = 0; i < 256; i++)
data1[i] = data2[i] = i ^ 0x55;
for (i = 1; i < 256; i++)
assert(memcmp(data1, data2, i) == 0);
assert(memcmp_fn(data1, data2, i) == 0);
for (i = 1; i < 256; i++)
assert(memcmp(data1 + i, data2 + i, 256 - i) == 0);
assert(memcmp_fn(data1 + i, data2 + i, 256 - i) == 0);
}
ATF_TC_WITHOUT_HEAD(neq);
@ -64,9 +67,9 @@ ATF_TC_BODY(neq, tc)
data2[i] = i ^ 0x55;
}
for (i = 1; i < 256; i++)
assert(memcmp(data1, data2, i) != 0);
assert(memcmp_fn(data1, data2, i) != 0);
for (i = 1; i < 256; i++)
assert(memcmp(data1 + i, data2 + i, 256 - i) != 0);
assert(memcmp_fn(data1 + i, data2 + i, 256 - i) != 0);
}
ATF_TC_WITHOUT_HEAD(diff);
@ -80,37 +83,43 @@ ATF_TC_BODY(diff, tc)
data1[128] = 255;
data2[128] = 0;
for (i = 1; i < 66; i++) {
assert(memcmp(data1 + 128, data2 + 128, i) == 255);
assert(memcmp(data2 + 128, data1 + 128, i) == -255);
assert(memcmp(data1 + 129 - i, data2 + 129 - i, i) == 255);
assert(memcmp(data2 + 129 - i, data1 + 129 - i, i) == -255);
assert(memcmp(data1 + 129 - i, data2 + 129 - i, i * 2) == 255);
assert(memcmp(data2 + 129 - i, data1 + 129 - i, i * 2) == -255);
assert(memcmp_fn(data1 + 128, data2 + 128, i) == 255);
assert(memcmp_fn(data2 + 128, data1 + 128, i) == -255);
assert(memcmp_fn(data1 + 129 - i, data2 + 129 - i, i) == 255);
assert(memcmp_fn(data2 + 129 - i, data1 + 129 - i, i) == -255);
assert(memcmp_fn(data1 + 129 - i, data2 + 129 - i, i * 2) == 255);
assert(memcmp_fn(data2 + 129 - i, data1 + 129 - i, i * 2) == -255);
}
data1[128] = 'c';
data2[128] = 'e';
for (i = 1; i < 66; i++) {
assert(memcmp(data1 + 128, data2 + 128, i) == -2);
assert(memcmp(data2 + 128, data1 + 128, i) == 2);
assert(memcmp(data1 + 129 - i, data2 + 129 - i, i) == -2);
assert(memcmp(data2 + 129 - i, data1 + 129 - i, i) == 2);
assert(memcmp(data1 + 129 - i, data2 + 129 - i, i * 2) == -2);
assert(memcmp(data2 + 129 - i, data1 + 129 - i, i * 2) == 2);
assert(memcmp_fn(data1 + 128, data2 + 128, i) == -2);
assert(memcmp_fn(data2 + 128, data1 + 128, i) == 2);
assert(memcmp_fn(data1 + 129 - i, data2 + 129 - i, i) == -2);
assert(memcmp_fn(data2 + 129 - i, data1 + 129 - i, i) == 2);
assert(memcmp_fn(data1 + 129 - i, data2 + 129 - i, i * 2) == -2);
assert(memcmp_fn(data2 + 129 - i, data1 + 129 - i, i * 2) == 2);
}
memset(data1 + 129, 'A', sizeof(data1) - 129);
memset(data2 + 129, 'Z', sizeof(data2) - 129);
for (i = 1; i < 66; i++) {
assert(memcmp(data1 + 128, data2 + 128, i) == -2);
assert(memcmp(data2 + 128, data1 + 128, i) == 2);
assert(memcmp(data1 + 129 - i, data2 + 129 - i, i) == -2);
assert(memcmp(data2 + 129 - i, data1 + 129 - i, i) == 2);
assert(memcmp(data1 + 129 - i, data2 + 129 - i, i * 2) == -2);
assert(memcmp(data2 + 129 - i, data1 + 129 - i, i * 2) == 2);
assert(memcmp_fn(data1 + 128, data2 + 128, i) == -2);
assert(memcmp_fn(data2 + 128, data1 + 128, i) == 2);
assert(memcmp_fn(data1 + 129 - i, data2 + 129 - i, i) == -2);
assert(memcmp_fn(data2 + 129 - i, data1 + 129 - i, i) == 2);
assert(memcmp_fn(data1 + 129 - i, data2 + 129 - i, i * 2) == -2);
assert(memcmp_fn(data2 + 129 - i, data1 + 129 - i, i * 2) == 2);
}
}
ATF_TP_ADD_TCS(tp)
{
void *dl_handle;
dl_handle = dlopen(NULL, RTLD_LAZY);
memcmp_fn = dlsym(dl_handle, "test_memcmp");
if (memcmp_fn == NULL)
memcmp_fn = memcmp;
ATF_TP_ADD_TC(tp, zero);
ATF_TP_ADD_TC(tp, eq);