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: [email protected] # target_branch: file:///home/gerel/PROJECTS/libgnupdf/trunk/ # testament_sha1: 7e944c5db18b74aed7f7819e622262e7589762bc # timestamp: 2009-05-15 16:37:50 -0300 # base_revision_id: [email protected] # # 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 <[email protected]> + + * 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 <[email protected]> * 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 <[email protected]> + + * 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 <[email protected]> === 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. -...@deftypefun 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 *...@var{data}) + +...@deftypefun pdf_status_t pdf_fsys_file_read (pdf_fsys_file_t @var{file}, pdf_char_t *...@var{buf}, pdf_size_t @var{bytes}, pdf_size_t *...@var{read_bytes}) Synchronously read data from an open file item. @@ -9153,17 +9154,26 @@ @item Parameters @table @var @item file -An open file variable. -...@item elem_size -The size of the data chunks to read from the file. -...@item elem_count -The number of data chunks to read from the file. -...@item data -A pointer to memory used to store the readed elements. +An open file. +...@item buf +The buffer to hold the read data. +...@item bytes +The number of octects to read. +...@item 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: +...@table @code +...@item PDF_OK +All the requested bytes were successfully read into @var{buf}. +...@item PDF_EBADDATA +The file element or a given pointer is invalid. +...@item PDF_EEOF +An end of file condition occurred. +...@item PDF_ERROR +An error prevented to read the bytes. +...@end table @item Usage example @example XXX @@ -9171,7 +9181,8 @@ @end table @end deftypefun -...@deftypefun 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 *...@var{data}) + +...@deftypefun pdf_status_t pdf_fsys_file_write (pdf_fsys_file_t @var{file}, pdf_char_t *...@var{buf}, pdf_size_t @var{bytes}, pdf_size_t *...@var{written_bytes}) Synchronously write data to an open file item. @@ -9179,17 +9190,26 @@ @item Parameters @table @var @item file -An open file variable. -...@item elem_size -The size of the data chunks to write into the file. -...@item elem_count -The number of data chunks to be write into the file. -...@item data +An open file. +...@item buf A pointer to memory containing the data to write into the file. +...@item bytes +The number of octects to write. +...@item 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: +...@table @code +...@item PDF_OK +All the requested bytes were successfully written to @var{file}. +...@item PDF_EBADDATA +The file element or a given pointer is invalid. +...@item PDF_ENOMEM +A disk full condition ocurred. +...@item PDF_ERROR +An error prevented to write the bytes. +...@end 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. -...@deftp {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 *...@var{data})} + +...@deftp {Data Type} {pdf_status_t (*pdf_fsys_file_read_fn_t) (pdf_fsys_file_t @var{file}, pdf_char...@var{buf}, pdf_size_t @var{bytes}, pdf_size...@var{read_bytes})} Filesystem callback used to synchronously read data from an open file item. @@ -9487,8 +9509,7 @@ interface function. @end deftp -...@deftp {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 *...@var{data})} - +...@deftp {Data Type} {pdf_status_t (*pdf_fsys_file_write_fn_t) (pdf_fsys_file_t @var{file}, pdf_char...@var{buf}, pdf_size_t @var{bytes}, pdf_size...@var{written_bytes})} 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
