Hi everybody,

I started working on FS#24 again and basically started all over again (not
that I had much yet ;). Attached you'll find a patch with the unit tests
implemented for four fsys functions. I'll add more in the next few days.

While running the tests I encountered something strange. The test for
pdf_fsys_get_temp_file_name() failed because the function returned NULL
(pdf_fsys_file_open_005 failed for the same reason). When I set the
CK_FORK environment varaible to "no" in order to debug this, all test ran
fine?!

The tar archive also attached contains two testdata files for the unit
tests. The first one needs to be readonly, the second one read-writeable.
How to handle such files for the fsys unit tests? I guess the best way is
to write a small script, that sets all needed files up with the right
permissions. Any other ideas?


best regards,

Hans Hohenfeld

Attachment: fsys_ut_td.tar
Description: Unix tar archive

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: h...@alderaan-20090727235013-zsxf75kokkjvuksc
# target_branch: file:///home/hans/Coding/gnupdf/trunk/
# testament_sha1: 0cc5060dfd05b3f3eca1503e73aacb2cc09402e2
# timestamp: 2009-07-28 01:50:20 +0200
# base_revision_id: jema...@termi-20090724115210-bd63lmib5o8x17n4
# 
# Begin patch
=== modified file 'torture/unit/Makefile.am'
--- torture/unit/Makefile.am	2009-06-16 20:46:24 +0000
+++ torture/unit/Makefile.am	2009-07-27 22:25:25 +0000
@@ -225,6 +225,12 @@
 TEST_SUITE_FP = base/fp/pdf-fp-func-eval.c \
                 base/fp/pdf-fp-func-4-new.c
 
+TEST_SUITE_FSYS = base/fsys/pdf-fsys-get-free-space.c \
+									base/fsys/pdf-fsys-get-temp-path-name.c \
+                  base/fsys/pdf-fsys-file-open.c \
+									base/fsys/pdf-fsys-file-close.c
+
+
 TEST_SUITE_TOKEN = base/token/pdf-token-read.c
 
 TEST_ENVIRONMENT = CHARSETALIASDIR=$(top_srcdir)/lib
@@ -239,6 +245,7 @@
              $(TEST_SUITE_ALLOC) \
              $(TEST_SUITE_STM) \
              $(TEST_SUITE_FP) \
+						 $(TEST_SUITE_FSYS) \
              $(TEST_SUITE_TOKEN)
 
 TSUITE_FILES = base/alloc/tsuite-alloc.c \
@@ -251,6 +258,7 @@
                base/crypt/tsuite-crypt.c \
                base/stm/tsuite-stm.c \
                base/fp/tsuite-fp.c \
+							 base/fsys/tsuite-fsys.c \
                base/token/tsuite-token.c
 
 TORTUTILS_FILES = $(top_srcdir)/torture/tortutils/tortutils.h \

=== added directory 'torture/unit/base/fsys'
=== added file 'torture/unit/base/fsys/pdf-fsys-file-close.c'
--- torture/unit/base/fsys/pdf-fsys-file-close.c	1970-01-01 00:00:00 +0000
+++ torture/unit/base/fsys/pdf-fsys-file-close.c	2009-07-27 23:50:13 +0000
@@ -0,0 +1,91 @@
+/* -*- mode: C -*- Time-stamp: "2009-07-28 01:47:51 derhans"
+ *
+ *       File:         pdf-fsys-file-close.c
+ *       Date:         Sat May  3 21:02:12 2009
+ *
+ *       GNU PDF Library - Unit tests for pdf_fsys_file_close
+ *
+ */
+
+/* Copyright (C) 2009 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>
+#include <string.h>
+
+/*
+ * Test: pdf_fsys_file_close_001
+ * Description:
+ *   Open an existing and readable file and close it afterwards
+ * Success condition:
+ *   The call to pdf_fsys_file_close should return PDF_OK
+ */
+
+START_TEST(pdf_fsys_file_close_001)
+{
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t filename[] = "TDFSYS0001", *pathname;
+
+  pathname = tortu_get_data_file_path(filename);
+  file = (pdf_fsys_file_t)pdf_alloc(sizeof(struct pdf_fsys_file_s));
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(pathname,
+                                     strlen((char*) pathname),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  fail_if( pdf_fsys_file_open(NULL, 
+                              path, 
+                              PDF_FSYS_OPEN_MODE_READ, 
+                              &file) != PDF_OK );
+
+  fail_if( pdf_fsys_file_close(file) != PDF_OK );
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test: pdf_fsys_file_close_002
+ * Description:
+ *   Try to close a NULL file
+ * Success condition:
+ *   The call to pdf_fsys_file_close should return PDF_EBADDATA
+ */
+
+START_TEST(pdf_fsys_file_close_002)
+{
+  fail_if( pdf_fsys_file_close( NULL ) != PDF_EBADDATA );
+}
+END_TEST
+
+/*
+ * Test case creation function
+ */
+TCase *
+test_pdf_fsys_file_close (void)
+{
+  TCase *tc = tcase_create("pdf_fsys_file_close");
+  tcase_add_test(tc, pdf_fsys_file_close_001);
+  tcase_add_test(tc, pdf_fsys_file_close_002);
+  return tc;
+}
+
+/* End of pdf-fsys-file-close.c */

=== added file 'torture/unit/base/fsys/pdf-fsys-file-open.c'
--- torture/unit/base/fsys/pdf-fsys-file-open.c	1970-01-01 00:00:00 +0000
+++ torture/unit/base/fsys/pdf-fsys-file-open.c	2009-07-27 23:50:13 +0000
@@ -0,0 +1,212 @@
+/* -*- mode: C -*- Time-stamp: "2009-07-28 01:47:46 derhans"
+ *
+ *       File:         pdf-fsys-file-open.c
+ *       Date:         Sat May  2 00:02:09 2009
+ *
+ *       GNU PDF Library - Unit tests for pdf_fsys_file_open
+ *
+ */
+
+/* Copyright (C) 2009 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>
+#include <string.h>
+
+
+/*
+ * Test: pdf_fsys_file_open_001
+ * Description:
+ *   Open an existing and readable file for reading
+ * Success condition:
+ *   The call to pdf_fsys_file_open should return PDF_OK
+ */
+
+START_TEST(pdf_fsys_file_open_001)
+{
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t filename[] = "TDFSYS0001", *pathname;
+
+  pathname = tortu_get_data_file_path(filename);
+  file = (pdf_fsys_file_t)pdf_alloc(sizeof(struct pdf_fsys_file_s));
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(pathname,
+                                     strlen((char *)pathname),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  fail_if( pdf_fsys_file_open(NULL, 
+                              path, 
+                              PDF_FSYS_OPEN_MODE_READ, 
+                              &file) != PDF_OK );
+
+  pdf_fsys_file_close(file);
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test: pdf_fsys_file_open_002
+ * Description:
+ *   Open a non-existing file for reading
+ * Success condition:
+ *   The call to pdf_fsys_file_open should return PDF_EBADNAME
+ */
+
+START_TEST(pdf_fsys_file_open_002)
+{
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t filename[] = "DOESNTEXIST";
+
+  file = (pdf_fsys_file_t)pdf_alloc(sizeof(struct pdf_fsys_file_s));
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(filename,
+                                     strlen((char *)filename),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  fail_if( pdf_fsys_file_open(NULL, 
+                              path, 
+                              PDF_FSYS_OPEN_MODE_READ, 
+                              &file) != PDF_EBADNAME );
+  
+  pdf_dealloc(file); 
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test: pdf_fsys_file_open_003
+ * Description:
+ *   Open an existing but readonly file for writing
+ * Success condition:
+ *   The call to pdf_fsys_file_open should return PDF_EBADPERMS
+ */
+
+START_TEST(pdf_fsys_file_open_003)
+{
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t filename[] = "TDFSYS0001", *pathname;
+
+  pathname = tortu_get_data_file_path(filename);
+  file = (pdf_fsys_file_t)pdf_alloc(sizeof(struct pdf_fsys_file_s));
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(pathname,
+                                     strlen((char *)pathname),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  fail_if( pdf_fsys_file_open(NULL, 
+                              path, 
+                              PDF_FSYS_OPEN_MODE_WRITE, 
+                              &file) != PDF_EBADPERMS );
+
+  pdf_dealloc(file);
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test: pdf_fsys_file_open_004
+ * Description:
+ *   Open an existing and writeable file for writing
+ * Success condition:
+ *   The call to pdf_fsys_file_open should return PDF_OK
+ */
+
+START_TEST(pdf_fsys_file_open_004)
+{
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+  pdf_char_t filename[] = "TDFSYS0002", *pathname;
+
+  pathname = tortu_get_data_file_path(filename);
+  file = (pdf_fsys_file_t)pdf_alloc(sizeof(struct pdf_fsys_file_s));
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(pathname,
+                                     strlen((char *)pathname),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  fail_if( pdf_fsys_file_open(NULL, 
+                              path, 
+                              PDF_FSYS_OPEN_MODE_WRITE, 
+                              &file) != PDF_OK );
+
+  pdf_fsys_file_close(file);
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test: pdf_fsys_file_open_005
+ * Description:
+ *   Open a new (temporary) file for writing
+ * Success condition:
+ *   The call to pdf_fsys_file_open should return PDF_OK
+ */
+
+START_TEST(pdf_fsys_file_open_005)
+{
+  pdf_fsys_file_t file;
+  pdf_text_t path;
+
+  file = (pdf_fsys_file_t)pdf_alloc(sizeof(struct pdf_fsys_file_s));
+
+  path = pdf_fsys_get_temp_path_name(NULL);
+
+  fail_if( path == NULL );
+
+  fail_if( pdf_fsys_file_open(NULL, 
+                              path, 
+                              PDF_FSYS_OPEN_MODE_WRITE, 
+                              &file) != PDF_OK );
+
+  pdf_fsys_file_close(file);
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test case creation function
+ */
+TCase *
+test_pdf_fsys_file_open (void)
+{
+  TCase *tc = tcase_create("pdf_fsys_file_open");
+  tcase_add_test(tc, pdf_fsys_file_open_001);
+  tcase_add_test(tc, pdf_fsys_file_open_002);
+  tcase_add_test(tc, pdf_fsys_file_open_003);
+  tcase_add_test(tc, pdf_fsys_file_open_004);
+  tcase_add_test(tc, pdf_fsys_file_open_005);
+  return tc;
+}
+
+
+/* End of pdf-fsys-file-open.c */

=== added file 'torture/unit/base/fsys/pdf-fsys-get-free-space.c'
--- torture/unit/base/fsys/pdf-fsys-get-free-space.c	1970-01-01 00:00:00 +0000
+++ torture/unit/base/fsys/pdf-fsys-get-free-space.c	2009-05-03 01:00:37 +0000
@@ -0,0 +1,106 @@
+/* -*- mode: C -*- Time-stamp: "2009-05-01 20:43:05 derhans"
+ *
+ *       File:         pdf-fsys-get-free-space.c
+ *       Date:         Fri May  1 20:20:11 2009
+ *
+ *       GNU PDF Library - Unit tests for pdf_fsys_get_free_space
+ *
+ */
+
+/* Copyright (C) 2009 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_fsys_get_free_space_001
+ * Description:
+ *   Get the free space left on the filesystem for an existing path.
+ * Success condition:
+ *   The call to pdf_fsys_get_free_space should not return an error
+ */
+
+START_TEST(pdf_fsys_get_free_space_001)
+{
+  pdf_i64_t free_space, error;
+  pdf_text_t path;
+  pdf_char_t pathname[] = ".";
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(pathname,
+                                     strlen((char*) pathname),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  error = pdf_i64_new((32 << 1), 1);
+
+  free_space = pdf_fsys_get_free_space(NULL, path);
+  fail_if( pdf_i64_cmp(free_space, error) == 0 );
+
+  pdf_text_destroy(path);
+}
+END_TEST
+
+/*
+ * Test: pdf_fsys_get_free_space_002
+ * Description:
+ *   Get the free space left on the filesystem for an non existing path.
+ * Success condition:
+ *   The call to pdf_fsys_get_free_space should return -1, which indicates an
+ *   error.
+ */
+
+START_TEST(pdf_fsys_get_free_space_002)
+{
+  pdf_i64_t free_space, error;
+  pdf_text_t path;
+  pdf_char_t pathname[] = "DOESNTEXIST";
+
+  fail_if( pdf_text_init() != PDF_OK );
+
+  fail_if( pdf_text_new_from_unicode(pathname,
+                                     strlen((char*) pathname),
+                                     PDF_TEXT_UTF8,
+                                     &path) != PDF_OK );
+
+  error = pdf_i64_new((32 << 1), 1);
+
+  free_space = pdf_fsys_get_free_space(NULL, path);
+  fail_if( pdf_i64_cmp(free_space, error) != 0 );
+
+  pdf_text_destroy(path);
+}
+END_TEST
+
+
+
+/*
+ * Test case creation function
+ */
+TCase *
+test_pdf_fsys_get_free_space (void)
+{
+  TCase *tc = tcase_create("pdf_fsys_get_free_space");
+  tcase_add_test(tc, pdf_fsys_get_free_space_001);
+  tcase_add_test(tc, pdf_fsys_get_free_space_002);
+  return tc;
+}
+
+
+/* End of pdf-fsys-get-free-space.c */

=== added file 'torture/unit/base/fsys/pdf-fsys-get-temp-path-name.c'
--- torture/unit/base/fsys/pdf-fsys-get-temp-path-name.c	1970-01-01 00:00:00 +0000
+++ torture/unit/base/fsys/pdf-fsys-get-temp-path-name.c	2009-07-27 22:09:37 +0000
@@ -0,0 +1,55 @@
+/* -*- mode: C -*- Time-stamp: "2009-05-03 21:32:19 derhans"
+ *
+ *       File:         pdf-fsys-get-temp-path-name.c
+ *       Date:         Sat May  3 21:02:12 2009
+ *
+ *       GNU PDF Library - Unit tests for pdf_fsys_get_temp_path_name
+ *
+ */
+
+/* Copyright (C) 2009 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_fsys_get_temp_path_name_001
+ * Description:
+ *   Get the path to a new temporary file
+ * Success condition:
+ *   The call to pdf_fsys_get_temp_path_name should not return NULL
+ */
+
+START_TEST(pdf_fsys_get_temp_path_name_001)
+{
+  fail_if( pdf_fsys_get_temp_path_name(NULL) == NULL );
+}
+END_TEST
+
+/*
+ * Test case creation function
+ */
+TCase *
+test_pdf_fsys_get_temp_path_name (void)
+{
+  TCase *tc = tcase_create("pdf_fsys_get_temp_path_name");
+  tcase_add_test(tc, pdf_fsys_get_temp_path_name_001);
+  return tc;
+}
+
+/* End of pdf-fsys-get-temp-path-name.c */

=== added file 'torture/unit/base/fsys/tsuite-fsys.c'
--- torture/unit/base/fsys/tsuite-fsys.c	1970-01-01 00:00:00 +0000
+++ torture/unit/base/fsys/tsuite-fsys.c	2009-07-27 23:50:13 +0000
@@ -0,0 +1,50 @@
+/* -*- mode: C -*- Time-stamp: "2009-07-27 23:56:43 derhans"
+ *
+ *       File:         tsuite-fsys.c
+ *       Date:         Fri May  1 18:08:12 2009
+ *
+ *       GNU PDF Library - Testcase definition for the Fsys module
+ *
+ */
+
+/* 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 <check.h>
+
+extern TCase *test_pdf_fsys_get_free_space (void);
+extern TCase *test_pdf_fsys_get_temp_path_name (void);
+extern TCase *test_pdf_fsys_file_open (void);
+extern TCase *test_pdf_fsys_file_close (void);
+
+
+Suite *
+tsuite_fsys ()
+{
+  Suite *s;
+
+  s = suite_create("fsys");
+  
+  suite_add_tcase (s, test_pdf_fsys_get_free_space ());
+  suite_add_tcase (s, test_pdf_fsys_get_temp_path_name ());
+  suite_add_tcase (s, test_pdf_fsys_file_open ());
+  suite_add_tcase (s, test_pdf_fsys_file_close ());
+
+  return s;
+}
+
+
+/* End of tsuite-fsys.c */

=== modified file 'torture/unit/runtests.c'
--- torture/unit/runtests.c	2009-06-17 00:04:53 +0000
+++ torture/unit/runtests.c	2009-07-27 23:50:13 +0000
@@ -20,6 +20,7 @@
 extern Suite *tsuite_error (void);
 extern Suite *tsuite_fp (void);
 extern Suite *tsuite_token (void);
+extern Suite *tsuite_fsys (void);
 
 int
 main (int argc, char **argv)
@@ -40,7 +41,8 @@
   srunner_add_suite (sr, tsuite_error ());
   srunner_add_suite (sr, tsuite_stm ());
   srunner_add_suite (sr, tsuite_fp ());
-  srunner_add_suite (sr, tsuite_token ());
+  srunner_add_suite (sr, tsuite_token ()); 
+  srunner_add_suite (sr, tsuite_fsys());
 
   /* Set log file */
   srunner_set_log (sr, "ut.log");

# Begin bundle
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
h+HA1g==

Reply via email to