summaryrefslogtreecommitdiffstats
path: root/testsuites/fstests/fsdosfsname01
diff options
context:
space:
mode:
authorRalf Kirchner <ralf.kirchner@embedded-brains.de>2013-02-26 15:18:55 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-03 17:28:41 +0200
commit52f3aa05198fa7cf5751a4804a90197de6f905a8 (patch)
tree33e54f270c6c5f6398a0ff708fd32a6b729ad148 /testsuites/fstests/fsdosfsname01
parentdosfs: UTF-8 Support: Multibyte conversions (diff)
downloadrtems-52f3aa05198fa7cf5751a4804a90197de6f905a8.tar.bz2
fsdosfsname01: Add multibyte tests
Test handling of file names and directory names according to Microsofts specification for the FAT file system. Tests for multibyte file names and directory names have been added.
Diffstat (limited to 'testsuites/fstests/fsdosfsname01')
-rw-r--r--testsuites/fstests/fsdosfsname01/fsdosfsname01.doc1
-rw-r--r--testsuites/fstests/fsdosfsname01/init.c286
2 files changed, 286 insertions, 1 deletions
diff --git a/testsuites/fstests/fsdosfsname01/fsdosfsname01.doc b/testsuites/fstests/fsdosfsname01/fsdosfsname01.doc
index adf11d3c1d..7751067355 100644
--- a/testsuites/fstests/fsdosfsname01/fsdosfsname01.doc
+++ b/testsuites/fstests/fsdosfsname01/fsdosfsname01.doc
@@ -16,3 +16,4 @@ directives:
concepts:
- Make sure short file- and directory names and long file- and directory names are handled correctly for the default character set (code page 850)
+- Make sure multibyte file names and directory names are handled correctly
diff --git a/testsuites/fstests/fsdosfsname01/init.c b/testsuites/fstests/fsdosfsname01/init.c
index ec9648ef35..d4d8c627bb 100644
--- a/testsuites/fstests/fsdosfsname01/init.c
+++ b/testsuites/fstests/fsdosfsname01/init.c
@@ -37,7 +37,9 @@
#define NUMBER_OF_FILES 13
#define NUMBER_OF_DIRECTORIES_INVALID 18
#define NUMBER_OF_DIRECTORIES_DUPLICATED 2
+#define NUMBER_OF_MULTIBYTE_NAMES_DUPLICATED 2
#define NUMBER_OF_FILES_DUPLICATED 2
+#define NUMBER_OF_NAMES_MULTIBYTE 10
#define MAX_NAME_LENGTH ( 255 + 1 )
#define MAX_NAME_LENGTH_INVALID ( 255 + 2 )
#define MAX_DUPLICATES_PER_NAME 3
@@ -96,6 +98,34 @@ static const char DIRECTORY_NAMES_INVALID[
{127}
};
+static const char NAMES_MULTIBYTE[
+ NUMBER_OF_NAMES_MULTIBYTE][MAX_NAME_LENGTH] = {
+ "đây là một tên tập tin dài",
+ "Bu uzun bir dosya adı",
+ "هذا هو اسم ملف طويل",
+ "αυτό είναι ένα μεγάλο όνομα αρχείου",
+ "это длинное имя",
+ "гэта доўгае імя",
+ "това е дълго име на файла",
+ "这是一个长文件名",
+ "shrtname",
+ "long_conventional_name"
+};
+
+static const char NAMES_MULTIBYTE_IN_CODEPAGE_FORMAT[
+ NUMBER_OF_NAMES_MULTIBYTE][MAX_NAME_LENGTH] = {
+ "_\2030005~1._t",
+ "bu0008~1.bir",
+ "__000b~1.__",
+ "__000f~1.__",
+ "__0012~1.___",
+ "__0015~1.___",
+ "__0018~1.___",
+ "__001a~1",
+ "shrtname",
+ "long_conventional_name"
+};
+
static const char FILE_NAMES[NUMBER_OF_FILES][
MAX_NAME_LENGTH] = {
"a file",
@@ -168,6 +198,7 @@ static const name_duplicates MULTIBYTE_DUPLICATES[
}
};
+
static const name_duplicates FILES_DUPLICATES[NUMBER_OF_FILES_DUPLICATED] = {
{
"shrtfile",
@@ -263,6 +294,22 @@ static void mount_device_with_defaults( const char *start_dir )
mount_device( start_dir, NULL );
}
+static void mount_device_with_iconv( const char *start_dir )
+{
+ int rc;
+ rtems_dosfs_mount_options mount_opts;
+
+
+ rc = msdos_format( RAMDISK_PATH, &rqdata );
+ rtems_test_assert( rc == 0 );
+
+ rtems_resource_snapshot_take( &before_mount );
+
+ mount_opts.string_opts = rtems_dosfs_string_options_init_utf8( "CP850" );
+
+ mount_device( start_dir, &mount_opts );
+}
+
static void unmount_and_close_device( void )
{
int rc;
@@ -427,6 +474,68 @@ static void test_handling_files(
}
/*
+ * Try to find (and open) all of the file names from an
+ * array in a given directory
+ */
+static void test_finding_files(
+ const char *dirname,
+ const char *file_names,
+ const unsigned int number_of_files )
+{
+ int rc;
+ DIR *dir_stream;
+ struct dirent *dp;
+ int fd;
+ unsigned int index_file;
+ char filename[MAX_NAME_LENGTH * 2 + MOUNT_DIR_SIZE
+ + START_DIR_SIZE + 4];
+
+
+ dir_stream = opendir( dirname );
+ rtems_test_assert( dir_stream != NULL );
+
+ dp = readdir( dir_stream );
+ rtems_test_assert( dp != NULL );
+ rtems_test_assert( 0 == strcmp( ".", dp->d_name ) );
+
+ dp = readdir( dir_stream );
+ rtems_test_assert( dp != NULL );
+ rtems_test_assert( 0 == strcmp( "..", dp->d_name ) );
+
+ dp = readdir( dir_stream );
+ rtems_test_assert( dp != NULL );
+ index_file = 0;
+
+ while ( dp != NULL ) {
+ rtems_test_assert( 0 == strcmp(
+ file_names + index_file * MAX_NAME_LENGTH,
+ dp->d_name ) );
+
+ snprintf(
+ filename,
+ sizeof( filename ) - 1,
+ "%s/%s",
+ dirname,
+ file_names + index_file * MAX_NAME_LENGTH );
+
+ /* See if the file still exists and can be found */
+ fd = open( filename, O_RDWR );
+ rtems_test_assert( fd >= 0 );
+
+ rc = close( fd );
+ rtems_test_assert( rc == 0 );
+
+ ++index_file;
+ dp = readdir( dir_stream );
+ }
+
+ rtems_test_assert( number_of_files == index_file );
+
+ rc = closedir( dir_stream );
+ rtems_test_assert( rc == 0 );
+}
+
+/*
* Try opening files which do already exist (with different capitalization in their names)
*/
static void test_duplicated_files( const char *dirname,
@@ -539,6 +648,68 @@ static void test_handling_directories(
}
/*
+ * Try to find all sub-directories from an array
+ * in a given start directory.
+ * In addition try to find and open files
+ * in these sub-directories.
+ */
+static void test_finding_directories(
+ const char *start_dir,
+ const char *directory_names,
+ const unsigned int number_of_directories,
+ const char *file_names,
+ const unsigned int number_of_files )
+{
+ unsigned int index_directory;
+ int rc;
+ DIR *dir_stream;
+ struct dirent *dp;
+ char dirname[MAX_NAME_LENGTH * 2];
+
+
+ dir_stream = opendir( start_dir );
+ rtems_test_assert( dir_stream != NULL );
+
+ dp = readdir( dir_stream );
+ rtems_test_assert( dp != NULL );
+ rtems_test_assert( 0 == strcmp( ".", dp->d_name ) );
+
+ dp = readdir( dir_stream );
+ rtems_test_assert( dp != NULL );
+ rtems_test_assert( 0 == strcmp( "..", dp->d_name ) );
+
+ dp = readdir( dir_stream );
+ rtems_test_assert( dp != NULL );
+ index_directory = 0;
+
+ while ( dp != NULL ) {
+ rtems_test_assert( 0 == strcmp(
+ directory_names + index_directory * MAX_NAME_LENGTH,
+ dp->d_name ) );
+
+ snprintf(
+ dirname,
+ sizeof( dirname ) - 1,
+ "%s/%s",
+ start_dir,
+ directory_names + index_directory * MAX_NAME_LENGTH );
+
+ test_finding_files(
+ dirname,
+ file_names,
+ number_of_files );
+
+ ++index_directory;
+ dp = readdir( dir_stream );
+ }
+
+ rtems_test_assert( number_of_directories == index_directory );
+
+ rc = closedir( dir_stream );
+ rtems_test_assert( rc == 0 );
+}
+
+/*
* Main test method
*/
static void test( void )
@@ -546,7 +717,6 @@ static void test( void )
int rc;
char start_dir[MOUNT_DIR_SIZE + START_DIR_SIZE + 2];
-
rc = mkdir( MOUNT_DIR, S_IRWXU | S_IRWXG | S_IRWXO );
rtems_test_assert( rc == 0 );
@@ -593,6 +763,120 @@ static void test( void )
&FILE_NAMES[0][0],
NUMBER_OF_FILES );
+ rc = unmount( MOUNT_DIR );
+ rtems_test_assert( rc == 0 );
+
+ /*
+ * Again tests with code page 850 compatible directory and file names
+ * but with multibyte string compatible conversion methods which use
+ * iconv and utf8proc
+ */
+ rtems_dosfs_mount_options mount_opts;
+ mount_opts.string_opts = rtems_dosfs_string_options_init_utf8( "CP850" );
+ rc = mount(
+ RAMDISK_PATH,
+ MOUNT_DIR,
+ "dosfs",
+ RTEMS_FILESYSTEM_READ_WRITE,
+ &mount_opts );
+ rtems_test_assert( rc == 0 );
+
+ test_finding_directories(
+ &start_dir[0],
+ &DIRECTORY_NAMES[0][0],
+ NUMBER_OF_DIRECTORIES,
+ &FILE_NAMES[0][0],
+ NUMBER_OF_FILES );
+ unmount_and_close_device();
+
+ mount_device_with_iconv( start_dir );
+ test_creating_invalid_directories();
+
+ test_creating_directories(
+ &start_dir[0],
+ &DIRECTORY_NAMES[0][0],
+ NUMBER_OF_DIRECTORIES );
+
+ test_handling_directories(
+ &start_dir[0],
+ &DIRECTORY_NAMES[0][0],
+ NUMBER_OF_DIRECTORIES,
+ &FILE_NAMES[0][0],
+ NUMBER_OF_FILES );
+ unmount_and_close_device();
+
+ mount_device_with_iconv( start_dir );
+
+ test_creating_duplicate_directories(
+ &start_dir[0],
+ &DIRECTORY_DUPLICATES[0],
+ NUMBER_OF_DIRECTORIES_DUPLICATED );
+
+ unmount_and_close_device();
+
+ mount_device_with_iconv( start_dir );
+
+ test_duplicated_files(
+ MOUNT_DIR,
+ FILES_DUPLICATES,
+ NUMBER_OF_FILES_DUPLICATED );
+
+ unmount_and_close_device();
+
+ /*
+ * Tests with multibyte directory and file names and
+ * with multibyte string compatible conversion methods which use
+ * iconv and utf8proc
+ */
+ mount_device_with_iconv( start_dir );
+
+ test_creating_duplicate_directories(
+ &start_dir[0],
+ &MULTIBYTE_DUPLICATES[0],
+ NUMBER_OF_MULTIBYTE_NAMES_DUPLICATED );
+
+ unmount_and_close_device();
+
+ mount_device_with_iconv( start_dir );
+
+ test_duplicated_files(
+ MOUNT_DIR,
+ &MULTIBYTE_DUPLICATES[0],
+ NUMBER_OF_MULTIBYTE_NAMES_DUPLICATED );
+
+ unmount_and_close_device();
+
+ mount_device_with_iconv( start_dir );
+
+ test_creating_directories(
+ &start_dir[0],
+ &NAMES_MULTIBYTE[0][0],
+ NUMBER_OF_NAMES_MULTIBYTE );
+ test_handling_directories(
+ &start_dir[0],
+ &NAMES_MULTIBYTE[0][0],
+ NUMBER_OF_NAMES_MULTIBYTE,
+ &NAMES_MULTIBYTE[0][0],
+ NUMBER_OF_NAMES_MULTIBYTE );
+
+ rc = unmount( MOUNT_DIR );
+ rtems_test_assert( rc == 0 );
+
+ rc = mount(
+ RAMDISK_PATH,
+ MOUNT_DIR,
+ "dosfs",
+ RTEMS_FILESYSTEM_READ_WRITE,
+ NULL );
+ rtems_test_assert( rc == 0 );
+
+ test_finding_directories(
+ &start_dir[0],
+ &NAMES_MULTIBYTE_IN_CODEPAGE_FORMAT[0][0],
+ NUMBER_OF_NAMES_MULTIBYTE,
+ &NAMES_MULTIBYTE_IN_CODEPAGE_FORMAT[0][0],
+ NUMBER_OF_NAMES_MULTIBYTE );
+
unmount_and_close_device();
del_ramdisk();