pdf-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pdf-devel] Patch for FS#98, file-based stm tests


From: gerel
Subject: [pdf-devel] Patch for FS#98, file-based stm tests
Date: Fri, 15 May 2009 16:46:58 -0300

Here is a patch for the tests plus minor fixes on the Fsys API.

BTW, there is no function in the Fsys API for removing a file yet. 

##
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# target_branch: file:///home/gerel/PROJECTS/libgnupdf/trunk/
# testament_sha1: 7e944c5db18b74aed7f7819e622262e7589762bc
# timestamp: 2009-05-15 16:37:50 -0300
# base_revision_id: address@hidden
# 
# Begin patch
=== modified file 'ChangeLog'
--- ChangeLog   2009-05-15 13:31:34 +0000
+++ ChangeLog   2009-05-15 18:05:38 +0000
@@ -1,3 +1,17 @@
+2009-05-15  Gerardo E. Gidoni  <address@hidden>
+
+       * doc/gnupdf.texi: changed pdf_fsys_file_read/write to be like 
pdf_stm_read/write.
+
+       * src/base/pdf-fsys-disk.c: likewise.
+
+       * src/base/pdf-fsys-disk.h:likewise.
+
+       * src/base/pdf-fsys.c:likewise.
+
+       * src/base/pdf-fsys.h: likewise.
+
+       * src/base/pdf-stm-be.c: likewise.
+
 2009-05-15  Jose E. Marchesi  <address@hidden>
 
        * doc/gnupdf-hg.texi (Tasks workflow): Added a note about the
@@ -7,6 +21,26 @@
 
        * doc/Makefile.am: Support for generation of manuals using the
        gendocs.sh script from gnulib.
+       
+2009-05-14  Gerardo E. Gidoni  <address@hidden>
+
+       * torture/unit/Makefile.am: added file stm new test case.
+
+       * torture/unit/base/stm/pdf-stm-file-new.c: likewise.
+
+       * torture/unit/base/stm/pdf-stm-peek-char.c: added file stm tests.
+
+       * torture/unit/base/stm/pdf-stm-read-char.c: likewise.
+
+       * torture/unit/base/stm/pdf-stm-read.c: likewise.
+
+       * torture/unit/base/stm/pdf-stm-seek.c: likewise.
+
+       * torture/unit/base/stm/pdf-stm-tell.c: likewise.
+
+       * torture/unit/base/stm/pdf-stm-write.c: likewise.
+
+       * torture/unit/base/stm/tsuite-stm.c: likewise.
 
 2009-05-11  David Vazquez  <address@hidden>
 

=== modified file 'doc/gnupdf.texi'
--- doc/gnupdf.texi     2009-05-13 11:33:35 +0000
+++ doc/gnupdf.texi     2009-05-15 17:55:40 +0000
@@ -9145,7 +9145,8 @@
 The following functions provides synchronous input/output for open
 files.
 
address@hidden pdf_size_t pdf_fsys_file_read (pdf_fsys_file_t @var{file}, const 
pdf_size_t @var{elem_size}, const pdf_size_t @var{elem_count}, void 
address@hidden)
+
address@hidden pdf_status_t pdf_fsys_file_read (pdf_fsys_file_t @var{file}, 
pdf_char_t address@hidden, pdf_size_t @var{bytes}, pdf_size_t address@hidden)
 
 Synchronously read data from an open file item.
 
@@ -9153,17 +9154,26 @@
 @item Parameters
 @table @var
 @item file
-An open file variable.
address@hidden elem_size
-The size of the data chunks to read from the file.
address@hidden elem_count
-The number of data chunks to read from the file.
address@hidden data
-A pointer to memory used to store the readed elements.
+An open file.
address@hidden buf
+The buffer to hold the read data.
address@hidden bytes
+The number of octects to read.
address@hidden read_bytes
+The number of octects actually read.
 @end table
 @item Returns
-A PDF size value indicating the number of readed octects or @code{0} if there
-was an error.
+A PDF status value:
address@hidden @code
address@hidden PDF_OK
+All the requested bytes were successfully read into @var{buf}.
address@hidden PDF_EBADDATA
+The file element or a given pointer is invalid.
address@hidden PDF_EEOF
+An end of file condition occurred.
address@hidden PDF_ERROR
+An error prevented to read the bytes.
address@hidden table
 @item Usage example
 @example
 XXX
@@ -9171,7 +9181,8 @@
 @end table
 @end deftypefun
 
address@hidden pdf_size_t pdf_fsys_file_write (pdf_fsys_file_t @var{file}, 
const pdf_size_t @var{elem_size}, const pdf_size_t @var{elem_count}, void 
address@hidden)
+
address@hidden pdf_status_t pdf_fsys_file_write (pdf_fsys_file_t @var{file}, 
pdf_char_t address@hidden, pdf_size_t @var{bytes}, pdf_size_t address@hidden)
 
 Synchronously write data to an open file item.
 
@@ -9179,17 +9190,26 @@
 @item Parameters
 @table @var
 @item file
-An open file variable.
address@hidden elem_size
-The size of the data chunks to write into the file.
address@hidden elem_count
-The number of data chunks to be write into the file.
address@hidden data
+An open file.
address@hidden buf
 A pointer to memory containing the data to write into the file.
address@hidden bytes
+The number of octects to write.
address@hidden written_bytes
+The number of octects actually written.
 @end table
 @item Returns
-A PDF size value indicating the number of octects written into the
-file or @code{0} if there was an error.
+A PDF status value:
address@hidden @code
address@hidden PDF_OK
+All the requested bytes were successfully written to @var{file}.
address@hidden PDF_EBADDATA
+The file element or a given pointer is invalid.
address@hidden PDF_ENOMEM
+A disk full condition ocurred.
address@hidden PDF_ERROR
+An error prevented to write the bytes.
address@hidden table
 @item Usage example
 @example
 XXX
@@ -9197,6 +9217,7 @@
 @end table
 @end deftypefun
 
+
 @deftypefun pdf_status_t pdf_fsys_file_flush (pdf_fsys_file_t @var{file})
 
 Flush all the written data for the specified file.
@@ -9478,7 +9499,8 @@
 The following callbacks are defined to provide synchronous
 input/output in open files.
 
address@hidden {Data Type} {pdf_size_t (*pdf_fsys_file_read_fn_t) 
(pdf_fsys_file_t @var{file}, pdf_size_t @var{elem_size}, pdf_size_t 
@var{elem_count}, void address@hidden)}
+
address@hidden {Data Type} {pdf_status_t (*pdf_fsys_file_read_fn_t) 
(pdf_fsys_file_t @var{file}, address@hidden, pdf_size_t @var{bytes}, 
address@hidden)}
 
 Filesystem callback used to synchronously read data from an open file
 item.
@@ -9487,8 +9509,7 @@
 interface function.
 @end deftp
 
address@hidden {Data Type} {pdf_size_t (*pdf_fsys_file_write_fn_t) 
(pdf_fsys_file_t @var{file}, pdf_size_t @var{elem_size}, pdf_size_t 
@var{elem_count}, void address@hidden)}
-
address@hidden {Data Type} {pdf_status_t (*pdf_fsys_file_write_fn_t) 
(pdf_fsys_file_t @var{file}, address@hidden, pdf_size_t @var{bytes}, 
address@hidden)}
 Filesystem callback used to synchronously write data to an open file
 item.
 

=== modified file 'src/base/pdf-fsys-disk.c'
--- src/base/pdf-fsys-disk.c    2009-05-03 17:18:39 +0000
+++ src/base/pdf-fsys-disk.c    2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2009-05-03 19:03:49 aleksander"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:07:46 gerel"
  *
  *       File:         pdf-fsys-disk.c
  *       Date:         Thu May 22 18:27:35 2008
@@ -1017,17 +1017,14 @@
   return PDF_OK;
 }
 
-pdf_size_t
-pdf_fsys_disk_file_read (pdf_fsys_file_t file,
-                         const pdf_size_t elem_size,
-                         const pdf_size_t elem_count,
-                         void *data)
+
+pdf_status_t
+pdf_fsys_disk_file_read (pdf_fsys_file_t file, pdf_char_t *buf,
+                         pdf_size_t bytes, pdf_size_t *read_bytes)
 {
-  pdf_size_t read_bytes = 0;
+  pdf_status_t ret = PDF_EBADDATA;
   if((file != NULL) &&                          \
-     (data != NULL) &&                          \
-     (elem_size > 0) &&                         \
-     (elem_count > 0))
+     (buf != NULL))
     {
       pdf_fsys_disk_file_t file_data = NULL;
       file_data = (pdf_fsys_disk_file_t)(file->data);
@@ -1039,31 +1036,40 @@
         }
       else
         {
-          read_bytes = fread(data,
-                             (size_t)elem_size,
-                             (size_t)elem_count,
-                             file_data->file_descriptor);
+          *read_bytes = fread(buf,
+                              1,
+                              bytes,
+                              file_data->file_descriptor);
+          if (feof(file_data->file_descriptor))
+            {
+              ret = PDF_EEOF;
+            }
+          else if (ferror(file_data->file_descriptor))
+            {
+              ret = PDF_ERROR;
+            }
+          else
+            {
+              ret = PDF_OK;
+            }
         }
     }
   else
     {
-      PDF_DEBUG_BASE("Invalid inputs to file_read! (file:%p, data:%p, size:%u, 
count: %u)",
-                     file,data,elem_size,elem_count);
+      PDF_DEBUG_BASE("Invalid inputs to file_read! (file:%p, buf:%p, size:%u)",
+                     file,buf,bytes);
     }
-  return read_bytes;
+  return ret;
 }
 
-pdf_size_t
-pdf_fsys_disk_file_write (pdf_fsys_file_t file,
-                          const pdf_size_t elem_size,
-                          const pdf_size_t elem_count,
-                          void *data)
+
+pdf_status_t
+pdf_fsys_disk_file_write (pdf_fsys_file_t file, pdf_char_t *buf,
+                          pdf_size_t bytes, pdf_size_t *written_bytes)
 {
-  pdf_size_t written_bytes = 0;
+  pdf_status_t ret = PDF_EBADDATA;
   if((file != NULL) && \
-     (data != NULL) && \
-     (elem_size > 0) && \
-     (elem_count > 0))
+     (buf != NULL))
     {
       pdf_fsys_disk_file_t file_data = NULL;
       file_data = (pdf_fsys_disk_file_t)(file->data);
@@ -1075,18 +1081,34 @@
         }
       else
         {
-          written_bytes = fwrite(data,
-                                 (size_t)elem_size,
-                                 (size_t)elem_count,
-                                 file_data->file_descriptor);
+          *written_bytes = fwrite(buf,
+                                  1,
+                                  bytes,
+                                  file_data->file_descriptor);
+          if (ferror(file_data->file_descriptor))
+            {
+              if (errno == ENOSPC)
+                {
+                  ret = PDF_ENOMEM;
+                }
+              else
+                {
+                  ret = PDF_ERROR;
+                }
+            }
+          else
+            {
+              ret = PDF_OK;
+            }
         }
     }
   else
     {
-      PDF_DEBUG_BASE("Invalid inputs to file_read! (file:%p, data:%p, size:%u, 
count: %u)",
-                     file,data,elem_size,elem_count);
+      PDF_DEBUG_BASE("Invalid inputs to file_write! (file:%p, buf:%p, 
size:%u)",
+                     file,buf,bytes);
     }
-  return written_bytes;
+  return ret;
+
 }
 
 

=== modified file 'src/base/pdf-fsys-disk.h'
--- src/base/pdf-fsys-disk.h    2008-12-22 21:25:09 +0000
+++ src/base/pdf-fsys-disk.h    2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-11-29 17:42:34 aleksander"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 12:18:32 gerel"
  *
  *       File:         pdf-fsys-disk.h
  *       Date:         Thu May 22 18:22:59 2008
@@ -135,15 +135,13 @@
 pdf_status_t pdf_fsys_disk_file_set_size (pdf_fsys_file_t file,
                                           pdf_size_t size);
 
-pdf_size_t pdf_fsys_disk_file_read (pdf_fsys_file_t file,
-                                    const pdf_size_t elem_size,
-                                    const pdf_size_t elem_count,
-                                    void *data);
+pdf_status_t
+pdf_fsys_disk_file_write (pdf_fsys_file_t file, pdf_char_t *buf,
+                          pdf_size_t bytes, pdf_size_t *written_bytes);
 
-pdf_size_t pdf_fsys_disk_file_write (pdf_fsys_file_t file,
-                                     const pdf_size_t elem_size,
-                                     const pdf_size_t elem_count,
-                                     void *data);
+pdf_status_t
+pdf_fsys_disk_file_read (pdf_fsys_file_t file, pdf_char_t *buf,
+                         pdf_size_t bytes, pdf_size_t *read_bytes);
 
 pdf_status_t pdf_fsys_disk_file_flush (pdf_fsys_file_t file);
 

=== modified file 'src/base/pdf-fsys.c'
--- src/base/pdf-fsys.c 2008-12-31 18:34:04 +0000
+++ src/base/pdf-fsys.c 2009-05-15 17:55:40 +0000
@@ -1,5 +1,5 @@
 
-/* -*- mode: C -*- Time-stamp: "2008-12-31 19:31:45 aleksander"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 12:36:35 gerel"
  *
  *       File:         pdf-fsys.c
  *       Date:         Thu May 22 15:51:13 2008
@@ -506,51 +506,48 @@
     }
 }
 
-pdf_size_t 
-pdf_fsys_file_read (pdf_fsys_file_t file,
-                    const pdf_size_t elem_size,
-                    const pdf_size_t elem_count,
-                    void *data)
+
+pdf_status_t
+pdf_fsys_file_read (pdf_fsys_file_t file, pdf_char_t *buf,
+                    pdf_size_t bytes, pdf_size_t *read_bytes)
 {
   if(file == NULL)
-    return 0;
+    return PDF_EBADDATA;
 
   if (file->fs == NULL)
     {
       /* Use the default filesystem */
-      return pdf_fsys_def_file_read(file, elem_size, elem_count, data);
+      return pdf_fsys_def_file_read(file, buf, bytes, read_bytes);
     }
   else
     {
       return
         (file->fs->implementation->file_read_fn) (file,
-                                                  elem_size,
-                                                  elem_count,
-                                                  data);
+                                                  buf,
+                                                  bytes,
+                                                  read_bytes);
     }
 }
 
-pdf_size_t
-pdf_fsys_file_write (pdf_fsys_file_t file,
-                     const pdf_size_t elem_size,
-                     const pdf_size_t elem_count,
-                     void *data)
+pdf_status_t
+pdf_fsys_file_write (pdf_fsys_file_t file, pdf_char_t *buf,
+                     pdf_size_t bytes, pdf_size_t *written_bytes)
 {
   if(file == NULL)
-    return 0;
+    return PDF_EBADDATA;
 
   if (file->fs == NULL)
     {
       /* Use the default filesystem */
-      return pdf_fsys_def_file_write(file, elem_size, elem_count, data);
+      return pdf_fsys_def_file_write(file, buf, bytes, written_bytes);
     }
   else
     {
       return
         (file->fs->implementation->file_write_fn) (file,
-                                                   elem_size,
-                                                   elem_count,
-                                                   data);
+                                                   buf,
+                                                   bytes,
+                                                   written_bytes);
     }
 }
 

=== modified file 'src/base/pdf-fsys.h'
--- src/base/pdf-fsys.h 2008-12-22 21:25:09 +0000
+++ src/base/pdf-fsys.h 2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-11-29 17:48:43 aleksander"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 12:13:58 gerel"
  *
  *       File:         pdf-fsys.h
  *       Date:         Thu May 22 15:49:59 2008
@@ -103,14 +103,15 @@
 typedef pdf_status_t (*pdf_fsys_get_parent_fn_t) (pdf_text_t path_name,
                                                   pdf_text_t parent_path);
 typedef pdf_status_t (*pdf_fsys_remove_folder_fn_t) (pdf_text_t path_name);
-typedef pdf_size_t (*pdf_fsys_file_read_fn_t) (pdf_fsys_file_t file,
-                                               pdf_size_t elem_size,
-                                               pdf_size_t elem_count,
-                                               void *data);
-typedef pdf_size_t (*pdf_fsys_file_write_fn_t) (pdf_fsys_file_t file,
-                                                pdf_size_t elem_size,
-                                                pdf_size_t elem_count,
-                                                void *data);
+
+typedef pdf_status_t
+(*pdf_fsys_file_read_fn_t) (pdf_fsys_file_t file, pdf_char_t *buf,
+                            pdf_size_t bytes, pdf_size_t *read_bytes);
+
+typedef pdf_status_t
+(*pdf_fsys_file_write_fn_t) (pdf_fsys_file_t file, pdf_char_t *buf,
+                             pdf_size_t bytes, pdf_size_t *written_bytes);
+
 typedef pdf_status_t (*pdf_fsys_file_flush_fn_t) (pdf_fsys_file_t file);
 typedef pdf_status_t (*pdf_fsys_get_item_props_fn_t) (pdf_text_t path_name,
                                                       struct 
pdf_fsys_item_props_s *props);
@@ -223,7 +224,7 @@
 enum pdf_fsys_file_mode_e pdf_fsys_file_get_mode (pdf_fsys_file_t file);
 pdf_text_t pdf_fsys_file_get_url (pdf_fsys_file_t file);
 pdf_status_t pdf_fsys_file_set_mode (pdf_fsys_file_t file,
-                                                  enum pdf_fsys_file_mode_e 
new_mode);
+                                     enum pdf_fsys_file_mode_e new_mode);
 pdf_bool_t pdf_fsys_file_same_p (pdf_fsys_file_t file,
                                  pdf_text_t path);
 pdf_status_t pdf_fsys_file_get_pos (pdf_fsys_file_t file,
@@ -235,14 +236,13 @@
 pdf_size_t pdf_fsys_file_get_size (pdf_fsys_file_t file);
 pdf_status_t pdf_fsys_file_set_size (pdf_fsys_file_t file,
                                      pdf_size_t size);
-pdf_size_t pdf_fsys_file_read (pdf_fsys_file_t file,
-                               const pdf_size_t elem_size,
-                               const pdf_size_t elem_count,
-                               void *data);
-pdf_size_t pdf_fsys_file_write (pdf_fsys_file_t file,
-                                const pdf_size_t elem_size,
-                                const pdf_size_t elem_count,
-                                void *data);
+
+pdf_status_t pdf_fsys_file_read (pdf_fsys_file_t file, pdf_char_t *buf,
+                                 pdf_size_t bytes, pdf_size_t *read_bytes);
+
+pdf_status_t pdf_fsys_file_write (pdf_fsys_file_t file, pdf_char_t *buf,
+                                  pdf_size_t bytes, pdf_size_t *written_bytes);
+
 pdf_status_t pdf_fsys_file_flush (pdf_fsys_file_t file);
 pdf_status_t pdf_fsys_file_request_ria (pdf_fsys_file_t file,
                                         pdf_size_t offset,

=== modified file 'src/base/pdf-stm-be.c'
--- src/base/pdf-stm-be.c       2008-10-04 16:34:37 +0000
+++ src/base/pdf-stm-be.c       2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-09-24 18:45:45 gerel"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:44:30 gerel"
  *
  *       File:         pdf-stm-be.c
  *       Date:         Wed Jun 18 21:15:16 2008
@@ -348,6 +348,7 @@
 {
   pdf_size_t readed_bytes;
   pdf_size_t current_pos;
+  pdf_status_t ret;
 
   /* Seek in the file */
   pdf_fsys_file_get_pos (be->data.file.file,
@@ -360,9 +361,10 @@
     }
 
   /* Read the requested number of bytes */
-  readed_bytes = pdf_fsys_file_read (be->data.file.file,
-                                     1, bytes,
-                                     (void *) buffer);
+  ret = pdf_fsys_file_read (be->data.file.file,
+                            buffer,
+                            bytes,
+                            &readed_bytes);
 
   /* Restore the file position and update the position of the
      stream */
@@ -384,6 +386,7 @@
 {
   pdf_size_t written_bytes;
   pdf_size_t current_pos;
+  pdf_status_t ret;
 
   /* Seek in the file */
   pdf_fsys_file_get_pos (be->data.file.file,
@@ -396,9 +399,10 @@
     }
   
   /* Write the requested number of bytes */
-  written_bytes = pdf_fsys_file_write (be->data.file.file,
-                                       1, bytes,
-                                       buffer);
+  ret = pdf_fsys_file_write (be->data.file.file,
+                             buffer,
+                             bytes,
+                             &written_bytes);
   
   /* Restore the file position and update the position of the
      stream */

=== modified file 'torture/unit/Makefile.am'
--- torture/unit/Makefile.am    2009-04-16 22:13:38 +0000
+++ torture/unit/Makefile.am    2009-05-13 16:30:24 +0000
@@ -63,6 +63,7 @@
 
 # Unit tests for the Stream Module test suite
 TEST_SUITE_STM = base/stm/pdf-stm-mem-new.c \
+                 base/stm/pdf-stm-file-new.c \
                  base/stm/pdf-stm-read.c \
                  base/stm/pdf-stm-read-char.c \
                  base/stm/pdf-stm-peek-char.c \
@@ -179,13 +180,13 @@
                   base/time/pdf-time-span-dup.c \
                   base/time/pdf-time-span-destroy.c \
                   base/time/pdf-time-span-set.c \
-                  base/time/pdf-time-span-set-from-i32.c \
-                  base/time/pdf-time-span-negate.c \
-                  base/time/pdf-time-span-add.c \
-                  base/time/pdf-time-span-cmp.c \
-                  base/time/pdf-time-span-copy.c \
-                  base/time/pdf-time-span-diff.c \
-                  base/time/pdf-time-span-to-secs.c \
+                  base/time/pdf-time-span-set-from-i32.c \
+                  base/time/pdf-time-span-negate.c \
+                  base/time/pdf-time-span-add.c \
+                  base/time/pdf-time-span-cmp.c \
+                  base/time/pdf-time-span-copy.c \
+                  base/time/pdf-time-span-diff.c \
+                  base/time/pdf-time-span-to-secs.c \
                   base/time/pdf-time-testdata.c \
                   base/time/pdf-time-test-common.c 
 

=== added file 'torture/unit/base/stm/pdf-stm-file-new.c'
--- torture/unit/base/stm/pdf-stm-file-new.c    1970-01-01 00:00:00 +0000
+++ torture/unit/base/stm/pdf-stm-file-new.c    2009-05-13 16:30:24 +0000
@@ -0,0 +1,85 @@
+/* -*- mode: C -*- Time-stamp: "2009-05-13 13:21:10 gerel"
+ *
+ *       File:         pdf-stm-file-new.c
+ *       Date:         Sat Sep 20 14:37:26 2008
+ *
+ *       GNU PDF Library - Unit tests for pdf_stm_file_new
+ *
+ */
+
+/* Copyright (C) 2008 Free Software Foundation, Inc. */
+
+/* This program 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <check.h>
+#include <pdf.h>
+
+/*
+ * Test: pdf_stm_file_new_001
+ * Description:
+ *   Create a new file-based reading stream.
+ * Success condition:
+ *   The call to pdf_stm_file_new should return success.
+ */
+START_TEST (pdf_stm_file_new_001)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_WRITE,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Free all resources */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+
+}
+END_TEST
+
+/*
+ * Test case creation function
+ */
+TCase *
+test_pdf_stm_file_new (void)
+{
+  TCase *tc = tcase_create ("pdf_stm_file_new");
+
+  tcase_add_test(tc, pdf_stm_file_new_001);
+
+  return tc;
+}
+
+/* End of pdf-stm-file-new.c */

=== modified file 'torture/unit/base/stm/pdf-stm-peek-char.c'
--- torture/unit/base/stm/pdf-stm-peek-char.c   2009-01-13 21:56:12 +0000
+++ torture/unit/base/stm/pdf-stm-peek-char.c   2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "09/01/13 22:10:30 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:46:31 gerel"
  *
  *       File:         pdf-stm-peek-char.c
  *       Date:         Sat Sep 20 18:07:45 2008
@@ -115,6 +115,62 @@
 
 
 /*
+ * Test: pdf_stm_peek_char_003
+ * Description:
+ *   Peek a character from a file stream.
+ * Success condition:
+ *   The peek character should be ok.
+ */
+START_TEST (pdf_stm_peek_char_003)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_char_t ret_char;
+  pdf_size_t written;
+
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "GNU", 3, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 3);
+  pdf_fsys_file_close (file);
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Peek a character from the stream */
+  ret = pdf_stm_peek_char (stm, &ret_char);
+  fail_if(ret != PDF_OK);
+  fail_if(ret_char != 'G');
+  
+  /* Destroy data */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+/*
  * Test case creation function
  */
 TCase *
@@ -124,6 +180,7 @@
 
   tcase_add_test(tc, pdf_stm_peek_char_001);
   tcase_add_test(tc, pdf_stm_peek_char_002);
+  tcase_add_test(tc, pdf_stm_peek_char_003);
 
   return tc;
 }

=== modified file 'torture/unit/base/stm/pdf-stm-read-char.c'
--- torture/unit/base/stm/pdf-stm-read-char.c   2009-01-13 21:56:12 +0000
+++ torture/unit/base/stm/pdf-stm-read-char.c   2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "09/01/13 22:12:30 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:47:06 gerel"
  *
  *       File:         pdf-stm-read-char.c
  *       Date:         Sat Sep 20 16:59:27 2008
@@ -119,6 +119,63 @@
 }
 END_TEST
 
+
+/*
+ * Test: pdf_stm_read_char_003
+ * Description:
+ *   Read a character from a file stream.
+ * Success condition:
+ *   The read character should be ok.
+ */
+START_TEST (pdf_stm_read_char_003)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_char_t ret_char;
+  pdf_size_t written;
+
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "GNU", 3, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 3);
+  pdf_fsys_file_close (file);
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Peek a character from the stream */
+  ret = pdf_stm_read_char (stm, &ret_char);
+  fail_if(ret != PDF_OK);
+  fail_if(ret_char != 'G');
+  
+  /* Destroy data */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
 /*
  * Test case creation function
  */
@@ -129,6 +186,7 @@
 
   tcase_add_test(tc, pdf_stm_read_char_001);
   tcase_add_test(tc, pdf_stm_read_char_002);
+  tcase_add_test(tc, pdf_stm_read_char_003);
 
   return tc;
 }

=== modified file 'torture/unit/base/stm/pdf-stm-read.c'
--- torture/unit/base/stm/pdf-stm-read.c        2009-01-14 20:39:58 +0000
+++ torture/unit/base/stm/pdf-stm-read.c        2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "09/01/13 22:46:02 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:48:43 gerel"
  *
  *       File:         pdf-stm-read.c
  *       Date:         Sat Sep 20 15:20:17 2008
@@ -761,6 +761,137 @@
 
 
 /*
+ * Test: pdf_stm_read_013
+ * Description:
+ *   Read some bytes from a read file stream.
+ * Success condition:
+ *   The read data should be consistent.
+ */
+START_TEST (pdf_stm_read_013)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_size_t written,read_bytes;
+
+  pdf_fsys_file_t file;
+  char data[4];
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "GNU", 3, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 3);
+  pdf_fsys_file_close (file);
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  ret = pdf_stm_read (stm,
+                      data,
+                      3,
+                      &read_bytes);
+  fail_if(ret != PDF_OK);
+  fail_if(read_bytes != 3);
+  data[3] = '\0';
+
+  fail_if (strcmp (data, "GNU") != 0);
+
+  /* Free resources */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+/*
+ * Test: pdf_stm_read_014
+ * Description:
+ *   Read some bytes from a read file stream with null filter.
+ * Success condition:
+ *   The read data should be consistent.
+ */
+START_TEST (pdf_stm_read_014)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_size_t written,read_bytes;
+
+  pdf_fsys_file_t file;
+  char data[4];
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+  pdf_hash_t null_filter_params;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "GNU", 3, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 3);
+  pdf_fsys_file_close (file);
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+
+  /* Install a new filter in the chain */
+  pdf_hash_new (NULL, &null_filter_params);
+  fail_if(pdf_stm_install_filter (stm,
+                                  PDF_STM_FILTER_NULL,
+                                  null_filter_params) != PDF_OK);
+
+  ret = pdf_stm_read (stm,
+                      data,
+                      3,
+                      &read_bytes);
+  fail_if(ret != PDF_OK);
+  fail_if(read_bytes != 3);
+  data[3] = '\0';
+
+  fail_if (strcmp (data, "GNU") != 0);
+
+  /* Free resources */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+
+/*
  * Test case creation function
  */
 TCase *
@@ -782,6 +913,8 @@
 #endif
   tcase_add_test(tc, pdf_stm_read_011);
   tcase_add_test(tc, pdf_stm_read_012);
+  tcase_add_test(tc, pdf_stm_read_013);
+  tcase_add_test(tc, pdf_stm_read_014);
 
   return tc;
 }

=== modified file 'torture/unit/base/stm/pdf-stm-seek.c'
--- torture/unit/base/stm/pdf-stm-seek.c        2009-01-13 21:56:12 +0000
+++ torture/unit/base/stm/pdf-stm-seek.c        2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "09/01/13 22:33:25 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:49:49 gerel"
  *
  *       File:         pdf-stm-seek.c
  *       Date:         Sat Sep 20 18:50:33 2008
@@ -131,6 +131,143 @@
 }
 END_TEST
 
+
+/*
+ * Test: pdf_stm_seek_003
+ * Description:
+ *   Seek into a file read stream.
+ * Success condition:
+ *   The seek operation should success.
+ */
+START_TEST (pdf_stm_seek_003)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_char_t ret_char;
+  pdf_off_t pos;
+
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length,written;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length,
+                                      &path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "0123456789", 10, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 10);
+  pdf_fsys_file_close (file);
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Seek into the stream */
+  pos = pdf_stm_seek (stm, 3);
+  fail_if(pos != 3);
+
+  /* Read a character */
+  ret = pdf_stm_read_char (stm, &ret_char);
+  fail_if(ret != PDF_OK);
+  fail_if(ret_char != '3');
+
+  /* Seek into the stream */
+  pos = pdf_stm_seek (stm, 8);
+  fail_if(pos != 8);
+
+  /* Read a character */
+  ret = pdf_stm_read_char (stm, &ret_char);
+  fail_if(ret != PDF_OK);
+  fail_if(ret_char != '8');
+  
+  /* Destroy data */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+/*
+ * Test: pdf_stm_seek_004
+ * Description:
+ *   Seek to a position beyond the size of the stream 
+ *   into a file read stream.
+ * Success condition:
+ *   The seek operation should success and the seek
+ *   position should be to the last valid position
+ *   in the stream.
+ */
+START_TEST (pdf_stm_seek_004)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_char_t ret_char;
+  pdf_off_t pos;
+
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length,written;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length,
+                                      &path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "0123456789", 10, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 10);
+  pdf_fsys_file_close (file);
+
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Seek into the stream */
+  pos = pdf_stm_seek (stm, 300);
+  fail_if(pos != 9);
+
+  /* Read a character */
+  ret = pdf_stm_read_char (stm, &ret_char);
+  fail_if(ret != PDF_OK);
+  fail_if(ret_char != '9');
+
+  /* Destroy data */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+
 /*
  * Test case creation function
  */
@@ -141,6 +278,8 @@
 
   tcase_add_test(tc, pdf_stm_seek_001);
   tcase_add_test(tc, pdf_stm_seek_002);
+  tcase_add_test(tc, pdf_stm_seek_003);
+  tcase_add_test(tc, pdf_stm_seek_004);
 
   return tc;
 }

=== modified file 'torture/unit/base/stm/pdf-stm-tell.c'
--- torture/unit/base/stm/pdf-stm-tell.c        2008-09-20 17:24:13 +0000
+++ torture/unit/base/stm/pdf-stm-tell.c        2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/20 19:19:22 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:50:03 gerel"
  *
  *       File:         pdf-stm-tell.c
  *       Date:         Sat Sep 20 19:16:41 2008
@@ -71,6 +71,65 @@
 
 
 /*
+ * Test: pdf_stm_tell_002
+ * Description:
+ *   Tell an initialized reading file stream.
+ * Success condition:
+ *   The tell operation should report the first position
+ *   in the stream (0).
+ */
+START_TEST (pdf_stm_tell_002)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_char_t ret_char;
+  pdf_off_t pos;
+
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length,written;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length,
+                                      &path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_write (file, "0123456789", 10, &written);
+  fail_if (ret != PDF_OK);
+  fail_if (written != 10);
+  pdf_fsys_file_close (file);
+
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_READ,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Tell the stream */
+  pos = pdf_stm_tell (stm);
+  fail_if(pos != 0);
+
+  /* Destroy data */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+
+
+/*
  * Test case creation function
  */
 TCase *
@@ -79,6 +138,7 @@
   TCase *tc = tcase_create ("pdf_stm_tell");
 
   tcase_add_test(tc, pdf_stm_tell_001);
+  tcase_add_test(tc, pdf_stm_tell_002);
 
   return tc;
 }

=== modified file 'torture/unit/base/stm/pdf-stm-write.c'
--- torture/unit/base/stm/pdf-stm-write.c       2009-01-27 20:59:40 +0000
+++ torture/unit/base/stm/pdf-stm-write.c       2009-05-15 17:55:40 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "09/01/27 21:41:44 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-15 13:53:39 gerel"
  *
  *       File:         pdf-stm-write.c
  *       Date:         Sun Sep 21 16:37:27 2008
@@ -729,6 +729,149 @@
 
 
 /*
+ * Test: pdf_stm_write_013
+ * Description:
+ *   Write some bytes to a write file stream.
+ * Success condition:
+ *   The written data should be consistent.
+ */
+START_TEST (pdf_stm_write_013)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_size_t read,written_bytes;
+
+  pdf_fsys_file_t file;
+  char data[4];
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_WRITE,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+  /* Write some data into the stream */
+  ret = pdf_stm_write (stm,
+                       "GNU",
+                       3,
+                       &written_bytes);
+  fail_if(ret != PDF_OK);
+  fail_if(written_bytes != 3);
+
+  /* Destroy data */
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+
+  /* Read file data and compare */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_read (file, data, 3, &read);
+  fail_if (ret != PDF_OK);
+  data[3] = '\0';
+
+  fail_if(read != 3);
+  fail_if (strcmp (data, "GNU") != 0);
+
+  /* Free resources */
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+
+/*
+ * Test: pdf_stm_write_014
+ * Description:
+ *   Write some bytes to a write file stream with
+ *   a null filter installed.
+ * Success condition:
+ *   The written data should be consistent.
+ */
+START_TEST (pdf_stm_write_014)
+{
+  pdf_status_t ret;
+  pdf_stm_t stm;
+  pdf_size_t read,written_bytes;
+  pdf_hash_t null_filter_params;
+
+  pdf_fsys_file_t file;
+  char data[4];
+  pdf_text_t path;
+  pdf_char_t * remain;
+  pdf_size_t remain_length;
+
+  /* Create the file path */
+  pdf_text_init ();
+  ret = pdf_text_new_from_pdf_string ("tmp.test", 8, &remain, &remain_length, 
&path);
+  fail_if (ret != PDF_OK);
+
+  /* Open new file */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_WRITE, &file); 
+  fail_if (ret != PDF_OK);
+
+  /* Create the stream */
+  ret = pdf_stm_file_new (file,
+                          0,
+                          0, /* Use the default cache size */
+                          PDF_STM_WRITE,
+                          &stm);
+  fail_if(ret != PDF_OK);
+
+
+  /* Install a new filter in the chain */
+  pdf_hash_new (NULL, &null_filter_params);
+  fail_if(pdf_stm_install_filter (stm,
+                                  PDF_STM_FILTER_NULL,
+                                  null_filter_params) != PDF_OK);
+
+  /* Write some data into the stream */
+  ret = pdf_stm_write (stm,
+                       "GNU",
+                       3,
+                       &written_bytes);
+  fail_if(ret != PDF_OK);
+  fail_if(written_bytes != 3);
+
+  /* Destroy data */
+  pdf_hash_destroy (null_filter_params);
+  pdf_stm_destroy (stm);
+  pdf_fsys_file_close (file);
+
+  /* Read file data and compare */
+  ret = pdf_fsys_file_open (NULL, path, PDF_FSYS_OPEN_MODE_READ, &file); 
+  fail_if (ret != PDF_OK);
+
+  ret = pdf_fsys_file_read (file, data, 3, &read);
+  fail_if (ret != PDF_OK);
+  data[3] = '\0';
+
+  fail_if(read != 3);
+  fail_if (strcmp (data, "GNU") != 0);
+
+  /* Free resources */
+  pdf_fsys_file_close (file);
+  pdf_text_destroy (path);
+}
+END_TEST
+
+
+/*
  * Test case creation function
  */
 TCase *
@@ -751,6 +894,8 @@
   tcase_add_test(tc, pdf_stm_write_010);
   tcase_add_test(tc, pdf_stm_write_011);
   tcase_add_test(tc, pdf_stm_write_012);
+  tcase_add_test(tc, pdf_stm_write_013);
+  tcase_add_test(tc, pdf_stm_write_014);
 
   return tc;
 }

=== modified file 'torture/unit/base/stm/tsuite-stm.c'
--- torture/unit/base/stm/tsuite-stm.c  2008-09-21 14:55:24 +0000
+++ torture/unit/base/stm/tsuite-stm.c  2009-05-13 16:30:24 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/21 16:43:20 jemarch"
+/* -*- mode: C -*- Time-stamp: "2009-05-13 13:13:15 gerel"
  *
  *       File:         tsuit-stm.c
  *       Date:         Sat Feb 23 21:35:11 2008
@@ -26,6 +26,7 @@
 #include <check.h>
 
 extern TCase *test_pdf_stm_mem_new (void);
+extern TCase *test_pdf_stm_file_new (void);
 extern TCase *test_pdf_stm_read (void);
 extern TCase *test_pdf_stm_read_char (void);
 extern TCase *test_pdf_stm_peek_char (void);
@@ -41,6 +42,7 @@
   s = suite_create("stm");
   
   suite_add_tcase (s, test_pdf_stm_mem_new ());
+  suite_add_tcase (s, test_pdf_stm_file_new ());
   suite_add_tcase (s, test_pdf_stm_read ());
   suite_add_tcase (s, test_pdf_stm_read_char ());
   suite_add_tcase (s, test_pdf_stm_peek_char ());

# Begin bundle
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

###



-gerel




reply via email to

[Prev in Thread] Current Thread [Next in Thread]