[dpdk-dev,RFC] test/test: support default mempool autotest

Message ID 1490955469-16216-1-git-send-email-shreyansh.jain@nxp.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Shreyansh Jain March 31, 2017, 10:17 a.m. UTC
  Mempool test currently supports:
 * ring_mp_mc
 * stack

In case a new mempool handler is added, there are multiple options
for supporting that in the mempool autotest:
1. Like the patch below, adding a new default pool options
   So, ring* + stack + default (which can be 'stack' or 'ring')
 * This way, whatever the value of RTE_MBUF_DEFAULT_MEMPOOL_OPS is set,
   it would be verified.
 * even if that means duplicating some test (for example when "stack" is
   set as default and it already part of standard test)

2. Removing stack handler as standard, and moving only to one specified
   by RTE_MBUF_DEFAULT_MEMPOOL_OPS (+ existing ring*)
 * It still leaves space for duplication of ring_mp_mc in case that is
   set to default (as in case of master tree)

3. Iterating over the list of mempool handlers and performing a set
   or predefined tests
 * reqiures quite a lot of rewrite of mempool autotest
 * specially, allowing some special tests (cache/no-cache) cases when
   a set of variables in loop are being used, would be tricky

4. only checking the default pool set by RTE_* macro
 * In case a user has build DPDK using a configured value, probably it
   expected that application (or custom applications) would use that
   default handler.
 * would also mean that non-default (non RTE_* value) would not be tested
   even though they are being used.

The decision above would impact how new mempool handlers are added and
how their testing (API verification) can be done without impacting the
mempool_autotest file everytime.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>

---
 test/test/test_mempool.c | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)
  

Comments

Olivier Matz March 31, 2017, 1:59 p.m. UTC | #1
Hi Shreyansh,

On Fri, 31 Mar 2017 15:47:49 +0530, Shreyansh Jain <shreyansh.jain@nxp.com> wrote:
> Mempool test currently supports:
>  * ring_mp_mc
>  * stack
> 
> In case a new mempool handler is added, there are multiple options
> for supporting that in the mempool autotest:
> 1. Like the patch below, adding a new default pool options
>    So, ring* + stack + default (which can be 'stack' or 'ring')
>  * This way, whatever the value of RTE_MBUF_DEFAULT_MEMPOOL_OPS is set,
>    it would be verified.
>  * even if that means duplicating some test (for example when "stack" is
>    set as default and it already part of standard test)
> 
> 2. Removing stack handler as standard, and moving only to one specified
>    by RTE_MBUF_DEFAULT_MEMPOOL_OPS (+ existing ring*)
>  * It still leaves space for duplication of ring_mp_mc in case that is
>    set to default (as in case of master tree)
> 
> 3. Iterating over the list of mempool handlers and performing a set
>    or predefined tests
>  * reqiures quite a lot of rewrite of mempool autotest
>  * specially, allowing some special tests (cache/no-cache) cases when
>    a set of variables in loop are being used, would be tricky
> 
> 4. only checking the default pool set by RTE_* macro
>  * In case a user has build DPDK using a configured value, probably it
>    expected that application (or custom applications) would use that
>    default handler.
>  * would also mean that non-default (non RTE_* value) would not be tested
>    even though they are being used.
> 
> The decision above would impact how new mempool handlers are added and
> how their testing (API verification) can be done without impacting the
> mempool_autotest file everytime.
> 
> Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>

I'd prefer 3-, it looks to be the most complete.
But I think 1- is ok for now.


> 
> ---
>  test/test/test_mempool.c | 35 +++++++++++++++++++++++++++++++++--
>  1 file changed, 33 insertions(+), 2 deletions(-)
> 
> diff --git a/test/test/test_mempool.c b/test/test/test_mempool.c
> index b9880b3..aefbf80 100644
> --- a/test/test/test_mempool.c
> +++ b/test/test/test_mempool.c
> @@ -509,9 +509,11 @@ walk_cb(struct rte_mempool *mp, void *userdata __rte_unused)
>  static int
>  test_mempool(void)
>  {
> +	int ret = -1;
>  	struct rte_mempool *mp_cache = NULL;
>  	struct rte_mempool *mp_nocache = NULL;
>  	struct rte_mempool *mp_stack = NULL;
> +	struct rte_mempool *default_pool = NULL;
>  
>  	rte_atomic32_init(&synchro);
>  
> @@ -561,6 +563,30 @@ test_mempool(void)
>  	}
>  	rte_mempool_obj_iter(mp_stack, my_obj_init, NULL);
>  
> +	/* Create a mempool based on Default handler, if not "stack" */
> +	printf("Testing %s mempool handler\n",
> +	       RTE_MBUF_DEFAULT_MEMPOOL_OPS);
> +	default_pool = rte_mempool_create_empty("default_pool",
> +					MEMPOOL_SIZE,
> +					MEMPOOL_ELT_SIZE,
> +					RTE_MEMPOOL_CACHE_MAX_SIZE, 0,
> +					SOCKET_ID_ANY, 0);
> +
> +	if (default_pool == NULL) {
> +		printf("cannot allocate default mempool\n");
> +		goto err;
> +	}
> +	if (rte_mempool_set_ops_byname(default_pool,
> +			RTE_MBUF_DEFAULT_MEMPOOL_OPS, NULL) < 0) {
> +		printf("cannot set default handler\n");
> +		goto err;
> +	}
> +	if (rte_mempool_populate_default(default_pool) < 0) {
> +		printf("cannot populate default mempool\n");
> +		goto err;
> +	}
> +	rte_mempool_obj_iter(default_pool, my_obj_init, NULL);
> +
>  	/* retrieve the mempool from its name */
>  	if (rte_mempool_lookup("test_nocache") != mp_nocache) {
>  		printf("Cannot lookup mempool from its name\n");
> @@ -605,15 +631,20 @@ test_mempool(void)
>  	if (test_mempool_basic(mp_stack, 1) < 0)
>  		goto err;
>  
> +	if (test_mempool_basic(default_pool, 1) < 0)
> +		goto err;
> +
>  	rte_mempool_list_dump(stdout);
>  
> -	return 0;
> +	ret = 0;

looks it also fixes a memory leak :)
Can you please move the fix in another patch?


Thanks,
Olivier
  
Hemant Agrawal March 31, 2017, 2:11 p.m. UTC | #2
HI Olivier,

> -----Original Message-----

> From: Olivier Matz [mailto:olivier.matz@6wind.com]

> Sent: Friday, March 31, 2017 7:30 PM

> To: Shreyansh Jain <shreyansh.jain@nxp.com>

> Cc: dev@dpdk.org; Hemant Agrawal <hemant.agrawal@nxp.com>

> Subject: Re: [RFC PATCH] test/test: support default mempool autotest

> 

> Hi Shreyansh,


[Hemant] I will just proxy him for his next few off days 😊
 
> On Fri, 31 Mar 2017 15:47:49 +0530, Shreyansh Jain <shreyansh.jain@nxp.com>

> wrote:

> > Mempool test currently supports:

> >  * ring_mp_mc

> >  * stack

> >

> > In case a new mempool handler is added, there are multiple options for

> > supporting that in the mempool autotest:

> > 1. Like the patch below, adding a new default pool options

> >    So, ring* + stack + default (which can be 'stack' or 'ring')

> >  * This way, whatever the value of RTE_MBUF_DEFAULT_MEMPOOL_OPS is

> set,

> >    it would be verified.

> >  * even if that means duplicating some test (for example when "stack" is

> >    set as default and it already part of standard test)

> >

> > 2. Removing stack handler as standard, and moving only to one specified

> >    by RTE_MBUF_DEFAULT_MEMPOOL_OPS (+ existing ring*)

> >  * It still leaves space for duplication of ring_mp_mc in case that is

> >    set to default (as in case of master tree)

> >

> > 3. Iterating over the list of mempool handlers and performing a set

> >    or predefined tests

> >  * reqiures quite a lot of rewrite of mempool autotest

> >  * specially, allowing some special tests (cache/no-cache) cases when

> >    a set of variables in loop are being used, would be tricky

> >

> > 4. only checking the default pool set by RTE_* macro

> >  * In case a user has build DPDK using a configured value, probably it

> >    expected that application (or custom applications) would use that

> >    default handler.

> >  * would also mean that non-default (non RTE_* value) would not be tested

> >    even though they are being used.

> >

> > The decision above would impact how new mempool handlers are added and

> > how their testing (API verification) can be done without impacting the

> > mempool_autotest file everytime.

> >

> > Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>

> 

> I'd prefer 3-, it looks to be the most complete.

> But I think 1- is ok for now.


[Hemant] Thanks for quick review, We will send patch for #1 now, and try to attempt #3 next. 
> 

> >

> > ---

> >  test/test/test_mempool.c | 35 +++++++++++++++++++++++++++++++++--

> >  1 file changed, 33 insertions(+), 2 deletions(-)

> >

> > diff --git a/test/test/test_mempool.c b/test/test/test_mempool.c index

> > b9880b3..aefbf80 100644

> > --- a/test/test/test_mempool.c

> > +++ b/test/test/test_mempool.c

> > @@ -509,9 +509,11 @@ walk_cb(struct rte_mempool *mp, void *userdata

> > __rte_unused)  static int

> >  test_mempool(void)

> >  {

> > +	int ret = -1;

> >  	struct rte_mempool *mp_cache = NULL;

> >  	struct rte_mempool *mp_nocache = NULL;

> >  	struct rte_mempool *mp_stack = NULL;

> > +	struct rte_mempool *default_pool = NULL;

> >

> >  	rte_atomic32_init(&synchro);

> >

> > @@ -561,6 +563,30 @@ test_mempool(void)

> >  	}

> >  	rte_mempool_obj_iter(mp_stack, my_obj_init, NULL);

> >

> > +	/* Create a mempool based on Default handler, if not "stack" */

> > +	printf("Testing %s mempool handler\n",

> > +	       RTE_MBUF_DEFAULT_MEMPOOL_OPS);

> > +	default_pool = rte_mempool_create_empty("default_pool",

> > +					MEMPOOL_SIZE,

> > +					MEMPOOL_ELT_SIZE,

> > +					RTE_MEMPOOL_CACHE_MAX_SIZE, 0,

> > +					SOCKET_ID_ANY, 0);

> > +

> > +	if (default_pool == NULL) {

> > +		printf("cannot allocate default mempool\n");

> > +		goto err;

> > +	}

> > +	if (rte_mempool_set_ops_byname(default_pool,

> > +			RTE_MBUF_DEFAULT_MEMPOOL_OPS, NULL) < 0) {

> > +		printf("cannot set default handler\n");

> > +		goto err;

> > +	}

> > +	if (rte_mempool_populate_default(default_pool) < 0) {

> > +		printf("cannot populate default mempool\n");

> > +		goto err;

> > +	}

> > +	rte_mempool_obj_iter(default_pool, my_obj_init, NULL);

> > +

> >  	/* retrieve the mempool from its name */

> >  	if (rte_mempool_lookup("test_nocache") != mp_nocache) {

> >  		printf("Cannot lookup mempool from its name\n"); @@ -605,15

> +631,20

> > @@ test_mempool(void)

> >  	if (test_mempool_basic(mp_stack, 1) < 0)

> >  		goto err;

> >

> > +	if (test_mempool_basic(default_pool, 1) < 0)

> > +		goto err;

> > +

> >  	rte_mempool_list_dump(stdout);

> >

> > -	return 0;

> > +	ret = 0;

> 

> looks it also fixes a memory leak :)

> Can you please move the fix in another patch?


[Hemant]  OK.

> 

> 

> Thanks,

> Olivier
  
Santosh Shukla March 31, 2017, 3:11 p.m. UTC | #3
On Fri, Mar 31, 2017 at 03:47:49PM +0530, Shreyansh Jain wrote:
> Mempool test currently supports:
>  * ring_mp_mc
>  * stack
> 
> In case a new mempool handler is added, there are multiple options
> for supporting that in the mempool autotest:
> 1. Like the patch below, adding a new default pool options
>    So, ring* + stack + default (which can be 'stack' or 'ring')
>  * This way, whatever the value of RTE_MBUF_DEFAULT_MEMPOOL_OPS is set,
>    it would be verified.
>  * even if that means duplicating some test (for example when "stack" is
>    set as default and it already part of standard test)
> 
> 2. Removing stack handler as standard, and moving only to one specified
>    by RTE_MBUF_DEFAULT_MEMPOOL_OPS (+ existing ring*)
>  * It still leaves space for duplication of ring_mp_mc in case that is
>    set to default (as in case of master tree)
> 
> 3. Iterating over the list of mempool handlers and performing a set
>    or predefined tests
>  * reqiures quite a lot of rewrite of mempool autotest
>  * specially, allowing some special tests (cache/no-cache) cases when
>    a set of variables in loop are being used, would be tricky
> 
> 4. only checking the default pool set by RTE_* macro
>  * In case a user has build DPDK using a configured value, probably it
>    expected that application (or custom applications) would use that
>    default handler.
>  * would also mean that non-default (non RTE_* value) would not be tested
>    even though they are being used.
> 
> The decision above would impact how new mempool handlers are added and
> how their testing (API verification) can be done without impacting the
> mempool_autotest file everytime.
> 
> Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
> 
> ---
>  test/test/test_mempool.c | 35 +++++++++++++++++++++++++++++++++--
>  1 file changed, 33 insertions(+), 2 deletions(-)
>

I am too using option-2) for my ext-mempool driver and Yes, there is a chance
of 'ring_mp_mc' duplication if left as default.

BTW: we need similar changes at mempool_perf test too, right? 
Are you planning to send, if not then I will propose one. Let me know.

Thanks.

> diff --git a/test/test/test_mempool.c b/test/test/test_mempool.c
> index b9880b3..aefbf80 100644
> --- a/test/test/test_mempool.c
> +++ b/test/test/test_mempool.c
> @@ -509,9 +509,11 @@ walk_cb(struct rte_mempool *mp, void *userdata __rte_unused)
>  static int
>  test_mempool(void)
>  {
> +	int ret = -1;
>  	struct rte_mempool *mp_cache = NULL;
>  	struct rte_mempool *mp_nocache = NULL;
>  	struct rte_mempool *mp_stack = NULL;
> +	struct rte_mempool *default_pool = NULL;
>  
>  	rte_atomic32_init(&synchro);
>  
> @@ -561,6 +563,30 @@ test_mempool(void)
>  	}
>  	rte_mempool_obj_iter(mp_stack, my_obj_init, NULL);
>  
> +	/* Create a mempool based on Default handler, if not "stack" */
> +	printf("Testing %s mempool handler\n",
> +	       RTE_MBUF_DEFAULT_MEMPOOL_OPS);
> +	default_pool = rte_mempool_create_empty("default_pool",
> +					MEMPOOL_SIZE,
> +					MEMPOOL_ELT_SIZE,
> +					RTE_MEMPOOL_CACHE_MAX_SIZE, 0,
> +					SOCKET_ID_ANY, 0);
> +
> +	if (default_pool == NULL) {
> +		printf("cannot allocate default mempool\n");
> +		goto err;
> +	}
> +	if (rte_mempool_set_ops_byname(default_pool,
> +			RTE_MBUF_DEFAULT_MEMPOOL_OPS, NULL) < 0) {
> +		printf("cannot set default handler\n");
> +		goto err;
> +	}
> +	if (rte_mempool_populate_default(default_pool) < 0) {
> +		printf("cannot populate default mempool\n");
> +		goto err;
> +	}
> +	rte_mempool_obj_iter(default_pool, my_obj_init, NULL);
> +
>  	/* retrieve the mempool from its name */
>  	if (rte_mempool_lookup("test_nocache") != mp_nocache) {
>  		printf("Cannot lookup mempool from its name\n");
> @@ -605,15 +631,20 @@ test_mempool(void)
>  	if (test_mempool_basic(mp_stack, 1) < 0)
>  		goto err;
>  
> +	if (test_mempool_basic(default_pool, 1) < 0)
> +		goto err;
> +
>  	rte_mempool_list_dump(stdout);
>  
> -	return 0;
> +	ret = 0;
>  
>  err:
>  	rte_mempool_free(mp_nocache);
>  	rte_mempool_free(mp_cache);
>  	rte_mempool_free(mp_stack);
> -	return -1;
> +	rte_mempool_free(default_pool);
> +
> +	return ret;
>  }
>  
>  REGISTER_TEST_COMMAND(mempool_autotest, test_mempool);
> -- 
> 2.7.4
>
  
Hemant Agrawal April 3, 2017, 9:27 a.m. UTC | #4
On 3/31/2017 8:41 PM, Santosh Shukla wrote:
> On Fri, Mar 31, 2017 at 03:47:49PM +0530, Shreyansh Jain wrote:
>> Mempool test currently supports:
>>  * ring_mp_mc
>>  * stack
>>
>> In case a new mempool handler is added, there are multiple options
>> for supporting that in the mempool autotest:
>> 1. Like the patch below, adding a new default pool options
>>    So, ring* + stack + default (which can be 'stack' or 'ring')
>>  * This way, whatever the value of RTE_MBUF_DEFAULT_MEMPOOL_OPS is set,
>>    it would be verified.
>>  * even if that means duplicating some test (for example when "stack" is
>>    set as default and it already part of standard test)
>>
>> 2. Removing stack handler as standard, and moving only to one specified
>>    by RTE_MBUF_DEFAULT_MEMPOOL_OPS (+ existing ring*)
>>  * It still leaves space for duplication of ring_mp_mc in case that is
>>    set to default (as in case of master tree)
>>
>> 3. Iterating over the list of mempool handlers and performing a set
>>    or predefined tests
>>  * reqiures quite a lot of rewrite of mempool autotest
>>  * specially, allowing some special tests (cache/no-cache) cases when
>>    a set of variables in loop are being used, would be tricky
>>
>> 4. only checking the default pool set by RTE_* macro
>>  * In case a user has build DPDK using a configured value, probably it
>>    expected that application (or custom applications) would use that
>>    default handler.
>>  * would also mean that non-default (non RTE_* value) would not be tested
>>    even though they are being used.
>>
>> The decision above would impact how new mempool handlers are added and
>> how their testing (API verification) can be done without impacting the
>> mempool_autotest file everytime.
>>
>> Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
>>
>> ---
>>  test/test/test_mempool.c | 35 +++++++++++++++++++++++++++++++++--
>>  1 file changed, 33 insertions(+), 2 deletions(-)
>>
>
> I am too using option-2) for my ext-mempool driver and Yes, there is a chance
> of 'ring_mp_mc' duplication if left as default.
>
> BTW: we need similar changes at mempool_perf test too, right?
> Are you planning to send, if not then I will propose one. Let me know.

Please propose patch for mempool_perf.

>
> Thanks.
>
>> diff --git a/test/test/test_mempool.c b/test/test/test_mempool.c
>> index b9880b3..aefbf80 100644
>> --- a/test/test/test_mempool.c
>> +++ b/test/test/test_mempool.c
>> @@ -509,9 +509,11 @@ walk_cb(struct rte_mempool *mp, void *userdata __rte_unused)
>>  static int
>>  test_mempool(void)
>>  {
>> +	int ret = -1;
>>  	struct rte_mempool *mp_cache = NULL;
>>  	struct rte_mempool *mp_nocache = NULL;
>>  	struct rte_mempool *mp_stack = NULL;
>> +	struct rte_mempool *default_pool = NULL;
>>
>>  	rte_atomic32_init(&synchro);
>>
>> @@ -561,6 +563,30 @@ test_mempool(void)
>>  	}
>>  	rte_mempool_obj_iter(mp_stack, my_obj_init, NULL);
>>
>> +	/* Create a mempool based on Default handler, if not "stack" */
>> +	printf("Testing %s mempool handler\n",
>> +	       RTE_MBUF_DEFAULT_MEMPOOL_OPS);
>> +	default_pool = rte_mempool_create_empty("default_pool",
>> +					MEMPOOL_SIZE,
>> +					MEMPOOL_ELT_SIZE,
>> +					RTE_MEMPOOL_CACHE_MAX_SIZE, 0,
>> +					SOCKET_ID_ANY, 0);
>> +
>> +	if (default_pool == NULL) {
>> +		printf("cannot allocate default mempool\n");
>> +		goto err;
>> +	}
>> +	if (rte_mempool_set_ops_byname(default_pool,
>> +			RTE_MBUF_DEFAULT_MEMPOOL_OPS, NULL) < 0) {
>> +		printf("cannot set default handler\n");
>> +		goto err;
>> +	}
>> +	if (rte_mempool_populate_default(default_pool) < 0) {
>> +		printf("cannot populate default mempool\n");
>> +		goto err;
>> +	}
>> +	rte_mempool_obj_iter(default_pool, my_obj_init, NULL);
>> +
>>  	/* retrieve the mempool from its name */
>>  	if (rte_mempool_lookup("test_nocache") != mp_nocache) {
>>  		printf("Cannot lookup mempool from its name\n");
>> @@ -605,15 +631,20 @@ test_mempool(void)
>>  	if (test_mempool_basic(mp_stack, 1) < 0)
>>  		goto err;
>>
>> +	if (test_mempool_basic(default_pool, 1) < 0)
>> +		goto err;
>> +
>>  	rte_mempool_list_dump(stdout);
>>
>> -	return 0;
>> +	ret = 0;
>>
>>  err:
>>  	rte_mempool_free(mp_nocache);
>>  	rte_mempool_free(mp_cache);
>>  	rte_mempool_free(mp_stack);
>> -	return -1;
>> +	rte_mempool_free(default_pool);
>> +
>> +	return ret;
>>  }
>>
>>  REGISTER_TEST_COMMAND(mempool_autotest, test_mempool);
>> --
>> 2.7.4
>>
>
  

Patch

diff --git a/test/test/test_mempool.c b/test/test/test_mempool.c
index b9880b3..aefbf80 100644
--- a/test/test/test_mempool.c
+++ b/test/test/test_mempool.c
@@ -509,9 +509,11 @@  walk_cb(struct rte_mempool *mp, void *userdata __rte_unused)
 static int
 test_mempool(void)
 {
+	int ret = -1;
 	struct rte_mempool *mp_cache = NULL;
 	struct rte_mempool *mp_nocache = NULL;
 	struct rte_mempool *mp_stack = NULL;
+	struct rte_mempool *default_pool = NULL;
 
 	rte_atomic32_init(&synchro);
 
@@ -561,6 +563,30 @@  test_mempool(void)
 	}
 	rte_mempool_obj_iter(mp_stack, my_obj_init, NULL);
 
+	/* Create a mempool based on Default handler, if not "stack" */
+	printf("Testing %s mempool handler\n",
+	       RTE_MBUF_DEFAULT_MEMPOOL_OPS);
+	default_pool = rte_mempool_create_empty("default_pool",
+					MEMPOOL_SIZE,
+					MEMPOOL_ELT_SIZE,
+					RTE_MEMPOOL_CACHE_MAX_SIZE, 0,
+					SOCKET_ID_ANY, 0);
+
+	if (default_pool == NULL) {
+		printf("cannot allocate default mempool\n");
+		goto err;
+	}
+	if (rte_mempool_set_ops_byname(default_pool,
+			RTE_MBUF_DEFAULT_MEMPOOL_OPS, NULL) < 0) {
+		printf("cannot set default handler\n");
+		goto err;
+	}
+	if (rte_mempool_populate_default(default_pool) < 0) {
+		printf("cannot populate default mempool\n");
+		goto err;
+	}
+	rte_mempool_obj_iter(default_pool, my_obj_init, NULL);
+
 	/* retrieve the mempool from its name */
 	if (rte_mempool_lookup("test_nocache") != mp_nocache) {
 		printf("Cannot lookup mempool from its name\n");
@@ -605,15 +631,20 @@  test_mempool(void)
 	if (test_mempool_basic(mp_stack, 1) < 0)
 		goto err;
 
+	if (test_mempool_basic(default_pool, 1) < 0)
+		goto err;
+
 	rte_mempool_list_dump(stdout);
 
-	return 0;
+	ret = 0;
 
 err:
 	rte_mempool_free(mp_nocache);
 	rte_mempool_free(mp_cache);
 	rte_mempool_free(mp_stack);
-	return -1;
+	rte_mempool_free(default_pool);
+
+	return ret;
 }
 
 REGISTER_TEST_COMMAND(mempool_autotest, test_mempool);