* sim/cris/c/seek3.c, sim/cris/c/seek4.c: New tests.
authorHans-Peter Nilsson <hp@axis.com>
Wed, 6 Oct 2010 23:41:20 +0000 (23:41 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Wed, 6 Oct 2010 23:41:20 +0000 (23:41 +0000)
sim/testsuite/ChangeLog
sim/testsuite/sim/cris/c/seek3.c [new file with mode: 0644]
sim/testsuite/sim/cris/c/seek4.c [new file with mode: 0644]

index 36e3addd5536f4e475b98b85bc0321c36d7c911a..9a94cc5c2a59deddb07118f1d8e8d84fa82fd0be 100644 (file)
@@ -1,3 +1,7 @@
+2010-10-07  Hans-Peter Nilsson  <hp@axis.com>
+
+       * sim/cris/c/seek3.c, sim/cris/c/seek4.c: New tests.
+
 2010-08-24  Hans-Peter Nilsson  <hp@axis.com>
 
        * sim/cris/asm/nonvcv32.ms: Neutralize changed &&-in-macro gas syntax.
diff --git a/sim/testsuite/sim/cris/c/seek3.c b/sim/testsuite/sim/cris/c/seek3.c
new file mode 100644 (file)
index 0000000..5e7b578
--- /dev/null
@@ -0,0 +1,49 @@
+/* Check for a sim bug, whereby the position was always unsigned
+   (truncation instead of sign-extension for 64-bit hosts).  */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main (void)
+{
+  FILE *f;
+  const char fname[] = "sk1test.dat";
+  const char tsttxt[]
+    = "A random line of text, used to test correct read, write and seek.\n";
+  char buf[sizeof tsttxt] = "";
+  const char correct[] = "correct";
+  char buf2[sizeof correct] = {0};
+  int fd;
+
+  f = fopen (fname, "wb");
+  if (f == NULL
+      || fwrite (tsttxt, 1, strlen (tsttxt), f) != strlen (tsttxt)
+      || fclose (f) != 0)
+    {
+      printf ("fail\n");
+      exit (1);
+    }
+
+  /* We have to use file-descriptor calls instead of stream calls to
+     provoke the bug (for stream calls, the lseek call is canonicalized
+     to use SEEK_SET).  */
+  fd = open (fname, O_RDONLY);
+  if (fd < 0
+      || read (fd, buf, strlen (tsttxt)) != strlen (tsttxt)
+      || strcmp (buf, tsttxt) != 0
+      || lseek (fd, -30L, SEEK_CUR) != 36
+      || read (fd, buf2, strlen (correct)) != strlen (correct)
+      || strcmp (buf2, correct) != 0)
+    {
+      printf ("fail\n");
+      exit (1);
+    }
+
+  printf ("pass\n");
+  exit (0);
+}
diff --git a/sim/testsuite/sim/cris/c/seek4.c b/sim/testsuite/sim/cris/c/seek4.c
new file mode 100644 (file)
index 0000000..16f3bb0
--- /dev/null
@@ -0,0 +1,44 @@
+/* Check for a sim bug, whereby an invalid seek (to a negative offset)
+   did not return an error.  */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main (void)
+{
+  FILE *f;
+  const char fname[] = "sk1test.dat";
+  const char tsttxt[]
+    = "A random line of text, used to test correct read, write and seek.\n";
+  char buf[sizeof tsttxt] = "";
+  int fd;
+
+  f = fopen (fname, "wb");
+  if (f == NULL
+      || fwrite (tsttxt, 1, strlen (tsttxt), f) != strlen (tsttxt)
+      || fclose (f) != 0)
+    {
+      printf ("fail\n");
+      exit (1);
+    }
+
+  fd = open (fname, O_RDONLY);
+  if (fd < 0
+      || lseek (fd, -1L, SEEK_CUR) != -1
+      || errno != EINVAL
+      || read (fd, buf, strlen (tsttxt)) != strlen (tsttxt)
+      || strcmp (buf, tsttxt) != 0)
+    {
+      printf ("fail\n");
+      exit (1);
+    }
+
+  printf ("pass\n");
+  exit (0);
+}