mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 13:04:23 -04:00
Refactor test wrappers to divide legacy items from useful stuff.
svn:r1212
This commit is contained in:
parent
122e934e92
commit
ea664bf29a
@ -1439,7 +1439,6 @@ end:
|
|||||||
event_config_free(cfg);
|
event_config_free(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct testcase_t main_testcases[] = {
|
struct testcase_t main_testcases[] = {
|
||||||
/* Some converted-over tests */
|
/* Some converted-over tests */
|
||||||
{ "methods", test_methods, TT_FORK, NULL, NULL },
|
{ "methods", test_methods, TT_FORK, NULL, NULL },
|
||||||
|
@ -56,6 +56,15 @@ extern int in_legacy_test_wrapper;
|
|||||||
|
|
||||||
evutil_socket_t regress_make_tmpfile(const void *data, size_t datalen);
|
evutil_socket_t regress_make_tmpfile(const void *data, size_t datalen);
|
||||||
|
|
||||||
|
struct basic_test_data {
|
||||||
|
struct event_base *base;
|
||||||
|
int pair[2];
|
||||||
|
|
||||||
|
void (*legacy_test_fn)(void);
|
||||||
|
};
|
||||||
|
extern const struct testcase_setup_t basic_setup;
|
||||||
|
|
||||||
|
|
||||||
extern const struct testcase_setup_t legacy_setup;
|
extern const struct testcase_setup_t legacy_setup;
|
||||||
void run_legacy_test_fn(void *ptr);
|
void run_legacy_test_fn(void *ptr);
|
||||||
|
|
||||||
@ -63,12 +72,13 @@ void run_legacy_test_fn(void *ptr);
|
|||||||
#define TT_NEED_SOCKETPAIR TT_FIRST_USER_FLAG
|
#define TT_NEED_SOCKETPAIR TT_FIRST_USER_FLAG
|
||||||
#define TT_NEED_BASE (TT_FIRST_USER_FLAG<<1)
|
#define TT_NEED_BASE (TT_FIRST_USER_FLAG<<1)
|
||||||
#define TT_NEED_DNS (TT_FIRST_USER_FLAG<<2)
|
#define TT_NEED_DNS (TT_FIRST_USER_FLAG<<2)
|
||||||
|
#define TT_LEGACY (TT_FIRST_USER_FLAG<<3)
|
||||||
|
|
||||||
/* All the flags that a legacy test needs. */
|
/* All the flags that a legacy test needs. */
|
||||||
#define TT_ISOLATED TT_FORK|TT_NEED_SOCKETPAIR|TT_NEED_BASE
|
#define TT_ISOLATED TT_FORK|TT_NEED_SOCKETPAIR|TT_NEED_BASE
|
||||||
|
|
||||||
#define LEGACY(name,flags) \
|
#define LEGACY(name,flags) \
|
||||||
{ #name, run_legacy_test_fn, flags, &legacy_setup, \
|
{ #name, run_legacy_test_fn, flags|TT_LEGACY, &legacy_setup, \
|
||||||
test_## name }
|
test_## name }
|
||||||
|
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ end:
|
|||||||
|
|
||||||
|
|
||||||
#define DNS_LEGACY(name, flags) \
|
#define DNS_LEGACY(name, flags) \
|
||||||
{ #name, run_legacy_test_fn, flags, &legacy_setup, \
|
{ #name, run_legacy_test_fn, flags|TT_LEGACY, &legacy_setup, \
|
||||||
dns_##name }
|
dns_##name }
|
||||||
|
|
||||||
struct testcase_t dns_testcases[] = {
|
struct testcase_t dns_testcases[] = {
|
||||||
|
@ -2191,7 +2191,7 @@ http_negative_content_length_test(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HTTP_LEGACY(name) \
|
#define HTTP_LEGACY(name) \
|
||||||
{ #name, run_legacy_test_fn, TT_ISOLATED, &legacy_setup, \
|
{ #name, run_legacy_test_fn, TT_ISOLATED|TT_LEGACY, &legacy_setup, \
|
||||||
http_##name##_test }
|
http_##name##_test }
|
||||||
|
|
||||||
struct testcase_t http_testcases[] = {
|
struct testcase_t http_testcases[] = {
|
||||||
|
@ -115,32 +115,36 @@ regress_make_tmpfile(const void *data, size_t datalen)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The "data" for a legacy test is just a pointer to the void fn(void)
|
|
||||||
function implementing the test case. We need to set up some globals,
|
|
||||||
though, since that's where legacy tests expect to find a socketpair
|
|
||||||
(sometimes) and a global event_base (sometimes).
|
|
||||||
*/
|
|
||||||
static void *
|
static void *
|
||||||
legacy_test_setup(const struct testcase_t *testcase)
|
basic_test_setup(const struct testcase_t *testcase)
|
||||||
{
|
{
|
||||||
|
struct event_base *base = NULL;
|
||||||
|
int spair[2] = { -1, -1 };
|
||||||
|
struct basic_test_data *data = NULL;
|
||||||
|
|
||||||
if (testcase->flags & TT_NEED_SOCKETPAIR) {
|
if (testcase->flags & TT_NEED_SOCKETPAIR) {
|
||||||
if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) {
|
if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, spair) == -1) {
|
||||||
fprintf(stderr, "%s: socketpair\n", __func__);
|
fprintf(stderr, "%s: socketpair\n", __func__);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (evutil_make_socket_nonblocking(pair[0]) == -1) {
|
if (evutil_make_socket_nonblocking(spair[0]) == -1) {
|
||||||
fprintf(stderr, "fcntl(O_NONBLOCK)");
|
fprintf(stderr, "fcntl(O_NONBLOCK)");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (evutil_make_socket_nonblocking(pair[1]) == -1) {
|
if (evutil_make_socket_nonblocking(spair[1]) == -1) {
|
||||||
fprintf(stderr, "fcntl(O_NONBLOCK)");
|
fprintf(stderr, "fcntl(O_NONBLOCK)");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (testcase->flags & TT_NEED_BASE) {
|
if (testcase->flags & TT_NEED_BASE) {
|
||||||
global_base = event_init();
|
if (testcase->flags & TT_LEGACY)
|
||||||
|
base = event_init();
|
||||||
|
else
|
||||||
|
base = event_base_new();
|
||||||
|
if (!base)
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (testcase->flags & TT_NEED_DNS) {
|
if (testcase->flags & TT_NEED_DNS) {
|
||||||
@ -149,7 +153,57 @@ legacy_test_setup(const struct testcase_t *testcase)
|
|||||||
return NULL; /* fast failure *//*XXX asserts. */
|
return NULL; /* fast failure *//*XXX asserts. */
|
||||||
}
|
}
|
||||||
|
|
||||||
return testcase->setup_data;
|
data = calloc(1, sizeof(*data));
|
||||||
|
if (!data)
|
||||||
|
exit(1);
|
||||||
|
data->base = base;
|
||||||
|
data->pair[0] = spair[0];
|
||||||
|
data->pair[1] = spair[1];
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
basic_test_cleanup(const struct testcase_t *testcase, void *ptr)
|
||||||
|
{
|
||||||
|
struct basic_test_data *data = ptr;
|
||||||
|
if (testcase->flags & TT_NEED_SOCKETPAIR) {
|
||||||
|
if (data->pair[0] != -1)
|
||||||
|
EVUTIL_CLOSESOCKET(data->pair[0]);
|
||||||
|
if (data->pair[1] != -1)
|
||||||
|
EVUTIL_CLOSESOCKET(data->pair[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (testcase->flags & TT_NEED_BASE) {
|
||||||
|
event_base_free(data->base);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (testcase->flags & TT_NEED_DNS) {
|
||||||
|
evdns_shutdown(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct testcase_setup_t basic_setup = {
|
||||||
|
basic_test_setup, basic_test_cleanup
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The "data" for a legacy test is just a pointer to the void fn(void)
|
||||||
|
function implementing the test case. We need to set up some globals,
|
||||||
|
though, since that's where legacy tests expect to find a socketpair
|
||||||
|
(sometimes) and a global event_base (sometimes).
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
legacy_test_setup(const struct testcase_t *testcase)
|
||||||
|
{
|
||||||
|
struct basic_test_data *data = basic_test_setup(testcase);
|
||||||
|
global_base = data->base;
|
||||||
|
pair[0] = data->pair[0];
|
||||||
|
pair[1] = data->pair[1];
|
||||||
|
data->legacy_test_fn = testcase->setup_data;
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function is the implementation of every legacy test case. It
|
/* This function is the implementation of every legacy test case. It
|
||||||
@ -159,12 +213,11 @@ legacy_test_setup(const struct testcase_t *testcase)
|
|||||||
void
|
void
|
||||||
run_legacy_test_fn(void *ptr)
|
run_legacy_test_fn(void *ptr)
|
||||||
{
|
{
|
||||||
void (*fn)(void);
|
struct basic_test_data *data = ptr;
|
||||||
test_ok = called = 0;
|
test_ok = called = 0;
|
||||||
fn = ptr;
|
|
||||||
|
|
||||||
in_legacy_test_wrapper = 1;
|
in_legacy_test_wrapper = 1;
|
||||||
fn(); /* This part actually calls the test */
|
data->legacy_test_fn(); /* This part actually calls the test */
|
||||||
in_legacy_test_wrapper = 0;
|
in_legacy_test_wrapper = 0;
|
||||||
|
|
||||||
if (!test_ok)
|
if (!test_ok)
|
||||||
@ -181,25 +234,10 @@ end:
|
|||||||
static int
|
static int
|
||||||
legacy_test_cleanup(const struct testcase_t *testcase, void *ptr)
|
legacy_test_cleanup(const struct testcase_t *testcase, void *ptr)
|
||||||
{
|
{
|
||||||
(void)ptr;
|
int r = basic_test_cleanup(testcase, ptr);
|
||||||
if (testcase->flags & TT_NEED_SOCKETPAIR) {
|
pair[0] = pair[1] = -1;
|
||||||
if (pair[0] != -1)
|
global_base = NULL;
|
||||||
EVUTIL_CLOSESOCKET(pair[0]);
|
return r;
|
||||||
if (pair[1] != -1)
|
|
||||||
EVUTIL_CLOSESOCKET(pair[1]);
|
|
||||||
pair[0] = pair[1] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (testcase->flags & TT_NEED_BASE) {
|
|
||||||
event_base_free(global_base);
|
|
||||||
global_base = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (testcase->flags & TT_NEED_DNS) {
|
|
||||||
evdns_shutdown(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct testcase_setup_t legacy_setup = {
|
const struct testcase_setup_t legacy_setup = {
|
||||||
|
@ -856,7 +856,8 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define RPC_LEGACY(name) \
|
#define RPC_LEGACY(name) \
|
||||||
{ #name, run_legacy_test_fn, TT_FORK|TT_NEED_BASE, &legacy_setup, \
|
{ #name, run_legacy_test_fn, TT_FORK|TT_NEED_BASE|TT_LEGACY, \
|
||||||
|
&legacy_setup, \
|
||||||
rpc_##name }
|
rpc_##name }
|
||||||
|
|
||||||
struct testcase_t rpc_testcases[] = {
|
struct testcase_t rpc_testcases[] = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user