>> On Tuesday 28 July 2009 10:18:19 [email protected] wrote:
>>> 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?!
>> I've seen problems that change depending on CK_FORK.
>>
>> Lets look at this. When you run "normally", the tests get run as a
>> forked
>> process. This means that they are not impacted by other tests. That
>> isn't
>> the
>> case with CK_FORK="no".
>>
>> Perhaps what is happening is that some other test(s) are performing
>> initialisation that helps your test pass?
>>
>> Brad
>
> Hi,
>
> you're right. pdf_fsys_disk_get_temp_path_name() calls
> pdf_text_new_from_unicode(), which needs the text module to be initialized
> by pdf_text_init(). Some other test running before the failing one called
> pdf_init_text() so everything worked with CK_FORK=no. I'll adjust my tests
> accordingly.
>
> best regards,
>
> Hans Hohenfeld
Hi,
i've adjusted the two test, attached is a new patch, wich includes
everything from the first patch too. I'll be on till next friday starting
tomorrow, so I won't be able to answer any mails.
best regards,
Hans Hohenfeld
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: h...@alderaan-20090730222956-in5z0ry0i16g6i9u
# target_branch: file:///home/hans/Coding/gnupdf/trunk/
# testament_sha1: 91df2f91e734c7cf9f6b922646c33ce0889df086
# timestamp: 2009-07-31 00:30:13 +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-30 22:29:56 +0000
@@ -0,0 +1,214 @@
+/* -*- 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;
+
+ fail_if( pdf_text_init() != PDF_OK);
+
+ 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-30 22:29:56 +0000
@@ -0,0 +1,56 @@
+/* -*- 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_text_init() != PDF_OK );
+ 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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
SKcKEg11WTkA