[PATCH] New fstest to check rename POSIX conformance
Andre Marques
andre.lousa.marques at gmail.com
Fri Feb 21 13:38:02 UTC 2014
On 02/21/14 08:12, Sebastian Huber wrote:
> On 2014-02-20 00:36, Andre Marques wrote:
>>>>
>>>>>
>>>>>>
>>>>>> - Testing errno values in error situations. There is already a
>>>>>> fstest named
>>>>>> fserror which purpose seems to be checking errno values for a
>>>>>> bunch of
>>>>>> functions (rename included, but with some errno values missing).
>>>>>> Not sure
>>>>>> if I
>>>>>> should put them in this test or add to fserror.
>>>>>
>>>>> I would move all rename related tests to this new test program.
>>>>
>>>> About the errno value testing, I'm currently missing EIO, ENOSPC,
>>>> EROFS and
>>>> EXDEV.
>>>>
>>>> EROFS and EXDEV require mounting a second filesystem. How can I do
>>>> this in
>>>> RTEMS? Can it be done at runtime? I've been looking at the fileio
>>>> sample, which
>>>> uses the fsmount() function, but I need a disk to mount with it.
>>>
>>> For EROFS there is already a test in fstests/fsrofs01.
>>>
>>
>> So I leave EROFS out of this test?
>
> Yes, I would leave the EROFS test out.
>
>>
>>> You can mount as many file system instances as you want. You can do
>>> this
>>> with mount(). The mount() parameters are file system dependent. The
>>> generic
>>> file system tests (and your rename test should be one of them) use a
>>> support
>>> file for this:
>>>
>>> ./testsuites/fstests/mrfs_support/fs_support.c
>>> ./testsuites/fstests/mimfs_support/fs_support.c
>>> ./testsuites/fstests/mdosfs_support/fs_support.c
>>> ./testsuites/fstests/imfs_support/fs_support.c
>>> ./testsuites/fstests/jffs2_support/fs_support.c
>>
>> Yes I'm using support files on Makefile.am.
>>
>> For mount() should I use a ramdisk for the device file?
>>
>> I tried to create a ramdisk as in
>>
>> http://www.rtems.org/onlinedocs/doxygen/cpukit/html/group__rtems__ramdisk.html#gac6c99eed9f3b92bb4cf5184b25972e65
>>
>>
>>
>> but the program exits during the rtems_blkdev_create() call, if I use
>> "/dev/rda" as the device path.
>
> How does the code look like?
With
rtems_status_code sc;
ramdisk *rd;
const char device [] = "/dev/rda";
uint32_t media_block_size = 512;
rtems_blkdev_bnum media_block_count = 4000;
rd = ramdisk_allocate(NULL, media_block_size, media_block_count, false);
if (rd != NULL) {
sc = rtems_blkdev_create(
device,
media_block_size,
media_block_count,
ramdisk_ioctl,
rd);
perror("rtems_blkdev_create -> ");
}
the program just exits without giving any reason before the perror()
call. I assumed it was because the /dev directory wasn't there, so I
created the /dev directory before the rtems_blkdev_create() call and
then it gives
rtems_blkdev_create -> : Not supported
This while using ./testsuites/fstests/mrfs_support/fs_support.c
>
>>
>>>
>>> You can use the system file system as the second file system for the
>>> EXDEV test.
>>>
>>
>> I'm reading this as mounting an instance of the system filesystem. Am
>> I right?
>
> You need two file system instances. If you configure the system with
> CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM, then it starts with the IMFS as
> the root file system. For the file system tests you need a file
> system instance to test. This is set up with the
> test_initialize_filesystem() function, e.g.
>
> void test_initialize_filesystem(void)
> {
> int rv;
>
> erase_all();
>
> rv = mkdir(BASE_FOR_TEST, S_IRWXU | S_IRWXG | S_IRWXO);
> rtems_test_assert(rv == 0);
>
> rtems_resource_snapshot_take(&before_mount);
>
> rv = mount(
> NULL,
> BASE_FOR_TEST,
> RTEMS_FILESYSTEM_TYPE_JFFS2,
> RTEMS_FILESYSTEM_READ_WRITE,
> &mount_data
> );
> rtems_test_assert(rv == 0);
> }
>
> void test_shutdown_filesystem(void)
> {
> int rv = unmount(BASE_FOR_TEST);
> rtems_test_assert(rv == 0);
> rtems_test_assert(rtems_resource_snapshot_check(&before_mount));
> }
>
> So for the EXDEV test you can use for example:
>
> rename("/abc.txt", BASE_FOR_TEST "/abc.txt");
>
I used the equivalent functions on
./testsuites/fstests/mrfs_support/fs_support.c and it gave
../../../../../../../../Code/c/src/../../testsuites/fstests/mrfs_fsrename/../support/ramdisk_support.c:
40 rc == 0
which means it failed ramdisk_register().
But since I'm skipping the stafvfs() function call for now, I tried to
use mimfs (instead of mrfs) with
./testsuites/fstests/mimfs_support/fs_support.c and then I could finally
mount a second filesystem, so I will be working now with MIMFS.
A small issue I have with test_initialize_filesystem() and
test_shutdown_filesystem() is that I'm calling them from my code as
test_initialize_filesystem ();
... some code ...
test_shutdown_filesystem();
which generates
warning: nested extern declaration of 'test_initialize_filesystem'
because it is defined both on
./testsuites/fstests/mimfs_support/fs_support.c and
./testsuites/fstests/support/fstest_support.h and the first includes the
former, hence the warning (I believe).
What would be the best approach to solve this?
More information about the devel
mailing list