aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Clausecker <fuz@FreeBSD.org>2023-07-14 11:56:12 +0000
committerRobert Clausecker <fuz@FreeBSD.org>2023-12-28 17:02:41 +0000
commit7aaa37fa1db603fe10143b03ed07f3a8db771484 (patch)
treec9e8478f11d58f50d0b133ff2dfa190effb8008a
parentc35334b085616c8ad9a567a04cb1a5cbf6b76a80 (diff)
downloadsrc-7aaa37fa1db603fe10143b03ed07f3a8db771484.tar.gz
src-7aaa37fa1db603fe10143b03ed07f3a8db771484.zip
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)
-rw-r--r--lib/libc/tests/string/memcmp_test.c57
1 files changed, 33 insertions, 24 deletions
diff --git a/lib/libc/tests/string/memcmp_test.c b/lib/libc/tests/string/memcmp_test.c
index bfe209dd1b85..824e0d27ac0e 100644
--- a/lib/libc/tests/string/memcmp_test.c
+++ b/lib/libc/tests/string/memcmp_test.c
@@ -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);