Mercurial > ecos-v3_0-branch
changeset 1858:ed77ba8848ad
* fs/ram/current/tests/fseek1.c, fs/jffs2/current/tests/fileio1.c,
fs/jffs2/current/tests/fseek1.c, fs/fat/current/tests/fileio1.c:
Rename tests to make filenames unique.
* fs/ram/current/cdl/ramfs.cdl, fs/jffs2/current/cdl/jffs2.cdl,
fs/fat/current/cdl/fatfs.cdl: Accommodate test renaming.
| author | jld |
|---|---|
| date | Mon, 13 Dec 2004 20:33:43 +0000 |
| parents | 36bcb84dd874 |
| children | 1db64f508240 |
| files | packages/fs/fat/current/ChangeLog packages/fs/fat/current/cdl/fatfs.cdl packages/fs/fat/current/tests/fatfs1.c packages/fs/fat/current/tests/fileio1.c packages/fs/jffs2/current/ChangeLog packages/fs/jffs2/current/cdl/jffs2.cdl packages/fs/jffs2/current/tests/fileio1.c packages/fs/jffs2/current/tests/fseek1.c packages/fs/jffs2/current/tests/jffs2_1.c packages/fs/jffs2/current/tests/jffs2_2.c packages/fs/ram/current/ChangeLog packages/fs/ram/current/cdl/ramfs.cdl packages/fs/ram/current/tests/fseek1.c packages/fs/ram/current/tests/ramfs2.c |
| diffstat | 14 files changed, 1854 insertions(+), 1832 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/fs/fat/current/ChangeLog +++ b/packages/fs/fat/current/ChangeLog @@ -1,3 +1,9 @@ +2004-12-13 John Dallaway <jld@ecoscentric.com> + + * tests/fileio1.c: Rename to fatfs1.c. eCos test names should be + unique. + * cdl/fatfs.cdl: Build the renamed test. + 2004-11-14 Jani Monoses <jani@iv.ro> * test/fileio1.c: Start the test using main, not via a @@ -135,6 +141,7 @@ 2003-07-07 Savin Zlobec <savin@elatec.si // ------------------------------------------- // This file is part of eCos, the Embedded Configurable Operating System. // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. +// Copyright (C) 2004 eCosCentric Limited // // eCos is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free
--- a/packages/fs/fat/current/cdl/fatfs.cdl +++ b/packages/fs/fat/current/cdl/fatfs.cdl @@ -9,6 +9,7 @@ ## ------------------------------------------- ## This file is part of eCos, the Embedded Configurable Operating System. ## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. +## Copyright (C) 2004 eCosCentric Limited ## ## eCos is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free @@ -118,7 +119,7 @@ cdl_package CYGPKG_FS_FAT { display "FAT FS tests" flavor data no_define - calculated { "tests/fileio1.c" } + calculated { "tests/fatfs1" } description "This option specifies the set of tests for the FAT FS package." }
new file mode 100644 --- /dev/null +++ b/packages/fs/fat/current/tests/fatfs1.c @@ -0,0 +1,746 @@ +//========================================================================== +// +// fatfs1.c +// +// Test fileio system +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2004 eCosCentric Limited +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 2000-05-25 +// Purpose: Test fileio system +// Description: This test uses the testfs to check out the initialization +// and basic operation of the fileio system +// +// +// +// +// +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/hal.h> +#include <pkgconf/io_fileio.h> +#include <pkgconf/fs_fat.h> + +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <stdio.h> + +#include <cyg/fileio/fileio.h> + +#include <cyg/infra/testcase.h> +#include <cyg/infra/diag.h> // HAL polled output +#include <cyg/fs/fatfs.h> + + + +//========================================================================== + +#define SHOW_RESULT( _fn, _res ) \ +diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); + +//========================================================================== + +#define IOSIZE 100 + +#define LONGNAME1 "long_file_name_that_should_take_up_more_than_one_directory_entry_1" +#define LONGNAME2 "long_file_name_that_should_take_up_more_than_one_directory_entry_2" + + +//========================================================================== + +#ifndef CYGPKG_LIBC_STRING + +char *strcat( char *s1, const char *s2 ) +{ + char *s = s1; + while( *s1 ) s1++; + while( (*s1++ = *s2++) != 0); + return s; +} + +#endif + +//========================================================================== + +static void listdir( char *name, int statp, int numexpected, int *numgot ) +{ + int err; + DIR *dirp; + int num=0; + + diag_printf("<INFO>: reading directory %s\n",name); + + dirp = opendir( name ); + if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); + + for(;;) + { + struct dirent *entry = readdir( dirp ); + + if( entry == NULL ) + break; + num++; + diag_printf("<INFO>: entry %14s",entry->d_name); + if( statp ) + { + char fullname[PATH_MAX]; + struct stat sbuf; + + if( name[0] ) + { + strcpy(fullname, name ); + if( !(name[0] == '/' && name[1] == 0 ) ) + strcat(fullname, "/" ); + } + else fullname[0] = 0; + + strcat(fullname, entry->d_name ); + + err = stat( fullname, &sbuf ); + if( err < 0 ) + { + if( errno == ENOSYS ) + diag_printf(" <no status available>"); + else SHOW_RESULT( stat, err ); + } + else + { + diag_printf(" [mode %08x ino %08x nlink %d size %d]", + sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,sbuf.st_size); + } + } + + diag_printf("\n"); + } + + err = closedir( dirp ); + if( err < 0 ) SHOW_RESULT( stat, err ); + if (numexpected >= 0 && num != numexpected) + CYG_TEST_FAIL("Wrong number of dir entries\n"); + if ( numgot != NULL ) + *numgot = num; +} + +//========================================================================== + +static void createfile( char *name, size_t size ) +{ + char buf[IOSIZE]; + int fd; + ssize_t wrote; + int i; + int err; + + diag_printf("<INFO>: create file %s size %d\n",name,size); + + err = access( name, F_OK ); + if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); + + for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; + + fd = open( name, O_WRONLY|O_CREAT ); + if( fd < 0 ) SHOW_RESULT( open, fd ); + + while( size > 0 ) + { + ssize_t len = size; + if ( len > IOSIZE ) len = IOSIZE; + + wrote = write( fd, buf, len ); + if( wrote != len ) SHOW_RESULT( write, wrote ); + + size -= wrote; + } + + err = close( fd ); + if( err < 0 ) SHOW_RESULT( close, err ); +} + +//========================================================================== + +static void maxfile( char *name ) +{ + char buf[IOSIZE]; + int fd; + ssize_t wrote; + int i; + int err; + size_t size = 0; + size_t prevsize = 0; + + diag_printf("<INFO>: create maximal file %s\n",name); + diag_printf("<INFO>: This may take a few minutes\n"); + + err = access( name, F_OK ); + if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); + + for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; + + fd = open( name, O_WRONLY|O_CREAT ); + if( fd < 0 ) SHOW_RESULT( open, fd ); + + do + { + wrote = write( fd, buf, IOSIZE ); + //if( wrote < 0 ) SHOW_RESULT( write, wrote ); + + if( wrote >= 0 ) + size += wrote; + + if( (size-prevsize) > 100000 ) + { + diag_printf("<INFO>: size = %d \n", size); + prevsize = size; + } + + } while( wrote == IOSIZE ); + + diag_printf("<INFO>: file size == %d\n",size); + + err = close( fd ); + if( err < 0 ) SHOW_RESULT( close, err ); +} + +//========================================================================== + +static void checkfile( char *name ) +{ + char buf[IOSIZE]; + int fd; + ssize_t done; + int i; + int err; + off_t pos = 0; + + diag_printf("<INFO>: check file %s\n",name); + + err = access( name, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + fd = open( name, O_RDONLY ); + if( fd < 0 ) SHOW_RESULT( open, fd ); + + for(;;) + { + done = read( fd, buf, IOSIZE ); + if( done < 0 ) SHOW_RESULT( read, done ); + + if( done == 0 ) break; + + for( i = 0; i < done; i++ ) + if( buf[i] != i%256 ) + { + diag_printf("buf[%d+%d](%02x) != %02x\n",pos,i,buf[i],i%256); + CYG_TEST_FAIL("Data read not equal to data written\n"); + } + + pos += done; + } + + err = close( fd ); + if( err < 0 ) SHOW_RESULT( close, err ); +} + +#ifdef CYGCFG_FS_FAT_USE_ATTRIBUTES +//========================================================================== + +static void checkattrib(const char *name, + const cyg_fs_attrib_t test_attrib ) +{ + int err; + cyg_fs_attrib_t file_attrib; + + diag_printf("<INFO>: check attrib %s\n",name); + + err = cyg_fs_get_attrib(name, &file_attrib); + if( err != 0 ) SHOW_RESULT( stat, err ); + + if ( (file_attrib & S_FATFS_ATTRIB) != test_attrib ) + diag_printf("<FAIL>: attrib %s incorrect\n\tExpected %x Was %x\n", + name,test_attrib,(file_attrib & S_FATFS_ATTRIB)); +} +#endif // CYGCFG_FS_FAT_USE_ATTRIBUTES + +//========================================================================== + +static void copyfile( char *name2, char *name1 ) +{ + + int err; + char buf[IOSIZE]; + int fd1, fd2; + ssize_t done, wrote; + + diag_printf("<INFO>: copy file %s -> %s\n",name2,name1); + + err = access( name1, F_OK ); + if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); + + err = access( name2, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + fd1 = open( name1, O_WRONLY|O_CREAT ); + if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); + + fd2 = open( name2, O_RDONLY ); + if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); + + for(;;) + { + done = read( fd2, buf, IOSIZE ); + if( done < 0 ) SHOW_RESULT( read, done ); + + if( done == 0 ) break; + + wrote = write( fd1, buf, done ); + if( wrote != done ) SHOW_RESULT( write, wrote ); + + if( wrote != done ) break; + } + + err = close( fd1 ); + if( err < 0 ) SHOW_RESULT( close, err ); + + err = close( fd2 ); + if( err < 0 ) SHOW_RESULT( close, err ); + +} + +//========================================================================== + +static void comparefiles( char *name2, char *name1 ) +{ + int err; + char buf1[IOSIZE]; + char buf2[IOSIZE]; + int fd1, fd2; + ssize_t done1, done2; + int i; + + diag_printf("<INFO>: compare files %s == %s\n",name2,name1); + + err = access( name1, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + err = access( name1, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + fd1 = open( name1, O_RDONLY ); + if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); + + fd2 = open( name2, O_RDONLY ); + if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); + + for(;;) + { + done1 = read( fd1, buf1, IOSIZE ); + if( done1 < 0 ) SHOW_RESULT( read, done1 ); + + done2 = read( fd2, buf2, IOSIZE ); + if( done2 < 0 ) SHOW_RESULT( read, done2 ); + + if( done1 != done2 ) + diag_printf("Files different sizes\n"); + + if( done1 == 0 ) break; + + for( i = 0; i < done1; i++ ) + if( buf1[i] != buf2[i] ) + { + diag_printf("buf1[%d](%02x) != buf1[%d](%02x)\n",i,buf1[i],i,buf2[i]); + CYG_TEST_FAIL("Data in files not equal\n"); + } + } + + err = close( fd1 ); + if( err < 0 ) SHOW_RESULT( close, err ); + + err = close( fd2 ); + if( err < 0 ) SHOW_RESULT( close, err ); + +} + +//========================================================================== + +void checkcwd( const char *cwd ) +{ + static char cwdbuf[PATH_MAX]; + char *ret; + + ret = getcwd( cwdbuf, sizeof(cwdbuf)); + if( ret == NULL ) SHOW_RESULT( getcwd, ret ); + + if( strcmp( cwdbuf, cwd ) != 0 ) + { + diag_printf( "cwdbuf %s cwd %s\n",cwdbuf, cwd ); + CYG_TEST_FAIL( "Current directory mismatch"); + } +} + +//========================================================================== +// main + +int main( int argc, char **argv ) +{ + int err; + int existingdirents=-1; + + CYG_TEST_INIT(); + + // -------------------------------------------------------------- + + err = mount( "/dev/disk0/1", "/", "fatfs" ); + if( err < 0 ) SHOW_RESULT( mount, err ); + + err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/" ); + + listdir( "/", true, -1, &existingdirents ); + + // -------------------------------------------------------------- + + createfile( "/foo", 20257 ); + checkfile( "foo" ); + copyfile( "foo", "fee"); + checkfile( "fee" ); + comparefiles( "foo", "/fee" ); + diag_printf("<INFO>: mkdir bar\n"); + err = mkdir( "/bar", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + listdir( "/" , true, existingdirents+3, NULL ); + + copyfile( "fee", "/bar/fum" ); + checkfile( "bar/fum" ); + comparefiles( "/fee", "bar/fum" ); + + diag_printf("<INFO>: cd bar\n"); + err = chdir( "bar" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/bar" ); + + diag_printf("<INFO>: rename /foo bundy\n"); + err = rename( "/foo", "bundy" ); + if( err < 0 ) SHOW_RESULT( rename, err ); + + listdir( "/", true, existingdirents+2, NULL ); + listdir( "" , true, 4, NULL ); + + checkfile( "/bar/bundy" ); + comparefiles("/fee", "bundy" ); + + // -------------------------------------------------------------- + + diag_printf("<INFO>: unlink fee\n"); + err = unlink( "/fee" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink fum\n"); + err = unlink( "fum" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink /bar/bundy\n"); + err = unlink( "/bar/bundy" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: cd /\n"); + err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/" ); + + diag_printf("<INFO>: rmdir /bar\n"); + err = rmdir( "/bar" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + listdir( "/", false, existingdirents, NULL ); + + // -------------------------------------------------------------- + +#if 0 + diag_printf("<INFO>: mkdir disk2\n"); + err = mkdir( "/disk2", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); +#else + diag_printf("<INFO>: mount /disk2\n"); + err = mount( "/dev/disk0/2", "/disk2", "fatfs" ); + if( err < 0 ) SHOW_RESULT( mount, err ); +#endif + + listdir( "/disk2" , true, -1, &existingdirents); + + createfile( "/disk2/tinky", 4567 ); + copyfile( "/disk2/tinky", "/disk2/laalaa" ); + checkfile( "/disk2/tinky"); + checkfile( "/disk2/laalaa"); + comparefiles( "/disk2/tinky", "/disk2/laalaa" ); + + diag_printf("<INFO>: cd /disk2\n"); + err = chdir( "/disk2" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/disk2" ); + + diag_printf("<INFO>: mkdir noonoo\n"); + err = mkdir( "noonoo", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + listdir( "/disk2" , true, existingdirents+3, NULL); + + diag_printf("<INFO>: cd noonoo\n"); + err = chdir( "noonoo" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/disk2/noonoo" ); + + createfile( "tinky", 6789 ); + checkfile( "tinky" ); + + createfile( "dipsy", 34567 ); + checkfile( "dipsy" ); + copyfile( "dipsy", "po" ); + checkfile( "po" ); + comparefiles( "dipsy", "po" ); + + listdir( ".", true, 5, NULL ); + listdir( "", true, 5, NULL ); + listdir( "..", true, existingdirents+3, NULL ); + + // -------------------------------------------------------------- + + diag_printf("<INFO>: unlink tinky\n"); + err = unlink( "tinky" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink dipsy\n"); + err = unlink( "dipsy" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink po\n"); + err = unlink( "po" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: cd ..\n"); + err = chdir( ".." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/disk2" ); + + diag_printf("<INFO>: rmdir noonoo\n"); + err = rmdir( "noonoo" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + // -------------------------------------------------------------- + + err = mkdir( "x", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + err = mkdir( "x/y", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + err = mkdir( "x/y/z", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + err = mkdir( "x/y/z/w", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + diag_printf("<INFO>: cd /disk2/x/y/z/w\n"); + err = chdir( "/disk2/x/y/z/w" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/disk2/x/y/z/w" ); + + diag_printf("<INFO>: cd ..\n"); + err = chdir( ".." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/disk2/x/y/z" ); + + diag_printf("<INFO>: cd .\n"); + err = chdir( "." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/disk2/x/y/z" ); + + diag_printf("<INFO>: cd ../../y\n"); + err = chdir( "../../y" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/disk2/x/y" ); + + diag_printf("<INFO>: cd ../..\n"); + err = chdir( "../.." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/disk2" ); + + diag_printf("<INFO>: rmdir x/y/z/w\n"); + err = rmdir( "x/y/z/w" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + diag_printf("<INFO>: rmdir x/y/z\n"); + err = rmdir( "x/y/z" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + diag_printf("<INFO>: rmdir x/y\n"); + err = rmdir( "x/y" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + diag_printf("<INFO>: rmdir x\n"); + err = rmdir( "x" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + // -------------------------------------------------------------- + + checkcwd( "/disk2" ); + + diag_printf("<INFO>: unlink tinky\n"); + err = unlink( "tinky" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink laalaa\n"); + err = unlink( "laalaa" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: cd /\n"); + err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/" ); + + listdir( "/disk2", true, -1, NULL ); + +#if 0 + diag_printf("<INFO>: rmdir dir\n"); + err = rmdir( "disk2" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); +#else + diag_printf("<INFO>: umount /disk2\n"); + err = umount( "/disk2" ); + if( err < 0 ) SHOW_RESULT( umount, err ); +#endif + +#ifdef CYGCFG_FS_FAT_USE_ATTRIBUTES + // Create file + diag_printf("<INFO>: create /foo\n"); + createfile( "/foo", 20257 ); + + // Verify it is created with archive bit set + checkattrib( "/foo", S_FATFS_ARCHIVE ); + + // Make it System + diag_printf("<INFO>: attrib -A+S /foo\n"); + err = cyg_fs_set_attrib( "/foo", S_FATFS_SYSTEM ); + if( err < 0 ) SHOW_RESULT( chmod system , err ); + + // Verify it is now System + checkattrib( "/foo", S_FATFS_SYSTEM ); + + // Make it Hidden + diag_printf("<INFO>: attrib -S+H /foo\n"); + err = cyg_fs_set_attrib( "/foo", S_FATFS_HIDDEN ); + if( err < 0 ) SHOW_RESULT( chmod system , err ); + + // Verify it is now Hidden + checkattrib( "/foo", S_FATFS_HIDDEN ); + + // Make it Read-only + diag_printf("<INFO>: attrib -H+R /foo\n"); + err = cyg_fs_set_attrib( "/foo", S_FATFS_RDONLY ); + if( err < 0 ) SHOW_RESULT( chmod system , err ); + + // Verify it is now Read-only + checkattrib( "/foo", S_FATFS_RDONLY ); + + // Verify we cannot unlink a read-only file + diag_printf("<INFO>: unlink /foo\n"); + err = unlink( "/foo" ); + if( (err != -1) || (errno != EPERM) ) SHOW_RESULT( unlink, err ); + + // Verify we cannot rename a read-only file + diag_printf("<INFO>: rename /foo bundy\n"); + err = rename( "/foo", "bundy" ); + if( (err != -1) || (errno != EPERM) ) SHOW_RESULT( rename, err ); + + // Verify we cannot open read-only file for writing + int fd; + diag_printf("<INFO>: create file /foo\n"); + fd = open( "/foo", O_WRONLY ); + if( (err != -1) || (errno != EACCES) ) SHOW_RESULT( open, err ); + if( err > 0 ) close(fd); + + // Make it Normal + diag_printf("<INFO>: attrib -H /foo\n"); + err = cyg_fs_set_attrib( "/foo", 0 ); + if( err < 0 ) SHOW_RESULT( chmod none , err ); + + // Verify it is now nothing + checkattrib( "/foo", 0 ); + + // Now delete our test file + diag_printf("<INFO>: unlink /foo\n"); + err = unlink( "/foo" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + +#endif // CYGCFG_FS_FAT_USE_ATTRIBUTES + + maxfile("file.max"); + + listdir( "/", true, -1, NULL ); + + diag_printf("<INFO>: unlink file.max\n"); + err = unlink( "file.max" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + diag_printf("<INFO>: umount /\n"); + err = umount( "/" ); + if( err < 0 ) SHOW_RESULT( umount, err ); + + CYG_TEST_PASS_FINISH("fatfs1"); +} + +// ------------------------------------------------------------------------- +// EOF fatfs1.c
deleted file mode 100644 --- a/packages/fs/fat/current/tests/fileio1.c +++ /dev/null @@ -1,745 +0,0 @@ -//========================================================================== -// -// fileio1.c -// -// Test fileio system -// -//========================================================================== -//####ECOSGPLCOPYRIGHTBEGIN#### -// ------------------------------------------- -// This file is part of eCos, the Embedded Configurable Operating System. -// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. -// -// eCos is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 or (at your option) any later version. -// -// eCos is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with eCos; if not, write to the Free Software Foundation, Inc., -// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -// -// As a special exception, if other files instantiate templates or use macros -// or inline functions from this file, or you compile this file and link it -// with other works to produce a work based on this file, this file does not -// by itself cause the resulting work to be covered by the GNU General Public -// License. However the source code for this file must still be made available -// in accordance with section (3) of the GNU General Public License. -// -// This exception does not invalidate any other reasons why a work based on -// this file might be covered by the GNU General Public License. -// -// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. -// at http://sources.redhat.com/ecos/ecos-license/ -// ------------------------------------------- -//####ECOSGPLCOPYRIGHTEND#### -//========================================================================== -//#####DESCRIPTIONBEGIN#### -// -// Author(s): nickg -// Contributors: nickg -// Date: 2000-05-25 -// Purpose: Test fileio system -// Description: This test uses the testfs to check out the initialization -// and basic operation of the fileio system -// -// -// -// -// -// -// -//####DESCRIPTIONEND#### -// -//========================================================================== - -#include <pkgconf/hal.h> -#include <pkgconf/io_fileio.h> -#include <pkgconf/fs_fat.h> - -#include <cyg/infra/cyg_trac.h> // tracing macros -#include <cyg/infra/cyg_ass.h> // assertion macros - -#include <unistd.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#include <dirent.h> -#include <stdio.h> - -#include <cyg/fileio/fileio.h> - -#include <cyg/infra/testcase.h> -#include <cyg/infra/diag.h> // HAL polled output -#include <cyg/fs/fatfs.h> - - - -//========================================================================== - -#define SHOW_RESULT( _fn, _res ) \ -diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); - -//========================================================================== - -#define IOSIZE 100 - -#define LONGNAME1 "long_file_name_that_should_take_up_more_than_one_directory_entry_1" -#define LONGNAME2 "long_file_name_that_should_take_up_more_than_one_directory_entry_2" - - -//========================================================================== - -#ifndef CYGPKG_LIBC_STRING - -char *strcat( char *s1, const char *s2 ) -{ - char *s = s1; - while( *s1 ) s1++; - while( (*s1++ = *s2++) != 0); - return s; -} - -#endif - -//========================================================================== - -static void listdir( char *name, int statp, int numexpected, int *numgot ) -{ - int err; - DIR *dirp; - int num=0; - - diag_printf("<INFO>: reading directory %s\n",name); - - dirp = opendir( name ); - if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); - - for(;;) - { - struct dirent *entry = readdir( dirp ); - - if( entry == NULL ) - break; - num++; - diag_printf("<INFO>: entry %14s",entry->d_name); - if( statp ) - { - char fullname[PATH_MAX]; - struct stat sbuf; - - if( name[0] ) - { - strcpy(fullname, name ); - if( !(name[0] == '/' && name[1] == 0 ) ) - strcat(fullname, "/" ); - } - else fullname[0] = 0; - - strcat(fullname, entry->d_name ); - - err = stat( fullname, &sbuf ); - if( err < 0 ) - { - if( errno == ENOSYS ) - diag_printf(" <no status available>"); - else SHOW_RESULT( stat, err ); - } - else - { - diag_printf(" [mode %08x ino %08x nlink %d size %d]", - sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,sbuf.st_size); - } - } - - diag_printf("\n"); - } - - err = closedir( dirp ); - if( err < 0 ) SHOW_RESULT( stat, err ); - if (numexpected >= 0 && num != numexpected) - CYG_TEST_FAIL("Wrong number of dir entries\n"); - if ( numgot != NULL ) - *numgot = num; -} - -//========================================================================== - -static void createfile( char *name, size_t size ) -{ - char buf[IOSIZE]; - int fd; - ssize_t wrote; - int i; - int err; - - diag_printf("<INFO>: create file %s size %d\n",name,size); - - err = access( name, F_OK ); - if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); - - for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; - - fd = open( name, O_WRONLY|O_CREAT ); - if( fd < 0 ) SHOW_RESULT( open, fd ); - - while( size > 0 ) - { - ssize_t len = size; - if ( len > IOSIZE ) len = IOSIZE; - - wrote = write( fd, buf, len ); - if( wrote != len ) SHOW_RESULT( write, wrote ); - - size -= wrote; - } - - err = close( fd ); - if( err < 0 ) SHOW_RESULT( close, err ); -} - -//========================================================================== - -static void maxfile( char *name ) -{ - char buf[IOSIZE]; - int fd; - ssize_t wrote; - int i; - int err; - size_t size = 0; - size_t prevsize = 0; - - diag_printf("<INFO>: create maximal file %s\n",name); - diag_printf("<INFO>: This may take a few minutes\n"); - - err = access( name, F_OK ); - if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); - - for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; - - fd = open( name, O_WRONLY|O_CREAT ); - if( fd < 0 ) SHOW_RESULT( open, fd ); - - do - { - wrote = write( fd, buf, IOSIZE ); - //if( wrote < 0 ) SHOW_RESULT( write, wrote ); - - if( wrote >= 0 ) - size += wrote; - - if( (size-prevsize) > 100000 ) - { - diag_printf("<INFO>: size = %d \n", size); - prevsize = size; - } - - } while( wrote == IOSIZE ); - - diag_printf("<INFO>: file size == %d\n",size); - - err = close( fd ); - if( err < 0 ) SHOW_RESULT( close, err ); -} - -//========================================================================== - -static void checkfile( char *name ) -{ - char buf[IOSIZE]; - int fd; - ssize_t done; - int i; - int err; - off_t pos = 0; - - diag_printf("<INFO>: check file %s\n",name); - - err = access( name, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - fd = open( name, O_RDONLY ); - if( fd < 0 ) SHOW_RESULT( open, fd ); - - for(;;) - { - done = read( fd, buf, IOSIZE ); - if( done < 0 ) SHOW_RESULT( read, done ); - - if( done == 0 ) break; - - for( i = 0; i < done; i++ ) - if( buf[i] != i%256 ) - { - diag_printf("buf[%d+%d](%02x) != %02x\n",pos,i,buf[i],i%256); - CYG_TEST_FAIL("Data read not equal to data written\n"); - } - - pos += done; - } - - err = close( fd ); - if( err < 0 ) SHOW_RESULT( close, err ); -} - -#ifdef CYGCFG_FS_FAT_USE_ATTRIBUTES -//========================================================================== - -static void checkattrib(const char *name, - const cyg_fs_attrib_t test_attrib ) -{ - int err; - cyg_fs_attrib_t file_attrib; - - diag_printf("<INFO>: check attrib %s\n",name); - - err = cyg_fs_get_attrib(name, &file_attrib); - if( err != 0 ) SHOW_RESULT( stat, err ); - - if ( (file_attrib & S_FATFS_ATTRIB) != test_attrib ) - diag_printf("<FAIL>: attrib %s incorrect\n\tExpected %x Was %x\n", - name,test_attrib,(file_attrib & S_FATFS_ATTRIB)); -} -#endif // CYGCFG_FS_FAT_USE_ATTRIBUTES - -//========================================================================== - -static void copyfile( char *name2, char *name1 ) -{ - - int err; - char buf[IOSIZE]; - int fd1, fd2; - ssize_t done, wrote; - - diag_printf("<INFO>: copy file %s -> %s\n",name2,name1); - - err = access( name1, F_OK ); - if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); - - err = access( name2, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - fd1 = open( name1, O_WRONLY|O_CREAT ); - if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); - - fd2 = open( name2, O_RDONLY ); - if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); - - for(;;) - { - done = read( fd2, buf, IOSIZE ); - if( done < 0 ) SHOW_RESULT( read, done ); - - if( done == 0 ) break; - - wrote = write( fd1, buf, done ); - if( wrote != done ) SHOW_RESULT( write, wrote ); - - if( wrote != done ) break; - } - - err = close( fd1 ); - if( err < 0 ) SHOW_RESULT( close, err ); - - err = close( fd2 ); - if( err < 0 ) SHOW_RESULT( close, err ); - -} - -//========================================================================== - -static void comparefiles( char *name2, char *name1 ) -{ - int err; - char buf1[IOSIZE]; - char buf2[IOSIZE]; - int fd1, fd2; - ssize_t done1, done2; - int i; - - diag_printf("<INFO>: compare files %s == %s\n",name2,name1); - - err = access( name1, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - err = access( name1, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - fd1 = open( name1, O_RDONLY ); - if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); - - fd2 = open( name2, O_RDONLY ); - if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); - - for(;;) - { - done1 = read( fd1, buf1, IOSIZE ); - if( done1 < 0 ) SHOW_RESULT( read, done1 ); - - done2 = read( fd2, buf2, IOSIZE ); - if( done2 < 0 ) SHOW_RESULT( read, done2 ); - - if( done1 != done2 ) - diag_printf("Files different sizes\n"); - - if( done1 == 0 ) break; - - for( i = 0; i < done1; i++ ) - if( buf1[i] != buf2[i] ) - { - diag_printf("buf1[%d](%02x) != buf1[%d](%02x)\n",i,buf1[i],i,buf2[i]); - CYG_TEST_FAIL("Data in files not equal\n"); - } - } - - err = close( fd1 ); - if( err < 0 ) SHOW_RESULT( close, err ); - - err = close( fd2 ); - if( err < 0 ) SHOW_RESULT( close, err ); - -} - -//========================================================================== - -void checkcwd( const char *cwd ) -{ - static char cwdbuf[PATH_MAX]; - char *ret; - - ret = getcwd( cwdbuf, sizeof(cwdbuf)); - if( ret == NULL ) SHOW_RESULT( getcwd, ret ); - - if( strcmp( cwdbuf, cwd ) != 0 ) - { - diag_printf( "cwdbuf %s cwd %s\n",cwdbuf, cwd ); - CYG_TEST_FAIL( "Current directory mismatch"); - } -} - -//========================================================================== -// main - -int main( int argc, char **argv ) -{ - int err; - int existingdirents=-1; - - CYG_TEST_INIT(); - - // -------------------------------------------------------------- - - err = mount( "/dev/disk0/1", "/", "fatfs" ); - if( err < 0 ) SHOW_RESULT( mount, err ); - - err = chdir( "/" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/" ); - - listdir( "/", true, -1, &existingdirents ); - - // -------------------------------------------------------------- - - createfile( "/foo", 20257 ); - checkfile( "foo" ); - copyfile( "foo", "fee"); - checkfile( "fee" ); - comparefiles( "foo", "/fee" ); - diag_printf("<INFO>: mkdir bar\n"); - err = mkdir( "/bar", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - listdir( "/" , true, existingdirents+3, NULL ); - - copyfile( "fee", "/bar/fum" ); - checkfile( "bar/fum" ); - comparefiles( "/fee", "bar/fum" ); - - diag_printf("<INFO>: cd bar\n"); - err = chdir( "bar" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/bar" ); - - diag_printf("<INFO>: rename /foo bundy\n"); - err = rename( "/foo", "bundy" ); - if( err < 0 ) SHOW_RESULT( rename, err ); - - listdir( "/", true, existingdirents+2, NULL ); - listdir( "" , true, 4, NULL ); - - checkfile( "/bar/bundy" ); - comparefiles("/fee", "bundy" ); - - // -------------------------------------------------------------- - - diag_printf("<INFO>: unlink fee\n"); - err = unlink( "/fee" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink fum\n"); - err = unlink( "fum" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink /bar/bundy\n"); - err = unlink( "/bar/bundy" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: cd /\n"); - err = chdir( "/" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/" ); - - diag_printf("<INFO>: rmdir /bar\n"); - err = rmdir( "/bar" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - listdir( "/", false, existingdirents, NULL ); - - // -------------------------------------------------------------- - -#if 0 - diag_printf("<INFO>: mkdir disk2\n"); - err = mkdir( "/disk2", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); -#else - diag_printf("<INFO>: mount /disk2\n"); - err = mount( "/dev/disk0/2", "/disk2", "fatfs" ); - if( err < 0 ) SHOW_RESULT( mount, err ); -#endif - - listdir( "/disk2" , true, -1, &existingdirents); - - createfile( "/disk2/tinky", 4567 ); - copyfile( "/disk2/tinky", "/disk2/laalaa" ); - checkfile( "/disk2/tinky"); - checkfile( "/disk2/laalaa"); - comparefiles( "/disk2/tinky", "/disk2/laalaa" ); - - diag_printf("<INFO>: cd /disk2\n"); - err = chdir( "/disk2" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/disk2" ); - - diag_printf("<INFO>: mkdir noonoo\n"); - err = mkdir( "noonoo", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - listdir( "/disk2" , true, existingdirents+3, NULL); - - diag_printf("<INFO>: cd noonoo\n"); - err = chdir( "noonoo" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/disk2/noonoo" ); - - createfile( "tinky", 6789 ); - checkfile( "tinky" ); - - createfile( "dipsy", 34567 ); - checkfile( "dipsy" ); - copyfile( "dipsy", "po" ); - checkfile( "po" ); - comparefiles( "dipsy", "po" ); - - listdir( ".", true, 5, NULL ); - listdir( "", true, 5, NULL ); - listdir( "..", true, existingdirents+3, NULL ); - - // -------------------------------------------------------------- - - diag_printf("<INFO>: unlink tinky\n"); - err = unlink( "tinky" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink dipsy\n"); - err = unlink( "dipsy" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink po\n"); - err = unlink( "po" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: cd ..\n"); - err = chdir( ".." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/disk2" ); - - diag_printf("<INFO>: rmdir noonoo\n"); - err = rmdir( "noonoo" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - // -------------------------------------------------------------- - - err = mkdir( "x", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - err = mkdir( "x/y", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - err = mkdir( "x/y/z", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - err = mkdir( "x/y/z/w", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - diag_printf("<INFO>: cd /disk2/x/y/z/w\n"); - err = chdir( "/disk2/x/y/z/w" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/disk2/x/y/z/w" ); - - diag_printf("<INFO>: cd ..\n"); - err = chdir( ".." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/disk2/x/y/z" ); - - diag_printf("<INFO>: cd .\n"); - err = chdir( "." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/disk2/x/y/z" ); - - diag_printf("<INFO>: cd ../../y\n"); - err = chdir( "../../y" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/disk2/x/y" ); - - diag_printf("<INFO>: cd ../..\n"); - err = chdir( "../.." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/disk2" ); - - diag_printf("<INFO>: rmdir x/y/z/w\n"); - err = rmdir( "x/y/z/w" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - diag_printf("<INFO>: rmdir x/y/z\n"); - err = rmdir( "x/y/z" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - diag_printf("<INFO>: rmdir x/y\n"); - err = rmdir( "x/y" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - diag_printf("<INFO>: rmdir x\n"); - err = rmdir( "x" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - // -------------------------------------------------------------- - - checkcwd( "/disk2" ); - - diag_printf("<INFO>: unlink tinky\n"); - err = unlink( "tinky" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink laalaa\n"); - err = unlink( "laalaa" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: cd /\n"); - err = chdir( "/" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/" ); - - listdir( "/disk2", true, -1, NULL ); - -#if 0 - diag_printf("<INFO>: rmdir dir\n"); - err = rmdir( "disk2" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); -#else - diag_printf("<INFO>: umount /disk2\n"); - err = umount( "/disk2" ); - if( err < 0 ) SHOW_RESULT( umount, err ); -#endif - -#ifdef CYGCFG_FS_FAT_USE_ATTRIBUTES - // Create file - diag_printf("<INFO>: create /foo\n"); - createfile( "/foo", 20257 ); - - // Verify it is created with archive bit set - checkattrib( "/foo", S_FATFS_ARCHIVE ); - - // Make it System - diag_printf("<INFO>: attrib -A+S /foo\n"); - err = cyg_fs_set_attrib( "/foo", S_FATFS_SYSTEM ); - if( err < 0 ) SHOW_RESULT( chmod system , err ); - - // Verify it is now System - checkattrib( "/foo", S_FATFS_SYSTEM ); - - // Make it Hidden - diag_printf("<INFO>: attrib -S+H /foo\n"); - err = cyg_fs_set_attrib( "/foo", S_FATFS_HIDDEN ); - if( err < 0 ) SHOW_RESULT( chmod system , err ); - - // Verify it is now Hidden - checkattrib( "/foo", S_FATFS_HIDDEN ); - - // Make it Read-only - diag_printf("<INFO>: attrib -H+R /foo\n"); - err = cyg_fs_set_attrib( "/foo", S_FATFS_RDONLY ); - if( err < 0 ) SHOW_RESULT( chmod system , err ); - - // Verify it is now Read-only - checkattrib( "/foo", S_FATFS_RDONLY ); - - // Verify we cannot unlink a read-only file - diag_printf("<INFO>: unlink /foo\n"); - err = unlink( "/foo" ); - if( (err != -1) || (errno != EPERM) ) SHOW_RESULT( unlink, err ); - - // Verify we cannot rename a read-only file - diag_printf("<INFO>: rename /foo bundy\n"); - err = rename( "/foo", "bundy" ); - if( (err != -1) || (errno != EPERM) ) SHOW_RESULT( rename, err ); - - // Verify we cannot open read-only file for writing - int fd; - diag_printf("<INFO>: create file /foo\n"); - fd = open( "/foo", O_WRONLY ); - if( (err != -1) || (errno != EACCES) ) SHOW_RESULT( open, err ); - if( err > 0 ) close(fd); - - // Make it Normal - diag_printf("<INFO>: attrib -H /foo\n"); - err = cyg_fs_set_attrib( "/foo", 0 ); - if( err < 0 ) SHOW_RESULT( chmod none , err ); - - // Verify it is now nothing - checkattrib( "/foo", 0 ); - - // Now delete our test file - diag_printf("<INFO>: unlink /foo\n"); - err = unlink( "/foo" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - -#endif // CYGCFG_FS_FAT_USE_ATTRIBUTES - - maxfile("file.max"); - - listdir( "/", true, -1, NULL ); - - diag_printf("<INFO>: unlink file.max\n"); - err = unlink( "file.max" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - diag_printf("<INFO>: umount /\n"); - err = umount( "/" ); - if( err < 0 ) SHOW_RESULT( umount, err ); - - CYG_TEST_PASS_FINISH("fileio1"); -} - -// ------------------------------------------------------------------------- -// EOF fileio1.c
--- a/packages/fs/jffs2/current/ChangeLog +++ b/packages/fs/jffs2/current/ChangeLog @@ -1,3 +1,10 @@ +2004-12-13 John Dallaway <jld@ecoscentric.com> + + * tests/fileio1.c: Rename to jffs2_1.c. eCos test names should be + unique. + * tests/fseek1.c: Rename to jffs2_2.c. + * cdl/jffs2.cdl: Build the renamed tests. + 2004-12-10 Per Hedblom <per.hedblom@abem.se> * src/fs-ecos.c: Use filesystem locking not file locking otherwise @@ -432,6 +439,7 @@ 2000-08-28 Dominic Ostrowski (dominic.o // ------------------------------------------- // This file is part of eCos, the Embedded Configurable Operating System. // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2004 eCosCentric Limited // // eCos is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free
--- a/packages/fs/jffs2/current/cdl/jffs2.cdl +++ b/packages/fs/jffs2/current/cdl/jffs2.cdl @@ -11,6 +11,7 @@ ## ------------------------------------------- ## This file is part of eCos, the Embedded Configurable Operating System. ## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +## Copyright (C) 2004 eCosCentric Limited ## ## eCos is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free @@ -228,7 +229,7 @@ cdl_package CYGPKG_FS_JFFS2 { display "JFFS2 FS tests" flavor data no_define - calculated { "tests/fileio1.c tests/fseek1.c" } + calculated { "tests/jffs2_1 tests/jffs2_2" } description " This option specifies the set of tests for the JFFS2 FS package." }
deleted file mode 100644 --- a/packages/fs/jffs2/current/tests/fileio1.c +++ /dev/null @@ -1,669 +0,0 @@ -//========================================================================== -// -// fileio1.c -// -// Test fileio system -// -//========================================================================== -//####ECOSGPLCOPYRIGHTBEGIN#### -// ------------------------------------------- -// This file is part of eCos, the Embedded Configurable Operating System. -// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. -// -// eCos is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 or (at your option) any later version. -// -// eCos is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with eCos; if not, write to the Free Software Foundation, Inc., -// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -// -// As a special exception, if other files instantiate templates or use macros -// or inline functions from this file, or you compile this file and link it -// with other works to produce a work based on this file, this file does not -// by itself cause the resulting work to be covered by the GNU General Public -// License. However the source code for this file must still be made available -// in accordance with section (3) of the GNU General Public License. -// -// This exception does not invalidate any other reasons why a work based on -// this file might be covered by the GNU General Public License. -// -// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. -// at http://sources.redhat.com/ecos/ecos-license/ -// ------------------------------------------- -//####ECOSGPLCOPYRIGHTEND#### -//========================================================================== -//#####DESCRIPTIONBEGIN#### -// -// Author(s): nickg -// Contributors: nickg -// Date: 2000-05-25 -// Purpose: Test fileio system -// Description: This test uses the testfs to check out the initialization -// and basic operation of the fileio system -// -// -// -// -// -// -// -//####DESCRIPTIONEND#### -// -//========================================================================== - -#include <pkgconf/hal.h> -#include <pkgconf/kernel.h> -#include <pkgconf/io_fileio.h> - -#include <cyg/kernel/ktypes.h> // base kernel types -#include <cyg/infra/cyg_trac.h> // tracing macros -#include <cyg/infra/cyg_ass.h> // assertion macros -#include <cyg/io/flash.h> - -#include <unistd.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#include <dirent.h> - -#include <cyg/fileio/fileio.h> - -#include <cyg/infra/testcase.h> -#include <cyg/infra/diag.h> // HAL polled output - -#include <pkgconf/fs_jffs2.h> // Address of JFFS2 - -//========================================================================== - -#if 0 -MTAB_ENTRY( jffs2_mte1, - "/", - "jffs2", - CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, - 0); -#endif - -//========================================================================== - -#define SHOW_RESULT( _fn, _res ) \ -diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); - -//========================================================================== - -#define IOSIZE 1000 - -#define LONGNAME1 "long_file_name_that_should_take_up_more_than_one_directory_entry_1" -#define LONGNAME2 "long_file_name_that_should_take_up_more_than_one_directory_entry_2" - - -//========================================================================== - -#ifndef CYGPKG_LIBC_STRING - -char *strcat( char *s1, const char *s2 ) -{ - char *s = s1; - while( *s1 ) s1++; - while( (*s1++ = *s2++) != 0); - return s; -} - -#endif - -//========================================================================== - -static void listdir( char *name, int statp, int numexpected, int *numgot ) -{ - int err; - DIR *dirp; - int num=0; - - diag_printf("<INFO>: reading directory %s\n",name); - - dirp = opendir( name ); - if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); - - for(;;) - { - struct dirent *entry = readdir( dirp ); - - if( entry == NULL ) - break; - num++; - diag_printf("<INFO>: entry %14s",entry->d_name); - if( statp ) - { - char fullname[PATH_MAX]; - struct stat sbuf; - - if( name[0] ) - { - strcpy(fullname, name ); - if( !(name[0] == '/' && name[1] == 0 ) ) - strcat(fullname, "/" ); - } - else fullname[0] = 0; - - strcat(fullname, entry->d_name ); - - err = stat( fullname, &sbuf ); - if( err < 0 ) - { - if( errno == ENOSYS ) - diag_printf(" <no status available>"); - else SHOW_RESULT( stat, err ); - } - else - { - diag_printf(" [mode %08x ino %08x nlink %d size %d]", - sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,sbuf.st_size); - } - } - - diag_printf("\n"); - } - - err = closedir( dirp ); - if( err < 0 ) SHOW_RESULT( stat, err ); - if (numexpected >= 0 && num != numexpected) - CYG_TEST_FAIL("Wrong number of dir entries\n"); - if ( numgot != NULL ) - *numgot = num; -} - -//========================================================================== - -static void createfile( char *name, size_t size ) -{ - unsigned char buf[IOSIZE]; - int fd; - ssize_t wrote; - int i; - int err; - - diag_printf("<INFO>: create file %s size %d\n",name,size); - - err = access( name, F_OK ); - if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); - - for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; - - fd = open( name, O_WRONLY|O_CREAT ); - if( fd < 0 ) SHOW_RESULT( open, fd ); - - while( size > 0 ) - { - ssize_t len = size; - if ( len > IOSIZE ) len = IOSIZE; - - wrote = write( fd, buf, len ); - if( wrote != len ) SHOW_RESULT( write, wrote ); - - size -= wrote; - } - - err = close( fd ); - if( err < 0 ) SHOW_RESULT( close, err ); -} - -//========================================================================== - -#if 0 -static void maxfile( char *name ) -{ - char buf[IOSIZE]; - int fd; - ssize_t wrote; - int i; - int err; - size_t size = 0; - - diag_printf("<INFO>: create maximal file %s\n",name); - - err = access( name, F_OK ); - if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); - - for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; - - fd = open( name, O_WRONLY|O_CREAT ); - if( fd < 0 ) SHOW_RESULT( open, fd ); - - do - { - wrote = write( fd, buf, IOSIZE ); - if( wrote < 0 ) SHOW_RESULT( write, wrote ); - - size += wrote; - - } while( wrote == IOSIZE ); - - diag_printf("<INFO>: file size == %d\n",size); - - err = close( fd ); - if( err < 0 ) SHOW_RESULT( close, err ); -} -#endif - -//========================================================================== - -static void checkfile( char *name ) -{ - unsigned char buf[IOSIZE]; - int fd; - ssize_t done; - int i; - int err; - off_t pos = 0; - - diag_printf("<INFO>: check file %s\n",name); - - err = access( name, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - fd = open( name, O_RDONLY ); - if( fd < 0 ) SHOW_RESULT( open, fd ); - - for(;;) - { - done = read( fd, buf, IOSIZE ); - if( done < 0 ) SHOW_RESULT( read, done ); - - if( done == 0 ) break; - - for( i = 0; i < done; i++ ) - if( buf[i] != i%256 ) - { - diag_printf("buf[%d+%d](%02x) != %02x\n",pos,i,buf[i],i%256); - CYG_TEST_FAIL("Data read not equal to data written\n"); - } - - pos += done; - } - - err = close( fd ); - if( err < 0 ) SHOW_RESULT( close, err ); -} - -//========================================================================== - -static void copyfile( char *name2, char *name1 ) -{ - - int err; - char buf[IOSIZE]; - int fd1, fd2; - ssize_t done, wrote; - - diag_printf("<INFO>: copy file %s -> %s\n",name2,name1); - - err = access( name1, F_OK ); - if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); - - err = access( name2, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - fd1 = open( name1, O_WRONLY|O_CREAT ); - if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); - - fd2 = open( name2, O_RDONLY ); - if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); - - for(;;) - { - done = read( fd2, buf, IOSIZE ); - if( done < 0 ) SHOW_RESULT( read, done ); - - if( done == 0 ) break; - - wrote = write( fd1, buf, done ); - if( wrote != done ) SHOW_RESULT( write, wrote ); - - if( wrote != done ) break; - } - - err = close( fd1 ); - if( err < 0 ) SHOW_RESULT( close, err ); - - err = close( fd2 ); - if( err < 0 ) SHOW_RESULT( close, err ); - -} - -//========================================================================== - -static void comparefiles( char *name2, char *name1 ) -{ - int err; - char buf1[IOSIZE]; - char buf2[IOSIZE]; - int fd1, fd2; - ssize_t done1, done2; - int i; - - diag_printf("<INFO>: compare files %s == %s\n",name2,name1); - - err = access( name1, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - err = access( name1, F_OK ); - if( err != 0 ) SHOW_RESULT( access, err ); - - fd1 = open( name1, O_RDONLY ); - if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); - - fd2 = open( name2, O_RDONLY ); - if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); - - for(;;) - { - done1 = read( fd1, buf1, IOSIZE ); - if( done1 < 0 ) SHOW_RESULT( read, done1 ); - - done2 = read( fd2, buf2, IOSIZE ); - if( done2 < 0 ) SHOW_RESULT( read, done2 ); - - if( done1 != done2 ) - diag_printf("Files different sizes\n"); - - if( done1 == 0 ) break; - - for( i = 0; i < done1; i++ ) - if( buf1[i] != buf2[i] ) - { - diag_printf("buf1[%d](%02x) != buf1[%d](%02x)\n",i,buf1[i],i,buf2[i]); - CYG_TEST_FAIL("Data in files not equal\n"); - } - } - - err = close( fd1 ); - if( err < 0 ) SHOW_RESULT( close, err ); - - err = close( fd2 ); - if( err < 0 ) SHOW_RESULT( close, err ); - -} - -//========================================================================== - -void checkcwd( const char *cwd ) -{ - static char cwdbuf[PATH_MAX]; - char *ret; - - ret = getcwd( cwdbuf, sizeof(cwdbuf)); - if( ret == NULL ) SHOW_RESULT( getcwd, ret ); - - if( strcmp( cwdbuf, cwd ) != 0 ) - { - diag_printf( "cwdbuf %s cwd %s\n",cwdbuf, cwd ); - CYG_TEST_FAIL( "Current directory mismatch"); - } -} - -//========================================================================== -// main - -int main( int argc, char **argv ) -{ - int err; - //int i; - int existingdirents=-1; - - CYG_TEST_INIT(); - - // -------------------------------------------------------------- - - err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" ); - if( err < 0 ) SHOW_RESULT( mount, err ); - - err = chdir( "/" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/" ); - - listdir( "/", true, -1, &existingdirents ); - if ( existingdirents < 2 ) - CYG_TEST_FAIL("Not enough dir entries\n"); - - // -------------------------------------------------------------- - - createfile( "/foo", 202 ); - checkfile( "foo" ); - copyfile( "foo", "fee"); - checkfile( "fee" ); - comparefiles( "foo", "/fee" ); - diag_printf("<INFO>: mkdir bar\n"); - err = mkdir( "/bar", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - listdir( "/" , true, existingdirents+3, NULL ); - - copyfile( "fee", "/bar/fum" ); - checkfile( "bar/fum" ); - comparefiles( "/fee", "bar/fum" ); - - diag_printf("<INFO>: cd bar\n"); - err = chdir( "bar" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/bar" ); - - diag_printf("<INFO>: rename /foo bundy\n"); - err = rename( "/foo", "bundy" ); - if( err < 0 ) SHOW_RESULT( rename, err ); - - listdir( "/", true, existingdirents+2, NULL ); - listdir( "" , true, 4, NULL ); - - checkfile( "/bar/bundy" ); - comparefiles("/fee", "bundy" ); - - // -------------------------------------------------------------- - - createfile( LONGNAME1, 123 ); - checkfile( LONGNAME1 ); - copyfile( LONGNAME1, LONGNAME2 ); - - listdir( "", false, 6, NULL ); - - diag_printf("<INFO>: unlink " LONGNAME1 "\n"); - err = unlink( LONGNAME1 ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink " LONGNAME2 "\n"); - err = unlink( LONGNAME2 ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - - // -------------------------------------------------------------- - - diag_printf("<INFO>: unlink fee\n"); - err = unlink( "/fee" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink fum\n"); - err = unlink( "fum" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink /bar/bundy\n"); - err = unlink( "/bar/bundy" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: cd /\n"); - err = chdir( "/" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/" ); - - diag_printf("<INFO>: rmdir /bar\n"); - err = rmdir( "/bar" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - listdir( "/", false, existingdirents, NULL ); - - // -------------------------------------------------------------- - - diag_printf("<INFO>: mount /jffs2 \n"); - err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/jffs2", "jffs2" ); - if( err < 0 ) SHOW_RESULT( mount, err ); - - createfile( "/jffs2/tinky", 456 ); - copyfile( "/jffs2/tinky", "/jffs2/laalaa" ); - checkfile( "/jffs2/tinky"); - checkfile( "/jffs2/laalaa"); - comparefiles( "/jffs2/tinky", "/jffs2/laalaa" ); - - diag_printf("<INFO>: cd /jffs2\n"); - err = chdir( "/jffs2" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/jffs2" ); - - diag_printf("<INFO>: mkdir noonoo\n"); - err = mkdir( "noonoo", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - listdir( "." , true, existingdirents+3, NULL); - - diag_printf("<INFO>: cd noonoo\n"); - err = chdir( "noonoo" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - - checkcwd( "/jffs2/noonoo" ); - - createfile( "tinky", 678 ); - checkfile( "tinky" ); - - createfile( "dipsy", 3456 ); - checkfile( "dipsy" ); - copyfile( "dipsy", "po" ); - checkfile( "po" ); - comparefiles( "dipsy", "po" ); - - - /*for(i=0;i<2048;i++) { - diag_printf("<INFO>: churningchurningchurning................................ITERATION = %d\n", i); - createfile( "churningchurningchurning", 4096 ); - diag_printf("<INFO>: unlink churningchurningchurning\n"); - err = unlink( "churningchurningchurning" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - }*/ - - - listdir( ".", true, 5, NULL ); - listdir( "", true, 5, NULL ); - listdir( "..", true, existingdirents+3, NULL ); - - // -------------------------------------------------------------- - - diag_printf("<INFO>: unlink tinky\n"); - err = unlink( "tinky" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink dipsy\n"); - err = unlink( "dipsy" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink po\n"); - err = unlink( "po" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: cd ..\n"); - err = chdir( ".." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/jffs2" ); - - diag_printf("<INFO>: rmdir noonoo\n"); - err = rmdir( "noonoo" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - // -------------------------------------------------------------- - - err = mkdir( "x", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - err = mkdir( "x/y", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - err = mkdir( "x/y/z", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - err = mkdir( "x/y/z/w", 0 ); - if( err < 0 ) SHOW_RESULT( mkdir, err ); - - diag_printf("<INFO>: cd /jffs2/x/y/z/w\n"); - err = chdir( "/jffs2/x/y/z/w" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/jffs2/x/y/z/w" ); - - diag_printf("<INFO>: cd ..\n"); - err = chdir( ".." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/jffs2/x/y/z" ); - - diag_printf("<INFO>: cd .\n"); - err = chdir( "." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/jffs2/x/y/z" ); - - diag_printf("<INFO>: cd ../../y\n"); - err = chdir( "../../y" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/jffs2/x/y" ); - - diag_printf("<INFO>: cd ../..\n"); - err = chdir( "../.." ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/jffs2" ); - - diag_printf("<INFO>: rmdir x/y/z/w\n"); - err = rmdir( "x/y/z/w" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - diag_printf("<INFO>: rmdir x/y/z\n"); - err = rmdir( "x/y/z" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - diag_printf("<INFO>: rmdir x/y\n"); - err = rmdir( "x/y" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - diag_printf("<INFO>: rmdir x\n"); - err = rmdir( "x" ); - if( err < 0 ) SHOW_RESULT( rmdir, err ); - - // -------------------------------------------------------------- - - diag_printf("<INFO>: unlink tinky\n"); - err = unlink( "tinky" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: unlink laalaa\n"); - err = unlink( "laalaa" ); - if( err < 0 ) SHOW_RESULT( unlink, err ); - - diag_printf("<INFO>: cd /\n"); - err = chdir( "/" ); - if( err < 0 ) SHOW_RESULT( chdir, err ); - checkcwd( "/" ); - - diag_printf("<INFO>: umount /jffs2\n"); - err = umount( "/jffs2" ); - if( err < 0 ) SHOW_RESULT( umount, err ); - - diag_printf("<INFO>: umount /\n"); - err = umount( "/" ); - if( err < 0 ) SHOW_RESULT( umount, err ); - - CYG_TEST_PASS_FINISH("fileio1"); -} - -// ------------------------------------------------------------------------- -// EOF fileio1.c
deleted file mode 100644 --- a/packages/fs/jffs2/current/tests/fseek1.c +++ /dev/null @@ -1,241 +0,0 @@ -//========================================================================== -// -// fseek1.c -// -// Test fseek on a filesystem -// -//========================================================================== -//####ECOSGPLCOPYRIGHTBEGIN#### -// ------------------------------------------- -// This file is part of eCos, the Embedded Configurable Operating System. -// Copyright (C) 2004 Andrew Lunn -// -// eCos is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 or (at your option) any later version. -// -// eCos is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with eCos; if not, write to the Free Software Foundation, Inc., -// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -// -// As a special exception, if other files instantiate templates or use macros -// or inline functions from this file, or you compile this file and link it -// with other works to produce a work based on this file, this file does not -// by itself cause the resulting work to be covered by the GNU General Public -// License. However the source code for this file must still be made available -// in accordance with section (3) of the GNU General Public License. -// -// This exception does not invalidate any other reasons why a work based on -// this file might be covered by the GNU General Public License. -// -// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. -// at http://sources.redhat.com/ecos/ecos-license/ -// ------------------------------------------- -//####ECOSGPLCOPYRIGHTEND#### -//========================================================================== -//#####DESCRIPTIONBEGIN#### -// -// Author(s): asl -// Contributors: asl -// Date: 2004-03-29 -// Purpose: Test fseek on a filesystem -// Description: This test uses the ramfs to check out the fseek -// operation on a filesystem. -// -// -// -// -// -// -// -//####DESCRIPTIONEND#### -// -//========================================================================== -#include <stdio.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> - -#include <cyg/fileio/fileio.h> -#include <cyg/io/flash.h> - -#include <cyg/infra/testcase.h> -#include <cyg/infra/diag.h> // HAL polled output -//========================================================================== - -#define SHOW_RESULT( _fn, _res ) \ -diag_printf("FAIL: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); - -//========================================================================== - -char buf[1024]; -char buf1[1024]; - -//========================================================================== -// main - -int main( int argc, char **argv ) -{ - int err; - FILE *stream; - long pos; - int i; - - CYG_TEST_INIT(); - - // -------------------------------------------------------------- - - CYG_TEST_INFO("mount /"); - err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" ); - - if( err < 0 ) SHOW_RESULT( mount, err ); - - CYG_TEST_INFO("creating /fseek"); - stream = fopen("/fseek","w+"); - if (!stream) { - diag_printf("FAIL: fopen() returned NULL, %s\n", strerror(errno)); - CYG_TEST_FINISH("done"); \ - } - - /* Write a buffer full of cyclic numbers */ - for (i = 0; i < sizeof(buf); i++) { - buf[i] = i % 256; - } - - CYG_TEST_INFO("writing test pattern"); - err=fwrite(buf,sizeof(buf), 1, stream); - if ( err < 0 ) SHOW_RESULT( fwrite, err ); - - /* The current position should be the same size as the buffer */ - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != sizeof(buf)) - diag_printf("<FAIL>: ftell is not telling the truth."); - - CYG_TEST_INFO("fseek()ing to beginning and writing"); - - /* Seek back to the beginning of the file */ - err = fseek(stream, 0, SEEK_SET); - if ( err < 0 ) SHOW_RESULT( fseek, err ); - - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != 0) CYG_TEST_FAIL("ftell is not telling the truth"); - - /* Write 4 zeros to the beginning of the file */ - for (i = 0; i < 4; i++) { - buf[i] = 0; - } - - err = fwrite(buf, 4, 1, stream); - if ( err < 0 ) SHOW_RESULT( fwrite, err ); - - /* Check the pointer is at 4 */ - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != 4) CYG_TEST_FAIL("ftell is not telling the truth"); - - CYG_TEST_INFO("closing file"); - - /* Close the file, open it up again and read it back */ - err = fclose(stream); - if (err != 0) SHOW_RESULT( fclose, err ); - - CYG_TEST_INFO("open file /fseek"); - stream = fopen("/fseek", "r+"); - if (!stream) { - diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); - } - - err = fread(buf1,sizeof(buf1),1, stream); - if (err != 1) SHOW_RESULT( fread, err ); - - CYG_TEST_INFO("Comparing contents"); - if (memcmp(buf, buf1, sizeof(buf1))) { - CYG_TEST_FAIL("File contents inconsistent"); - } - - CYG_TEST_INFO("closing file"); - - err = fclose(stream); - if (err != 0) SHOW_RESULT( fclose, err ); - - CYG_TEST_INFO("open file /fseek"); - stream = fopen("/fseek", "r+"); - if (!stream) { - diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); - } - - CYG_TEST_INFO("fseek()ing past the end to create a hole"); - /* Seek 1K after the end of the file */ - err = fseek(stream, sizeof(buf), SEEK_END); - if ( err < 0 ) SHOW_RESULT( fseek, err ); - - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != (2*sizeof(buf))) CYG_TEST_FAIL("ftell is not telling the truth"); - - CYG_TEST_INFO("writing test pattern"); - err=fwrite(buf,sizeof(buf), 1, stream); - if ( err < 0 ) SHOW_RESULT( fwrite, err ); - - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != (3*sizeof(buf))) CYG_TEST_FAIL("ftell is not telling the truth"); - - CYG_TEST_INFO("closing file"); - err = fclose(stream); - if (err != 0) SHOW_RESULT( fclose, err ); - - CYG_TEST_INFO("open file /fseek"); - stream = fopen("/fseek", "r+"); - if (!stream) { - diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); - } - - err = fread(buf1,sizeof(buf1),1, stream); - if (err != 1) SHOW_RESULT( fread, err ); - - CYG_TEST_INFO("Comparing contents"); - if (memcmp(buf, buf1, sizeof(buf1))) { - CYG_TEST_FAIL("File contents inconsistent"); - } - - err = fread(buf1,sizeof(buf1),1, stream); - if (err != 1) SHOW_RESULT( fread, err ); - - for (i = 0; i< sizeof(buf); i++) { - if (buf1[i] != 0) - CYG_TEST_FAIL("Hole does not contain zeros"); - } - - err = fread(buf1,sizeof(buf1),1, stream); - if (err != 1) SHOW_RESULT( fread, err ); - - if (memcmp(buf, buf1, sizeof(buf1))) { - CYG_TEST_FAIL("File contents inconsistent"); - } - - CYG_TEST_INFO("closing file"); - - /* Close the file */ - err = fclose(stream); - if (err != 0) SHOW_RESULT( fclose, err ); - - CYG_TEST_INFO("umount /"); - err = umount( "/" ); - if( err < 0 ) SHOW_RESULT( umount, err ); - - CYG_TEST_PASS_FINISH("fseek1"); -}
new file mode 100644 --- /dev/null +++ b/packages/fs/jffs2/current/tests/jffs2_1.c @@ -0,0 +1,670 @@ +//========================================================================== +// +// jffs2_1.c +// +// Test fileio system +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2004 eCosCentric Limited +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 2000-05-25 +// Purpose: Test fileio system +// Description: This test uses the testfs to check out the initialization +// and basic operation of the fileio system +// +// +// +// +// +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/hal.h> +#include <pkgconf/kernel.h> +#include <pkgconf/io_fileio.h> + +#include <cyg/kernel/ktypes.h> // base kernel types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros +#include <cyg/io/flash.h> + +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> + +#include <cyg/fileio/fileio.h> + +#include <cyg/infra/testcase.h> +#include <cyg/infra/diag.h> // HAL polled output + +#include <pkgconf/fs_jffs2.h> // Address of JFFS2 + +//========================================================================== + +#if 0 +MTAB_ENTRY( jffs2_mte1, + "/", + "jffs2", + CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, + 0); +#endif + +//========================================================================== + +#define SHOW_RESULT( _fn, _res ) \ +diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); + +//========================================================================== + +#define IOSIZE 1000 + +#define LONGNAME1 "long_file_name_that_should_take_up_more_than_one_directory_entry_1" +#define LONGNAME2 "long_file_name_that_should_take_up_more_than_one_directory_entry_2" + + +//========================================================================== + +#ifndef CYGPKG_LIBC_STRING + +char *strcat( char *s1, const char *s2 ) +{ + char *s = s1; + while( *s1 ) s1++; + while( (*s1++ = *s2++) != 0); + return s; +} + +#endif + +//========================================================================== + +static void listdir( char *name, int statp, int numexpected, int *numgot ) +{ + int err; + DIR *dirp; + int num=0; + + diag_printf("<INFO>: reading directory %s\n",name); + + dirp = opendir( name ); + if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); + + for(;;) + { + struct dirent *entry = readdir( dirp ); + + if( entry == NULL ) + break; + num++; + diag_printf("<INFO>: entry %14s",entry->d_name); + if( statp ) + { + char fullname[PATH_MAX]; + struct stat sbuf; + + if( name[0] ) + { + strcpy(fullname, name ); + if( !(name[0] == '/' && name[1] == 0 ) ) + strcat(fullname, "/" ); + } + else fullname[0] = 0; + + strcat(fullname, entry->d_name ); + + err = stat( fullname, &sbuf ); + if( err < 0 ) + { + if( errno == ENOSYS ) + diag_printf(" <no status available>"); + else SHOW_RESULT( stat, err ); + } + else + { + diag_printf(" [mode %08x ino %08x nlink %d size %d]", + sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,sbuf.st_size); + } + } + + diag_printf("\n"); + } + + err = closedir( dirp ); + if( err < 0 ) SHOW_RESULT( stat, err ); + if (numexpected >= 0 && num != numexpected) + CYG_TEST_FAIL("Wrong number of dir entries\n"); + if ( numgot != NULL ) + *numgot = num; +} + +//========================================================================== + +static void createfile( char *name, size_t size ) +{ + unsigned char buf[IOSIZE]; + int fd; + ssize_t wrote; + int i; + int err; + + diag_printf("<INFO>: create file %s size %d\n",name,size); + + err = access( name, F_OK ); + if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); + + for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; + + fd = open( name, O_WRONLY|O_CREAT ); + if( fd < 0 ) SHOW_RESULT( open, fd ); + + while( size > 0 ) + { + ssize_t len = size; + if ( len > IOSIZE ) len = IOSIZE; + + wrote = write( fd, buf, len ); + if( wrote != len ) SHOW_RESULT( write, wrote ); + + size -= wrote; + } + + err = close( fd ); + if( err < 0 ) SHOW_RESULT( close, err ); +} + +//========================================================================== + +#if 0 +static void maxfile( char *name ) +{ + char buf[IOSIZE]; + int fd; + ssize_t wrote; + int i; + int err; + size_t size = 0; + + diag_printf("<INFO>: create maximal file %s\n",name); + + err = access( name, F_OK ); + if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); + + for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; + + fd = open( name, O_WRONLY|O_CREAT ); + if( fd < 0 ) SHOW_RESULT( open, fd ); + + do + { + wrote = write( fd, buf, IOSIZE ); + if( wrote < 0 ) SHOW_RESULT( write, wrote ); + + size += wrote; + + } while( wrote == IOSIZE ); + + diag_printf("<INFO>: file size == %d\n",size); + + err = close( fd ); + if( err < 0 ) SHOW_RESULT( close, err ); +} +#endif + +//========================================================================== + +static void checkfile( char *name ) +{ + unsigned char buf[IOSIZE]; + int fd; + ssize_t done; + int i; + int err; + off_t pos = 0; + + diag_printf("<INFO>: check file %s\n",name); + + err = access( name, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + fd = open( name, O_RDONLY ); + if( fd < 0 ) SHOW_RESULT( open, fd ); + + for(;;) + { + done = read( fd, buf, IOSIZE ); + if( done < 0 ) SHOW_RESULT( read, done ); + + if( done == 0 ) break; + + for( i = 0; i < done; i++ ) + if( buf[i] != i%256 ) + { + diag_printf("buf[%d+%d](%02x) != %02x\n",pos,i,buf[i],i%256); + CYG_TEST_FAIL("Data read not equal to data written\n"); + } + + pos += done; + } + + err = close( fd ); + if( err < 0 ) SHOW_RESULT( close, err ); +} + +//========================================================================== + +static void copyfile( char *name2, char *name1 ) +{ + + int err; + char buf[IOSIZE]; + int fd1, fd2; + ssize_t done, wrote; + + diag_printf("<INFO>: copy file %s -> %s\n",name2,name1); + + err = access( name1, F_OK ); + if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); + + err = access( name2, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + fd1 = open( name1, O_WRONLY|O_CREAT ); + if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); + + fd2 = open( name2, O_RDONLY ); + if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); + + for(;;) + { + done = read( fd2, buf, IOSIZE ); + if( done < 0 ) SHOW_RESULT( read, done ); + + if( done == 0 ) break; + + wrote = write( fd1, buf, done ); + if( wrote != done ) SHOW_RESULT( write, wrote ); + + if( wrote != done ) break; + } + + err = close( fd1 ); + if( err < 0 ) SHOW_RESULT( close, err ); + + err = close( fd2 ); + if( err < 0 ) SHOW_RESULT( close, err ); + +} + +//========================================================================== + +static void comparefiles( char *name2, char *name1 ) +{ + int err; + char buf1[IOSIZE]; + char buf2[IOSIZE]; + int fd1, fd2; + ssize_t done1, done2; + int i; + + diag_printf("<INFO>: compare files %s == %s\n",name2,name1); + + err = access( name1, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + err = access( name1, F_OK ); + if( err != 0 ) SHOW_RESULT( access, err ); + + fd1 = open( name1, O_RDONLY ); + if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); + + fd2 = open( name2, O_RDONLY ); + if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); + + for(;;) + { + done1 = read( fd1, buf1, IOSIZE ); + if( done1 < 0 ) SHOW_RESULT( read, done1 ); + + done2 = read( fd2, buf2, IOSIZE ); + if( done2 < 0 ) SHOW_RESULT( read, done2 ); + + if( done1 != done2 ) + diag_printf("Files different sizes\n"); + + if( done1 == 0 ) break; + + for( i = 0; i < done1; i++ ) + if( buf1[i] != buf2[i] ) + { + diag_printf("buf1[%d](%02x) != buf1[%d](%02x)\n",i,buf1[i],i,buf2[i]); + CYG_TEST_FAIL("Data in files not equal\n"); + } + } + + err = close( fd1 ); + if( err < 0 ) SHOW_RESULT( close, err ); + + err = close( fd2 ); + if( err < 0 ) SHOW_RESULT( close, err ); + +} + +//========================================================================== + +void checkcwd( const char *cwd ) +{ + static char cwdbuf[PATH_MAX]; + char *ret; + + ret = getcwd( cwdbuf, sizeof(cwdbuf)); + if( ret == NULL ) SHOW_RESULT( getcwd, ret ); + + if( strcmp( cwdbuf, cwd ) != 0 ) + { + diag_printf( "cwdbuf %s cwd %s\n",cwdbuf, cwd ); + CYG_TEST_FAIL( "Current directory mismatch"); + } +} + +//========================================================================== +// main + +int main( int argc, char **argv ) +{ + int err; + //int i; + int existingdirents=-1; + + CYG_TEST_INIT(); + + // -------------------------------------------------------------- + + err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" ); + if( err < 0 ) SHOW_RESULT( mount, err ); + + err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/" ); + + listdir( "/", true, -1, &existingdirents ); + if ( existingdirents < 2 ) + CYG_TEST_FAIL("Not enough dir entries\n"); + + // -------------------------------------------------------------- + + createfile( "/foo", 202 ); + checkfile( "foo" ); + copyfile( "foo", "fee"); + checkfile( "fee" ); + comparefiles( "foo", "/fee" ); + diag_printf("<INFO>: mkdir bar\n"); + err = mkdir( "/bar", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + listdir( "/" , true, existingdirents+3, NULL ); + + copyfile( "fee", "/bar/fum" ); + checkfile( "bar/fum" ); + comparefiles( "/fee", "bar/fum" ); + + diag_printf("<INFO>: cd bar\n"); + err = chdir( "bar" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/bar" ); + + diag_printf("<INFO>: rename /foo bundy\n"); + err = rename( "/foo", "bundy" ); + if( err < 0 ) SHOW_RESULT( rename, err ); + + listdir( "/", true, existingdirents+2, NULL ); + listdir( "" , true, 4, NULL ); + + checkfile( "/bar/bundy" ); + comparefiles("/fee", "bundy" ); + + // -------------------------------------------------------------- + + createfile( LONGNAME1, 123 ); + checkfile( LONGNAME1 ); + copyfile( LONGNAME1, LONGNAME2 ); + + listdir( "", false, 6, NULL ); + + diag_printf("<INFO>: unlink " LONGNAME1 "\n"); + err = unlink( LONGNAME1 ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink " LONGNAME2 "\n"); + err = unlink( LONGNAME2 ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + + // -------------------------------------------------------------- + + diag_printf("<INFO>: unlink fee\n"); + err = unlink( "/fee" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink fum\n"); + err = unlink( "fum" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink /bar/bundy\n"); + err = unlink( "/bar/bundy" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: cd /\n"); + err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/" ); + + diag_printf("<INFO>: rmdir /bar\n"); + err = rmdir( "/bar" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + listdir( "/", false, existingdirents, NULL ); + + // -------------------------------------------------------------- + + diag_printf("<INFO>: mount /jffs2 \n"); + err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/jffs2", "jffs2" ); + if( err < 0 ) SHOW_RESULT( mount, err ); + + createfile( "/jffs2/tinky", 456 ); + copyfile( "/jffs2/tinky", "/jffs2/laalaa" ); + checkfile( "/jffs2/tinky"); + checkfile( "/jffs2/laalaa"); + comparefiles( "/jffs2/tinky", "/jffs2/laalaa" ); + + diag_printf("<INFO>: cd /jffs2\n"); + err = chdir( "/jffs2" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/jffs2" ); + + diag_printf("<INFO>: mkdir noonoo\n"); + err = mkdir( "noonoo", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + listdir( "." , true, existingdirents+3, NULL); + + diag_printf("<INFO>: cd noonoo\n"); + err = chdir( "noonoo" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + + checkcwd( "/jffs2/noonoo" ); + + createfile( "tinky", 678 ); + checkfile( "tinky" ); + + createfile( "dipsy", 3456 ); + checkfile( "dipsy" ); + copyfile( "dipsy", "po" ); + checkfile( "po" ); + comparefiles( "dipsy", "po" ); + + + /*for(i=0;i<2048;i++) { + diag_printf("<INFO>: churningchurningchurning................................ITERATION = %d\n", i); + createfile( "churningchurningchurning", 4096 ); + diag_printf("<INFO>: unlink churningchurningchurning\n"); + err = unlink( "churningchurningchurning" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + }*/ + + + listdir( ".", true, 5, NULL ); + listdir( "", true, 5, NULL ); + listdir( "..", true, existingdirents+3, NULL ); + + // -------------------------------------------------------------- + + diag_printf("<INFO>: unlink tinky\n"); + err = unlink( "tinky" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink dipsy\n"); + err = unlink( "dipsy" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink po\n"); + err = unlink( "po" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: cd ..\n"); + err = chdir( ".." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/jffs2" ); + + diag_printf("<INFO>: rmdir noonoo\n"); + err = rmdir( "noonoo" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + // -------------------------------------------------------------- + + err = mkdir( "x", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + err = mkdir( "x/y", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + err = mkdir( "x/y/z", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + err = mkdir( "x/y/z/w", 0 ); + if( err < 0 ) SHOW_RESULT( mkdir, err ); + + diag_printf("<INFO>: cd /jffs2/x/y/z/w\n"); + err = chdir( "/jffs2/x/y/z/w" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/jffs2/x/y/z/w" ); + + diag_printf("<INFO>: cd ..\n"); + err = chdir( ".." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/jffs2/x/y/z" ); + + diag_printf("<INFO>: cd .\n"); + err = chdir( "." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/jffs2/x/y/z" ); + + diag_printf("<INFO>: cd ../../y\n"); + err = chdir( "../../y" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/jffs2/x/y" ); + + diag_printf("<INFO>: cd ../..\n"); + err = chdir( "../.." ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/jffs2" ); + + diag_printf("<INFO>: rmdir x/y/z/w\n"); + err = rmdir( "x/y/z/w" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + diag_printf("<INFO>: rmdir x/y/z\n"); + err = rmdir( "x/y/z" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + diag_printf("<INFO>: rmdir x/y\n"); + err = rmdir( "x/y" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + diag_printf("<INFO>: rmdir x\n"); + err = rmdir( "x" ); + if( err < 0 ) SHOW_RESULT( rmdir, err ); + + // -------------------------------------------------------------- + + diag_printf("<INFO>: unlink tinky\n"); + err = unlink( "tinky" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: unlink laalaa\n"); + err = unlink( "laalaa" ); + if( err < 0 ) SHOW_RESULT( unlink, err ); + + diag_printf("<INFO>: cd /\n"); + err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); + checkcwd( "/" ); + + diag_printf("<INFO>: umount /jffs2\n"); + err = umount( "/jffs2" ); + if( err < 0 ) SHOW_RESULT( umount, err ); + + diag_printf("<INFO>: umount /\n"); + err = umount( "/" ); + if( err < 0 ) SHOW_RESULT( umount, err ); + + CYG_TEST_PASS_FINISH("jffs2_1"); +} + +// ------------------------------------------------------------------------- +// EOF jffs2_1.c
new file mode 100644 --- /dev/null +++ b/packages/fs/jffs2/current/tests/jffs2_2.c @@ -0,0 +1,242 @@ +//========================================================================== +// +// jffs2_2.c +// +// Test fseek on a filesystem +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2004 Andrew Lunn +// Copyright (C) 2004 eCosCentric Limited +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): asl +// Contributors: asl +// Date: 2004-03-29 +// Purpose: Test fseek on a filesystem +// Description: This test uses the ramfs to check out the fseek +// operation on a filesystem. +// +// +// +// +// +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> + +#include <cyg/fileio/fileio.h> +#include <cyg/io/flash.h> + +#include <cyg/infra/testcase.h> +#include <cyg/infra/diag.h> // HAL polled output +//========================================================================== + +#define SHOW_RESULT( _fn, _res ) \ +diag_printf("FAIL: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); + +//========================================================================== + +char buf[1024]; +char buf1[1024]; + +//========================================================================== +// main + +int main( int argc, char **argv ) +{ + int err; + FILE *stream; + long pos; + int i; + + CYG_TEST_INIT(); + + // -------------------------------------------------------------- + + CYG_TEST_INFO("mount /"); + err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" ); + + if( err < 0 ) SHOW_RESULT( mount, err ); + + CYG_TEST_INFO("creating /fseek"); + stream = fopen("/fseek","w+"); + if (!stream) { + diag_printf("FAIL: fopen() returned NULL, %s\n", strerror(errno)); + CYG_TEST_FINISH("done"); \ + } + + /* Write a buffer full of cyclic numbers */ + for (i = 0; i < sizeof(buf); i++) { + buf[i] = i % 256; + } + + CYG_TEST_INFO("writing test pattern"); + err=fwrite(buf,sizeof(buf), 1, stream); + if ( err < 0 ) SHOW_RESULT( fwrite, err ); + + /* The current position should be the same size as the buffer */ + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != sizeof(buf)) + diag_printf("<FAIL>: ftell is not telling the truth."); + + CYG_TEST_INFO("fseek()ing to beginning and writing"); + + /* Seek back to the beginning of the file */ + err = fseek(stream, 0, SEEK_SET); + if ( err < 0 ) SHOW_RESULT( fseek, err ); + + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != 0) CYG_TEST_FAIL("ftell is not telling the truth"); + + /* Write 4 zeros to the beginning of the file */ + for (i = 0; i < 4; i++) { + buf[i] = 0; + } + + err = fwrite(buf, 4, 1, stream); + if ( err < 0 ) SHOW_RESULT( fwrite, err ); + + /* Check the pointer is at 4 */ + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != 4) CYG_TEST_FAIL("ftell is not telling the truth"); + + CYG_TEST_INFO("closing file"); + + /* Close the file, open it up again and read it back */ + err = fclose(stream); + if (err != 0) SHOW_RESULT( fclose, err ); + + CYG_TEST_INFO("open file /fseek"); + stream = fopen("/fseek", "r+"); + if (!stream) { + diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); + } + + err = fread(buf1,sizeof(buf1),1, stream); + if (err != 1) SHOW_RESULT( fread, err ); + + CYG_TEST_INFO("Comparing contents"); + if (memcmp(buf, buf1, sizeof(buf1))) { + CYG_TEST_FAIL("File contents inconsistent"); + } + + CYG_TEST_INFO("closing file"); + + err = fclose(stream); + if (err != 0) SHOW_RESULT( fclose, err ); + + CYG_TEST_INFO("open file /fseek"); + stream = fopen("/fseek", "r+"); + if (!stream) { + diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); + } + + CYG_TEST_INFO("fseek()ing past the end to create a hole"); + /* Seek 1K after the end of the file */ + err = fseek(stream, sizeof(buf), SEEK_END); + if ( err < 0 ) SHOW_RESULT( fseek, err ); + + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != (2*sizeof(buf))) CYG_TEST_FAIL("ftell is not telling the truth"); + + CYG_TEST_INFO("writing test pattern"); + err=fwrite(buf,sizeof(buf), 1, stream); + if ( err < 0 ) SHOW_RESULT( fwrite, err ); + + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != (3*sizeof(buf))) CYG_TEST_FAIL("ftell is not telling the truth"); + + CYG_TEST_INFO("closing file"); + err = fclose(stream); + if (err != 0) SHOW_RESULT( fclose, err ); + + CYG_TEST_INFO("open file /fseek"); + stream = fopen("/fseek", "r+"); + if (!stream) { + diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); + } + + err = fread(buf1,sizeof(buf1),1, stream); + if (err != 1) SHOW_RESULT( fread, err ); + + CYG_TEST_INFO("Comparing contents"); + if (memcmp(buf, buf1, sizeof(buf1))) { + CYG_TEST_FAIL("File contents inconsistent"); + } + + err = fread(buf1,sizeof(buf1),1, stream); + if (err != 1) SHOW_RESULT( fread, err ); + + for (i = 0; i< sizeof(buf); i++) { + if (buf1[i] != 0) + CYG_TEST_FAIL("Hole does not contain zeros"); + } + + err = fread(buf1,sizeof(buf1),1, stream); + if (err != 1) SHOW_RESULT( fread, err ); + + if (memcmp(buf, buf1, sizeof(buf1))) { + CYG_TEST_FAIL("File contents inconsistent"); + } + + CYG_TEST_INFO("closing file"); + + /* Close the file */ + err = fclose(stream); + if (err != 0) SHOW_RESULT( fclose, err ); + + CYG_TEST_INFO("umount /"); + err = umount( "/" ); + if( err < 0 ) SHOW_RESULT( umount, err ); + + CYG_TEST_PASS_FINISH("jffs2_2"); +}
--- a/packages/fs/ram/current/ChangeLog +++ b/packages/fs/ram/current/ChangeLog @@ -2,7 +2,8 @@ 2004-12-13 John Dallaway <jld@ecoscent * tests/fileio1.c: Rename to ramfs1.c. eCos test names should be unique. - * cdl/ramfs.cdl: Build the ramfs1 test. + * tests/fseek1.c: Rename to ramfs2.c: + * cdl/ramfs.cdl: Build the renamed tests. 2004-03-29 Andrew Lunn <andrew.lunn@ascom.ch>
--- a/packages/fs/ram/current/cdl/ramfs.cdl +++ b/packages/fs/ram/current/cdl/ramfs.cdl @@ -183,7 +183,7 @@ cdl_package CYGPKG_FS_RAM { display "RAM FS tests" flavor data no_define - calculated { "tests/ramfs1.c tests/fseek1.c" } + calculated { "tests/ramfs1 tests/ramfs2" } description " This option specifies the set of tests for the RAM FS package." }
deleted file mode 100644 --- a/packages/fs/ram/current/tests/fseek1.c +++ /dev/null @@ -1,173 +0,0 @@ -//========================================================================== -// -// fseek1.c -// -// Test fseek on a filesystem -// -//========================================================================== -//####ECOSGPLCOPYRIGHTBEGIN#### -// ------------------------------------------- -// This file is part of eCos, the Embedded Configurable Operating System. -// Copyright (C) 2004 Andrew Lunn -// -// eCos is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 or (at your option) any later version. -// -// eCos is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with eCos; if not, write to the Free Software Foundation, Inc., -// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -// -// As a special exception, if other files instantiate templates or use macros -// or inline functions from this file, or you compile this file and link it -// with other works to produce a work based on this file, this file does not -// by itself cause the resulting work to be covered by the GNU General Public -// License. However the source code for this file must still be made available -// in accordance with section (3) of the GNU General Public License. -// -// This exception does not invalidate any other reasons why a work based on -// this file might be covered by the GNU General Public License. -// -// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. -// at http://sources.redhat.com/ecos/ecos-license/ -// ------------------------------------------- -//####ECOSGPLCOPYRIGHTEND#### -//========================================================================== -//#####DESCRIPTIONBEGIN#### -// -// Author(s): asl -// Contributors: asl -// Date: 2004-03-29 -// Purpose: Test fseek on a filesystem -// Description: This test uses the ramfs to check out the fseek -// operation on a filesystem. -// -// -// -// -// -// -// -//####DESCRIPTIONEND#### -// -//========================================================================== -#include <stdio.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> - -#include <cyg/fileio/fileio.h> - -#include <cyg/infra/testcase.h> -#include <cyg/infra/diag.h> // HAL polled output -//========================================================================== - -#define SHOW_RESULT( _fn, _res ) \ -diag_printf("FAIL: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); - -//========================================================================== - -char buf[1024]; -char buf1[1024]; - -//========================================================================== -// main - -int main( int argc, char **argv ) -{ - int err; - FILE *stream; - long pos; - int i; - - CYG_TEST_INIT(); - - // -------------------------------------------------------------- - - CYG_TEST_INFO("mount /"); - err = mount( "", "/", "ramfs" ); - if( err < 0 ) SHOW_RESULT( mount, err ); - - CYG_TEST_INFO("creating /fseek"); - stream = fopen("/fseek","w+"); - if (!stream) { - diag_printf("FAIL: fopen() returned NULL, %s\n", strerror(errno)); - CYG_TEST_FINISH("done"); \ - } - - /* Write a buffer full of cyclic numbers */ - for (i = 0; i < sizeof(buf); i++) { - buf[i] = i % 256; - } - - CYG_TEST_INFO("writing test pattern"); - err=fwrite(buf,sizeof(buf), 1, stream); - if ( err < 0 ) SHOW_RESULT( fwrite, err ); - - /* The current position should be the same size as the buffer */ - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != sizeof(buf)) - diag_printf("<FAIL>: ftell is not telling the truth."); - - CYG_TEST_INFO("fseek()ing to beginning and writing"); - - /* Seek back to the beginning of the file */ - err = fseek(stream, 0, SEEK_SET); - if ( err < 0 ) SHOW_RESULT( fwrite, err ); - - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != 0) CYG_TEST_FAIL("ftell is not telling the truth"); - - /* Write 4 zeros to the beginning of the file */ - for (i = 0; i < 4; i++) { - buf[i] = 0; - } - - err = fwrite(buf, 4, 1, stream); - if ( err < 0 ) SHOW_RESULT( fwrite, err ); - - /* Check the pointer is at 4 */ - pos = ftell(stream); - - if (pos < 0) SHOW_RESULT( ftell, pos ); - if (pos != 4) CYG_TEST_FAIL("ftell is not telling the truth"); - - CYG_TEST_INFO("closing file"); - - /* Close the file, open it up again and read it back */ - err = fclose(stream); - if (err != 0) SHOW_RESULT( fclose, err ); - - CYG_TEST_INFO("open file /fseek"); - stream = fopen("/fseek", "r+"); - if (!stream) { - diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); - } - - err = fread(buf1,sizeof(buf1),1, stream); - if (err != 1) SHOW_RESULT( fread, err ); - - CYG_TEST_INFO("Comparing contents"); - if (memcmp(buf, buf1, sizeof(buf1))) { - CYG_TEST_FAIL("File contents inconsistent"); - } - - err = fclose(stream); - if (err != 0) SHOW_RESULT( fclose, err ); - - CYG_TEST_INFO("umount /"); - err = umount( "/" ); - if( err < 0 ) SHOW_RESULT( umount, err ); - - CYG_TEST_PASS_FINISH("fseek1"); -}
new file mode 100644 --- /dev/null +++ b/packages/fs/ram/current/tests/ramfs2.c @@ -0,0 +1,174 @@ +//========================================================================== +// +// ramfs2.c +// +// Test fseek on a filesystem +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2004 Andrew Lunn +// Copyright (C) 2004 eCosCentric Limited +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): asl +// Contributors: asl +// Date: 2004-03-29 +// Purpose: Test fseek on a filesystem +// Description: This test uses the ramfs to check out the fseek +// operation on a filesystem. +// +// +// +// +// +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> + +#include <cyg/fileio/fileio.h> + +#include <cyg/infra/testcase.h> +#include <cyg/infra/diag.h> // HAL polled output +//========================================================================== + +#define SHOW_RESULT( _fn, _res ) \ +diag_printf("FAIL: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); + +//========================================================================== + +char buf[1024]; +char buf1[1024]; + +//========================================================================== +// main + +int main( int argc, char **argv ) +{ + int err; + FILE *stream; + long pos; + int i; + + CYG_TEST_INIT(); + + // -------------------------------------------------------------- + + CYG_TEST_INFO("mount /"); + err = mount( "", "/", "ramfs" ); + if( err < 0 ) SHOW_RESULT( mount, err ); + + CYG_TEST_INFO("creating /fseek"); + stream = fopen("/fseek","w+"); + if (!stream) { + diag_printf("FAIL: fopen() returned NULL, %s\n", strerror(errno)); + CYG_TEST_FINISH("done"); \ + } + + /* Write a buffer full of cyclic numbers */ + for (i = 0; i < sizeof(buf); i++) { + buf[i] = i % 256; + } + + CYG_TEST_INFO("writing test pattern"); + err=fwrite(buf,sizeof(buf), 1, stream); + if ( err < 0 ) SHOW_RESULT( fwrite, err ); + + /* The current position should be the same size as the buffer */ + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != sizeof(buf)) + diag_printf("<FAIL>: ftell is not telling the truth."); + + CYG_TEST_INFO("fseek()ing to beginning and writing"); + + /* Seek back to the beginning of the file */ + err = fseek(stream, 0, SEEK_SET); + if ( err < 0 ) SHOW_RESULT( fwrite, err ); + + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != 0) CYG_TEST_FAIL("ftell is not telling the truth"); + + /* Write 4 zeros to the beginning of the file */ + for (i = 0; i < 4; i++) { + buf[i] = 0; + } + + err = fwrite(buf, 4, 1, stream); + if ( err < 0 ) SHOW_RESULT( fwrite, err ); + + /* Check the pointer is at 4 */ + pos = ftell(stream); + + if (pos < 0) SHOW_RESULT( ftell, pos ); + if (pos != 4) CYG_TEST_FAIL("ftell is not telling the truth"); + + CYG_TEST_INFO("closing file"); + + /* Close the file, open it up again and read it back */ + err = fclose(stream); + if (err != 0) SHOW_RESULT( fclose, err ); + + CYG_TEST_INFO("open file /fseek"); + stream = fopen("/fseek", "r+"); + if (!stream) { + diag_printf("<FAIL>: fopen() returned NULL, %s\n", strerror(errno)); + } + + err = fread(buf1,sizeof(buf1),1, stream); + if (err != 1) SHOW_RESULT( fread, err ); + + CYG_TEST_INFO("Comparing contents"); + if (memcmp(buf, buf1, sizeof(buf1))) { + CYG_TEST_FAIL("File contents inconsistent"); + } + + err = fclose(stream); + if (err != 0) SHOW_RESULT( fclose, err ); + + CYG_TEST_INFO("umount /"); + err = umount( "/" ); + if( err < 0 ) SHOW_RESULT( umount, err ); + + CYG_TEST_PASS_FINISH("ramfs2"); +}
