2004-10-22 10:46:04 +04:00
/*
Unix SMB / CIFS implementation .
local testing of idtree routines .
Copyright ( C ) Andrew Tridgell 2004
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2004-10-22 10:46:04 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2004-10-22 10:46:04 +04:00
*/
# include "includes.h"
2006-03-25 19:01:28 +03:00
# include "torture/torture.h"
2014-02-27 12:08:17 +04:00
# include "torture/local/proto.h"
2023-01-05 12:04:23 +03:00
# include "lib/util/idtree.h"
2004-10-22 10:46:04 +04:00
2006-10-16 17:06:41 +04:00
static bool torture_local_idtree_simple ( struct torture_context * tctx )
2004-10-22 10:46:04 +04:00
{
struct idr_context * idr ;
2007-05-20 14:21:14 +04:00
int i , ret ;
2004-10-22 10:46:04 +04:00
int * ids ;
int * present ;
extern int torture_numops ;
int n = torture_numops ;
2006-10-16 17:06:41 +04:00
TALLOC_CTX * mem_ctx = tctx ;
2004-10-22 10:46:04 +04:00
2006-10-16 17:06:41 +04:00
idr = idr_init ( mem_ctx ) ;
2004-10-22 10:46:04 +04:00
2006-10-16 17:06:41 +04:00
ids = talloc_zero_array ( mem_ctx , int , n ) ;
present = talloc_zero_array ( mem_ctx , int , n ) ;
2004-10-22 10:46:04 +04:00
for ( i = 0 ; i < n ; i + + ) {
ids [ i ] = - 1 ;
}
for ( i = 0 ; i < n ; i + + ) {
int ii = random ( ) % n ;
void * p = idr_find ( idr , ids [ ii ] ) ;
if ( present [ ii ] ) {
if ( p ! = & ids [ ii ] ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , talloc_asprintf ( tctx ,
" wrong ptr at %d - %p should be %p " ,
ii , p , & ids [ ii ] ) ) ;
2004-10-22 10:46:04 +04:00
}
if ( random ( ) % 7 = = 0 ) {
if ( idr_remove ( idr , ids [ ii ] ) ! = 0 ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , talloc_asprintf ( tctx ,
" remove failed at %d (id=%d) " ,
i , ids [ ii ] ) ) ;
2004-10-22 10:46:04 +04:00
}
present [ ii ] = 0 ;
ids [ ii ] = - 1 ;
}
} else {
if ( p ! = NULL ) {
2007-08-23 06:10:17 +04:00
torture_fail ( tctx ,
talloc_asprintf ( tctx ,
" non-present at %d gave %p (would be %d) " ,
ii , p ,
( int ) ( ( ( ( char * ) p ) - ( char * ) ( & ids [ 0 ] ) ) / sizeof ( int ) ) ) ) ;
2004-10-22 10:46:04 +04:00
}
if ( random ( ) % 5 ) {
ids [ ii ] = idr_get_new ( idr , & ids [ ii ] , n ) ;
if ( ids [ ii ] < 0 ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , talloc_asprintf ( tctx ,
" alloc failure at %d (ret=%d) " ,
ii , ids [ ii ] ) ) ;
2004-10-22 10:46:04 +04:00
} else {
present [ ii ] = 1 ;
}
}
}
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " done %d random ops \n " , i ) ;
2004-10-22 10:46:04 +04:00
for ( i = 0 ; i < n ; i + + ) {
if ( present [ i ] ) {
if ( idr_remove ( idr , ids [ i ] ) ! = 0 ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , talloc_asprintf ( tctx ,
" delete failed on cleanup at %d (id=%d) " ,
i , ids [ i ] ) ) ;
2004-10-22 10:46:04 +04:00
}
}
}
2007-05-20 14:21:14 +04:00
/* now test some limits */
for ( i = 0 ; i < 25000 ; i + + ) {
ret = idr_get_new_above ( idr , & ids [ 0 ] , random ( ) % 25000 , 0x10000 - 3 ) ;
torture_assert ( tctx , ret ! = - 1 , " idr_get_new_above failed " ) ;
}
ret = idr_get_new_above ( idr , & ids [ 0 ] , 0x10000 - 2 , 0x10000 ) ;
torture_assert_int_equal ( tctx , ret , 0x10000 - 2 , " idr_get_new_above failed " ) ;
ret = idr_get_new_above ( idr , & ids [ 0 ] , 0x10000 - 1 , 0x10000 ) ;
torture_assert_int_equal ( tctx , ret , 0x10000 - 1 , " idr_get_new_above failed " ) ;
ret = idr_get_new_above ( idr , & ids [ 0 ] , 0x10000 , 0x10000 ) ;
torture_assert_int_equal ( tctx , ret , 0x10000 , " idr_get_new_above failed " ) ;
ret = idr_get_new_above ( idr , & ids [ 0 ] , 0x10000 + 1 , 0x10000 ) ;
torture_assert_int_equal ( tctx , ret , - 1 , " idr_get_new_above succeeded above limit " ) ;
ret = idr_get_new_above ( idr , & ids [ 0 ] , 0x10000 + 2 , 0x10000 ) ;
torture_assert_int_equal ( tctx , ret , - 1 , " idr_get_new_above succeeded above limit " ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " cleaned up \n " ) ;
return true ;
2006-06-17 02:06:09 +04:00
}
2004-10-22 10:46:04 +04:00
2006-06-17 04:17:50 +04:00
struct torture_suite * torture_local_idtree ( TALLOC_CTX * mem_ctx )
2006-06-17 02:06:09 +04:00
{
2010-12-11 05:26:31 +03:00
struct torture_suite * suite = torture_suite_create ( mem_ctx , " idtree " ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_simple_test ( suite , " idtree " , torture_local_idtree_simple ) ;
2006-06-17 04:17:50 +04:00
return suite ;
2004-10-22 10:46:04 +04:00
}