diff options
author | Ralf Kirchner <ralf.kirchner@embedded-brains.de> | 2012-10-30 13:41:11 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-12-05 15:26:47 +0100 |
commit | 5877a10fe2e8d54853ad110d51b84a2808d8a750 (patch) | |
tree | 4bf008153d0187ca4a0604fb8875f0a865964438 /testsuites/fstests/fsdosfsformat01 | |
parent | dosfs: Documentation (diff) | |
download | rtems-5877a10fe2e8d54853ad110d51b84a2808d8a750.tar.bz2 |
fstests/fsdosfsformat01: New test
Diffstat (limited to 'testsuites/fstests/fsdosfsformat01')
-rw-r--r-- | testsuites/fstests/fsdosfsformat01/Makefile.am | 19 | ||||
-rw-r--r-- | testsuites/fstests/fsdosfsformat01/fsdosfsformat01.doc | 11 | ||||
-rw-r--r-- | testsuites/fstests/fsdosfsformat01/fsdosfsformat01.scn | 2 | ||||
-rw-r--r-- | testsuites/fstests/fsdosfsformat01/init.c | 445 |
4 files changed, 477 insertions, 0 deletions
diff --git a/testsuites/fstests/fsdosfsformat01/Makefile.am b/testsuites/fstests/fsdosfsformat01/Makefile.am new file mode 100644 index 0000000000..d7c91f0802 --- /dev/null +++ b/testsuites/fstests/fsdosfsformat01/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = fsdosfsformat01 +fsdosfsformat01_SOURCES = init.c + +dist_rtems_tests_DATA = fsdosfsformat01.scn fsdosfsformat01.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(fsdosfsformat01_OBJECTS) +LINK_LIBS = $(fsdosfsformat01_LDLIBS) + +fsdosfsformat01$(EXEEXT): $(fsdosfsformat01_OBJECTS) $(fsdosfsformat01_DEPENDENCIES) + @rm -f fsdosfsformat01$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/fstests/fsdosfsformat01/fsdosfsformat01.doc b/testsuites/fstests/fsdosfsformat01/fsdosfsformat01.doc new file mode 100644 index 0000000000..6cdb669433 --- /dev/null +++ b/testsuites/fstests/fsdosfsformat01/fsdosfsformat01.doc @@ -0,0 +1,11 @@ +This file describes the directives and concepts tested by this test set. + +test set name: fsdosfsformat01 + +directives: + + TBD + +concepts: + + TBD diff --git a/testsuites/fstests/fsdosfsformat01/fsdosfsformat01.scn b/testsuites/fstests/fsdosfsformat01/fsdosfsformat01.scn new file mode 100644 index 0000000000..e7462728fc --- /dev/null +++ b/testsuites/fstests/fsdosfsformat01/fsdosfsformat01.scn @@ -0,0 +1,2 @@ +*** TEST FSDOSFSFORMAT 1 *** +*** END OF TEST FSDOSFSFORMAT 1 *** diff --git a/testsuites/fstests/fsdosfsformat01/init.c b/testsuites/fstests/fsdosfsformat01/init.c new file mode 100644 index 0000000000..1af9be8cf5 --- /dev/null +++ b/testsuites/fstests/fsdosfsformat01/init.c @@ -0,0 +1,445 @@ +/* + * Copyright (c) 2012 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file_name may be + * found in the file_name LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "tmacros.h" + +#include <fcntl.h> +#include <inttypes.h> +#include <sys/statvfs.h> +#include <rtems/libio.h> +#include <rtems/blkdev.h> +#include <rtems/dosfs.h> +#include <rtems/sparse-disk.h> + +#include <bsp.h> + +#define MAX_PATH_LENGTH 100 /* Maximum number of characters per path */ +#define SECTOR_SIZE 512 /* sector size (bytes) */ +#define FAT12_MAX_CLN 4085 /* maximum + 1 number of clusters for FAT12 */ +#define FAT16_MAX_CLN 65525 /* maximum + 1 number of clusters for FAT16 */ +#define FAT12_DEFAULT_SECTORS_PER_CLUSTER 8 /* Default number of sectors per cluster for FAT12 */ +#define FAT16_DEFAULT_SECTORS_PER_CLUSTER 32 /* Default number of sectors per cluster for FAT16 */ + +static void test_disk_params( + const char *dev_name, + const char *mount_dir, + const blksize_t sector_size, + const blksize_t cluster_size, + const blkcnt_t sectors_per_cluster ) +{ + int rv; + int fildes; + struct stat stat_buff; + char file_name[MAX_PATH_LENGTH + 1]; + ssize_t num_bytes; + unsigned int value = (unsigned int) -1; + + + snprintf( file_name, MAX_PATH_LENGTH, "%s/file1.txt", mount_dir ); + memset( &stat_buff, 0, sizeof( stat_buff ) ); + + rv = mount( dev_name, + mount_dir, + RTEMS_FILESYSTEM_TYPE_DOSFS, + RTEMS_FILESYSTEM_READ_WRITE, + NULL ); + rtems_test_assert( 0 == rv ); + + fildes = open( file_name, + O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); + rtems_test_assert( -1 != fildes ); + + num_bytes = write( fildes, &value, sizeof( value ) ); + rtems_test_assert( sizeof( value ) == num_bytes ); + + rv = fstat( fildes, &stat_buff ); + rtems_test_assert( 0 == rv ); + rtems_test_assert( S_ISREG( stat_buff.st_mode ) ); + rtems_test_assert( sizeof( value ) == stat_buff.st_size ); + rtems_test_assert( cluster_size == stat_buff.st_blksize ); + rtems_test_assert( sectors_per_cluster + == ( stat_buff.st_blocks * sector_size / 512 ) ); + rtems_test_assert( ( ( ( stat_buff.st_size + cluster_size + - 1 ) / cluster_size ) * cluster_size / 512 ) + == stat_buff.st_blocks ); + rv = close( fildes ); + rtems_test_assert( 0 == rv ); + + rv = unmount( mount_dir ); + rtems_test_assert( 0 == rv ); +} + +static void test_create_file( + const char *mount_dir, + uint32_t file_idx, + bool expect_ok ) +{ + char file_name[MAX_PATH_LENGTH + 1]; + int fd; + + + snprintf( file_name, + MAX_PATH_LENGTH, + "%s/file%" PRIu32 ".txt", + mount_dir, + file_idx ); + fd = open( file_name, + O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); + + if ( expect_ok ) { + int rv; + + rtems_test_assert( fd >= 0 ); + + rv = close( fd ); + rtems_test_assert( rv == 0 ); + } else { + rtems_test_assert( fd == -1 ); + } +} + +static void test_file_creation( + const char *dev_name, + const char *mount_dir, + const uint32_t number_of_files ) +{ + int rv; + uint32_t file_idx; + char file_name[MAX_PATH_LENGTH + 1]; + + + rv = mount( dev_name, + mount_dir, + RTEMS_FILESYSTEM_TYPE_DOSFS, + RTEMS_FILESYSTEM_READ_WRITE, + NULL ); + rtems_test_assert( 0 == rv ); + + for ( file_idx = 0; file_idx < number_of_files; ++file_idx ) { + test_create_file( mount_dir, file_idx, true ); + } + + test_create_file( mount_dir, file_idx, false ); + + for ( file_idx = 0; file_idx < number_of_files; ++file_idx ) { + snprintf( file_name, + MAX_PATH_LENGTH, + "%s/file%" PRIu32 ".txt", + mount_dir, + file_idx ); + rv = unlink( file_name ); + rtems_test_assert( 0 == rv ); + } + + rv = unmount( mount_dir ); + 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; + + + 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 ); + + rqdata.OEMName = NULL; + rqdata.VolLabel = NULL; + rqdata.sectors_per_cluster = 16; /* Invalid number of sectors per cluster for FAT12 */ + 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 ); + + /* 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 ); + + 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, + ( FAT16_MAX_CLN * FAT16_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, 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 * 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 ); + + /* 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 ); +} + +static void Init( rtems_task_argument arg ) +{ + puts( "\n\n*** TEST FSDOSFSFORMAT 1 ***" ); + + test(); + + puts( "*** END OF TEST FSDOSFSFORMAT 1 ***" ); + + rtems_test_exit( 0 ); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK + +/* one active file + stdin + stdout + stderr + device file when mounted */ +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 5 + +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM + +#define CONFIGURE_FILESYSTEM_DOSFS + +#define CONFIGURE_MAXIMUM_TASKS 1 +#define CONFIGURE_MAXIMUM_SEMAPHORES 1 + +#define CONFIGURE_INIT_TASK_STACK_SIZE ( 32 * 1024 ) + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE ( 32 * 1024 ) + +#define CONFIGURE_INIT + +#include <rtems/confdefs.h> |