/* * Do black box io testing on a sparse disk */ static void test_device_io( const char *device_name, const uint32_t block_size, const uint32_t media_block_size, const rtems_blkdev_bnum block_number, const rtems_blkdev_bnum blocks_allocated, const uint8_t fill_pattern ) { int rv; int file_descriptor; file_descriptor = open( device_name, O_RDWR ); rtems_test_assert( 0 <= file_descriptor ); test_disk_params( file_descriptor, block_size, media_block_size, block_number ); test_writing( file_descriptor, block_size, blocks_allocated ); test_reading( file_descriptor, block_size, blocks_allocated, fill_pattern ); rv = close( file_descriptor ); rtems_test_assert( 0 == rv ); }
static void test( void ) { rtems_status_code sc; int rv; const char dev_name[] = "/dev/rda"; const char mount_dir[] = "/mnt"; msdos_format_request_param_t rqdata; rtems_blkdev_bnum media_block_count; memset( &rqdata, 0, sizeof( rqdata ) ); sc = rtems_disk_io_initialize(); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rv = mkdir( mount_dir, S_IRWXU | S_IRWXG | S_IRWXO ); rtems_test_assert( 0 == rv ); /* FAT12 */ /* For 1.44 MB disks */ sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 64, 2880, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); /* Optimized for disk space */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 1; rqdata.fat_num = 1; rqdata.files_per_root_dir = 32; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = true; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE, 1 ); test_file_creation( dev_name, mount_dir, rqdata.files_per_root_dir ); /* Try formatting with invalid values */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 1; rqdata.fat_num = 7; /* Invalid number of fats */ rqdata.files_per_root_dir = 32; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = true; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv != 0 ); rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 1; rqdata.fat_num = 1; rqdata.files_per_root_dir = 32; rqdata.media = 0x11; /* Invalid media code */ rqdata.quick_format = true; rqdata.skip_alignment = true; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv != 0 ); /* Optimized for read/write speed */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 8; rqdata.fat_num = 0; rqdata.files_per_root_dir = 0; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = false; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * rqdata.sectors_per_cluster, rqdata.sectors_per_cluster ); /* The same disk formatted with FAT16 because sectors per cluster is too high * for FAT12 */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 16; rqdata.fat_num = 1; rqdata.files_per_root_dir = 32; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = false; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * rqdata.sectors_per_cluster, rqdata.sectors_per_cluster ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); /* Largest FAT12 disk */ sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 64, ( FAT12_MAX_CLN * FAT12_DEFAULT_SECTORS_PER_CLUSTER ) - 1L, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); /* Default parameters (corresponds to optimization for read/write speed) */ rv = msdos_format( dev_name, NULL ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * FAT12_DEFAULT_SECTORS_PER_CLUSTER, FAT12_DEFAULT_SECTORS_PER_CLUSTER ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); /* FAT16 */ sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 1024, ( FAT12_MAX_CLN * FAT12_DEFAULT_SECTORS_PER_CLUSTER ) + 1L, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); /* Optimized for disk space */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 1; rqdata.fat_num = 1; rqdata.files_per_root_dir = 32; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = true; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, rqdata.sectors_per_cluster * SECTOR_SIZE, rqdata.sectors_per_cluster ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 1024, ( FAT16_MAX_CLN * FAT16_DEFAULT_SECTORS_PER_CLUSTER ) - 1L, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); /* Optimized for read/write speed */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 64; rqdata.fat_num = 0; rqdata.files_per_root_dir = 0; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = false; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * rqdata.sectors_per_cluster, rqdata.sectors_per_cluster ); /* Default parameters (corresponds to optimization for read/write speed) */ rv = msdos_format( dev_name, NULL ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * FAT16_DEFAULT_SECTORS_PER_CLUSTER, FAT16_DEFAULT_SECTORS_PER_CLUSTER ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 1024, ( FAT16_MAX_CLN + 10 ) * 64, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 64; rqdata.fat_num = 0; rqdata.files_per_root_dir = 0; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = false; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * rqdata.sectors_per_cluster, rqdata.sectors_per_cluster ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); /* Format some disks from 1MB up to 128GB */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 64; rqdata.fat_num = 0; rqdata.files_per_root_dir = 0; rqdata.media = 0; rqdata.quick_format = true; rqdata.skip_alignment = false; for ( media_block_count = 1 * 1024 * ( 1024 / SECTOR_SIZE ); media_block_count <= 128 * 1024 * 1024 * ( 1024 / SECTOR_SIZE ); media_block_count *= 2 ) { sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 64, media_block_count, 0 ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * rqdata.sectors_per_cluster, rqdata.sectors_per_cluster ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); } /* FAT32 */ sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 1024, ( FAT16_MAX_CLN * FAT16_DEFAULT_SECTORS_PER_CLUSTER ) + 41L, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); /* Default parameters */ rv = msdos_format( dev_name, NULL ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE, 1 ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); sc = rtems_sparse_disk_create_and_register( dev_name, SECTOR_SIZE, 1024, ( FAT16_MAX_CLN + 20 ) * 64L, 0 ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); /* Optimized for read/write speed */ rqdata.OEMName = NULL; rqdata.VolLabel = NULL; rqdata.sectors_per_cluster = 64; rqdata.fat_num = 0; rqdata.files_per_root_dir = 0; rqdata.media = 0; /* Media code. 0 == Default */ rqdata.quick_format = true; rqdata.skip_alignment = false; rv = msdos_format( dev_name, &rqdata ); rtems_test_assert( rv == 0 ); test_disk_params( dev_name, mount_dir, SECTOR_SIZE, SECTOR_SIZE * rqdata.sectors_per_cluster, rqdata.sectors_per_cluster ); rv = unlink( dev_name ); rtems_test_assert( rv == 0 ); }
/* * Read write testing with a statically allocated disk. Thus white box testing can be done */ static void test_with_whitebox( const char *device_name ) { rtems_status_code sc; int rv; unsigned int i; sparse_disk_container disk_container; int file_descriptor; rtems_blkdev_bnum block_count = 0; unsigned int byte_count; uint8_t fill_pattern = 0; memset( disk_container.data, 0, sizeof( disk_container.data ) ); memset( disk_container.keytable, 0, sizeof( disk_container.keytable ) ); for ( i = 0; i < STATIC_PATTERN_SIZE; ++i ) disk_container.pattern[i] = (uint8_t) ( STATIC_PATTERN_SIZE - 1 - i ); sc = rtems_sparse_disk_register( "/dev/sda1", &disk_container.sparse_disk, STATIC_BLOCK_SIZE, STATIC_ALLOCATED_BLOCK_COUNT, STATIC_SIMULATED_BLOCK_COUNT, fill_pattern, NULL ); rtems_test_assert( RTEMS_SUCCESSFUL == sc ); test_static_key_table( &disk_container, STATIC_ALLOCATED_BLOCK_COUNT, STATIC_BLOCK_SIZE ); for ( i = 0; i < ( STATIC_BLOCK_SIZE * STATIC_ALLOCATED_BLOCK_COUNT ); ++i ) rtems_test_assert( 0 == disk_container.data[i] ); test_static_pattern( STATIC_PATTERN_SIZE, &disk_container.pattern[0] ); file_descriptor = open( device_name, O_RDWR ); rtems_test_assert( 0 <= file_descriptor ); test_disk_params( file_descriptor, STATIC_BLOCK_SIZE, STATIC_BLOCK_SIZE, STATIC_SIMULATED_BLOCK_COUNT ); test_writing( file_descriptor, STATIC_BLOCK_SIZE, STATIC_ALLOCATED_BLOCK_COUNT ); test_reading( file_descriptor, STATIC_BLOCK_SIZE, STATIC_ALLOCATED_BLOCK_COUNT, fill_pattern ); rv = close( file_descriptor ); rtems_test_assert( 0 == rv ); test_static_key_table( &disk_container, STATIC_ALLOCATED_BLOCK_COUNT, STATIC_BLOCK_SIZE ); for ( block_count = 0; block_count < STATIC_ALLOCATED_BLOCK_COUNT; block_count++ ) { for ( byte_count = 0; byte_count < ( STATIC_BLOCK_SIZE / sizeof( byte_count ) ); byte_count++ ) { rv = memcmp( &disk_container.data[byte_count * sizeof( byte_count )], &byte_count, sizeof( byte_count ) ); rtems_test_assert( 0 == rv ); } } test_static_pattern( STATIC_PATTERN_SIZE, &disk_container.pattern[0] ); }