summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-02-17 12:57:27 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-02-20 09:11:40 +0100
commit4ddeb343a14dfdc0d05577aae78bdc476e60d666 (patch)
treeceb7ea39a95ab05a45c4504e673cd215fda3a206
parentfstests/fsrdwr: Fix warning (diff)
downloadrtems-4ddeb343a14dfdc0d05577aae78bdc476e60d666.tar.bz2
fstests/fsrdwr: Add test case
-rw-r--r--testsuites/fstests/fsrdwr/init.c57
-rw-r--r--testsuites/fstests/imfs_fsrdwr/imfs_fsrdwr.scn2
-rw-r--r--testsuites/fstests/mimfs_fsrdwr/mimfs_fsrdwr.scn1
3 files changed, 59 insertions, 1 deletions
diff --git a/testsuites/fstests/fsrdwr/init.c b/testsuites/fstests/fsrdwr/init.c
index 9821cffe19..e8576b4b7a 100644
--- a/testsuites/fstests/fsrdwr/init.c
+++ b/testsuites/fstests/fsrdwr/init.c
@@ -20,6 +20,7 @@
#include <stdint.h>
#include <memory.h>
#include <unistd.h>
+#include <errno.h>
#include "fstest.h"
#include "pmacros.h"
@@ -748,6 +749,61 @@ block_read_and_write (void)
test_case_leave ();
}
+static void
+write_until_no_space_is_left (void)
+{
+ static const char file [] = "zero";
+ int fd;
+ struct stat st;
+ int status;
+ blksize_t block_size;
+ char *out;
+ ssize_t chunk_size;
+ ssize_t written;
+ off_t total;
+
+ /* Use the root directory to account for some FAT12 or FAT16 specialities */
+ printf ("test case: %s\n", __func__);
+
+ fd = open (file, O_RDWR | O_CREAT | O_TRUNC, mode);
+ rtems_test_assert (fd >= 0);
+
+ status = fstat (fd, &st);
+ rtems_test_assert (status == 0);
+ rtems_test_assert (st.st_size == 0);
+ rtems_test_assert (st.st_blksize > 0);
+ block_size = st.st_blksize;
+
+ out = calloc (1, block_size);
+ rtems_test_assert (out != NULL);
+
+ total = 0;
+ chunk_size = block_size / 2;
+ do {
+ errno = 0;
+
+ written = write (fd, out, chunk_size);
+ if (written > 0) {
+ total += written;
+ }
+
+ chunk_size = block_size;
+ } while (written > 0);
+
+ rtems_test_assert (written == -1);
+ rtems_test_assert (errno == ENOSPC || errno == EFBIG);
+
+ status = close (fd);
+ rtems_test_assert (status == 0);
+
+ /* Do not use fstat() to do the path evaluation again */
+ status = lstat (file, &st);
+ rtems_test_assert (status == 0);
+ rtems_test_assert (st.st_size == total);
+
+ free (out);
+}
+
void
test (void)
{
@@ -756,4 +812,5 @@ test (void)
truncate_test03 ();
truncate_to_zero ();
block_read_and_write ();
+ write_until_no_space_is_left ();
}
diff --git a/testsuites/fstests/imfs_fsrdwr/imfs_fsrdwr.scn b/testsuites/fstests/imfs_fsrdwr/imfs_fsrdwr.scn
index d0bef8e204..bc50588f0c 100644
--- a/testsuites/fstests/imfs_fsrdwr/imfs_fsrdwr.scn
+++ b/testsuites/fstests/imfs_fsrdwr/imfs_fsrdwr.scn
@@ -15,8 +15,8 @@ test case: block_rw_case_1
test case: block_rw_case_2
test case: block_rw_case_3
test case: block_rw_case_4
+test case: write_until_no_space_is_left
Shutting down filesystem IMFS
*** END OF FILE SYSTEM TEST ( IMFS ) ***
-
diff --git a/testsuites/fstests/mimfs_fsrdwr/mimfs_fsrdwr.scn b/testsuites/fstests/mimfs_fsrdwr/mimfs_fsrdwr.scn
index 37ea03cfa6..2ba20b7964 100644
--- a/testsuites/fstests/mimfs_fsrdwr/mimfs_fsrdwr.scn
+++ b/testsuites/fstests/mimfs_fsrdwr/mimfs_fsrdwr.scn
@@ -15,6 +15,7 @@ test case: block_rw_case_1
test case: block_rw_case_2
test case: block_rw_case_3
test case: block_rw_case_4
+test case: write_until_no_space_is_left
Shutting down filesystem MOUNTED IMFS