Mercurial > ecos
changeset 1559:c72a9120513b
* test/fseek1.c: Test the fseek/ftell functions
* cdl/ramfs.cdl: Added a fseek1 test to the build
| author | asl |
|---|---|
| date | Mon, 29 Mar 2004 13:01:33 +0000 |
| parents | 374f08d35ab1 |
| children | 9a0206637430 |
| files | packages/fs/ram/current/ChangeLog packages/fs/ram/current/cdl/ramfs.cdl packages/fs/ram/current/tests/fseek1.c |
| diffstat | 3 files changed, 179 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/fs/ram/current/ChangeLog +++ b/packages/fs/ram/current/ChangeLog @@ -1,3 +1,8 @@ +2004-03-29 Andrew Lunn <andrew.lunn@ascom.ch> + + * test/fseek1.c: Test the fseek/ftell functions + * cdl/ramfs.cdl: Added a fseek1 test to the build + 2004-03-15 Sebastien Couret <sebastien.couret@elios-informatique.fr> * src/ramfs.c (block_init): Fixed compiler warning.
--- a/packages/fs/ram/current/cdl/ramfs.cdl +++ b/packages/fs/ram/current/cdl/ramfs.cdl @@ -182,7 +182,7 @@ cdl_package CYGPKG_FS_RAM { display "RAM FS tests" flavor data no_define - calculated { "tests/fileio1.c" } + calculated { "tests/fileio1.c tests/fseek1.c" } description " This option specifies the set of tests for the RAM FS package." }
new file mode 100644 --- /dev/null +++ b/packages/fs/ram/current/tests/fseek1.c @@ -0,0 +1,173 @@ +//========================================================================== +// +// 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"); +}
