mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
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 b166580681)
This commit is contained in:
parent
c35334b085
commit
7aaa37fa1d
1 changed files with 33 additions and 24 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue