summaryrefslogtreecommitdiffstats
path: root/testsuites/fstests/fsdosfsformat01
diff options
context:
space:
mode:
authorRalf Kirchner <ralf.kirchner@embedded-brains.de>2012-10-30 13:41:11 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-05 15:26:47 +0100
commit5877a10fe2e8d54853ad110d51b84a2808d8a750 (patch)
tree4bf008153d0187ca4a0604fb8875f0a865964438 /testsuites/fstests/fsdosfsformat01
parentdosfs: Documentation (diff)
downloadrtems-5877a10fe2e8d54853ad110d51b84a2808d8a750.tar.bz2
fstests/fsdosfsformat01: New test
Diffstat (limited to 'testsuites/fstests/fsdosfsformat01')
-rw-r--r--testsuites/fstests/fsdosfsformat01/Makefile.am19
-rw-r--r--testsuites/fstests/fsdosfsformat01/fsdosfsformat01.doc11
-rw-r--r--testsuites/fstests/fsdosfsformat01/fsdosfsformat01.scn2
-rw-r--r--testsuites/fstests/fsdosfsformat01/init.c445
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>