Hi, Please find attached a new version of a patch implementing UUID module tests (corrected entries in ChangeLog, removed validity check of pdf_uuid_generate parameter, improved the generate, string and equal tests).
Albert 2011/5/19 Jose E. Marchesi <jema...@gnu.org>: > > Hi Albert. > > Please find attached a new patch implementing UUID test cases. In > addition, the API and implementation of pdf_uuid_generate have been > changed, improving parameter filtering. > > Thanks for the patch. Some comments. > > +2011-05-17 Albert Meroño Peñuela <albert.mer...@est.fib.upc.edu> > + torture: Unit tests for the UUID module. > + * torture/unit/Makefile.am > + * torture/unit/base/types/tsuite-types.c > + * torture/unit/base/types/pdf-types-uuid-generate.c > + * torture/unit/base/types/pdf-types-uuid-string.c > + * torture/unit/base/types/pdf-types-uuid-equal-p.c > + > + base/types: Fix UUID generation API. > + * src/base/pdf-types-uuid.[h|c] > + > > When creating a ChangeLog entry please briefly describe what changed in > each file. It is ok to specify just "Likewise" when needed. > > -pdf_uuid_t > -pdf_uuid_generate (enum pdf_uuid_type_e type) > +void > +pdf_uuid_generate (pdf_uuid_t * uuid, enum pdf_uuid_type_e type) > > I don't understand this change. We are using an enumerated value to > specify the type of UUID we want to generate precisely, so there is no > way we can get an invalid value in 'type' without getting a complain > from the compiler. Unless I am missing something there is no need to > check for the validity of the parameter. > > -- > Jose E. Marchesi jema...@gnu.org > GNU Project http://www.gnu.org >
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: albert.mer...@est.fib.upc.edu-20110530100630-\ # hf3ly54l3bft6v2i # target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/ # testament_sha1: 903fd0afbcc664df68bbc1266ab6b1b906ba8db2 # timestamp: 2011-05-30 12:08:28 +0200 # base_revision_id: jema...@gnu.org-20110510184038-xs3mcx9v2dgb08wz # # Begin patch === modified file 'ChangeLog' --- ChangeLog 2011-05-10 18:40:38 +0000 +++ ChangeLog 2011-05-30 10:06:30 +0000 @@ -1,3 +1,11 @@ +2011-05-30 Albert Meroño Peñuela <albert.mer...@est.fib.upc.edu> + torture: Unit tests for the UUID module. + * torture/unit/Makefile.am: UUID tests inclusion + * torture/unit/base/types/tsuite-types.c: UUID test suite + * torture/unit/base/types/pdf-types-uuid-generate.c: UUID tests + * torture/unit/base/types/pdf-types-uuid-string.c: Likewise + * torture/unit/base/types/pdf-types-uuid-equal-p.c: Likewise + 2011-05-10 Jose E. Marchesi <jema...@gnu.org> lib: avoid name clash with PDF_OBJ_IS_NULL and provide a quick === modified file 'torture/unit/Makefile.am' --- torture/unit/Makefile.am 2011-03-29 21:12:24 +0000 +++ torture/unit/Makefile.am 2011-05-30 10:06:30 +0000 @@ -163,7 +163,9 @@ # Unit tests for the Types Module test suite -TEST_SUITE_TYPES = +TEST_SUITE_TYPES = base/types/pdf-types-uuid-generate.c \ + base/types/pdf-types-uuid-string.c \ + base/types/pdf-types-uuid-equal-p.c TEST_SUITE_TIME = base/time/pdf-time-test-common.h \ base/time/pdf-time-testdata.c \ === added file 'torture/unit/base/types/pdf-types-uuid-equal-p.c' --- torture/unit/base/types/pdf-types-uuid-equal-p.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/types/pdf-types-uuid-equal-p.c 2011-05-30 10:06:30 +0000 @@ -0,0 +1,91 @@ +/* -*- mode: C -*- + * + * File: pdf-types-uuid-equal-p.c + * Date: Tue May 17 11:49:23 2011 + * + * GNU PDF Library - Unit tests for pdf_uuid_equal_p + * + */ + +/* Copyright (C) 2011 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 <pdf-test-common.h> +/* + * Test: pdf_uuid_equal_p_001 + * Description: + * Checks if two time-based UUIDs are equal. + * Success condition: + * Both time-based UUIDs are different. + */ +START_TEST (pdf_uuid_equal_p_001) +{ + + pdf_uuid_t uuid1; + pdf_uuid_t uuid2; + + /* Generate two time-based UUIDs */ + uuid1 = pdf_uuid_generate (PDF_UUID_TIME); + uuid2 = pdf_uuid_generate (PDF_UUID_TIME); + + fail_if(pdf_uuid_equal_p (uuid1, uuid2) == PDF_TRUE); + +} +END_TEST + +/* + * Test: pdf_uuid_equal_p_002 + * Description: + * Checks if two random-based UUIDs are equal. + * Success condition: + * Both random-based UUIDs are different. + */ +START_TEST (pdf_uuid_equal_p_002) +{ + + pdf_uuid_t uuid1; + pdf_uuid_t uuid2; + + /* Generate two time-based UUIDs */ + uuid1 = pdf_uuid_generate (PDF_UUID_RANDOM); + uuid2 = pdf_uuid_generate (PDF_UUID_RANDOM); + + fail_if(pdf_uuid_equal_p (uuid1, uuid2) == PDF_TRUE); + +} +END_TEST + +/* + * Test case creation function + */ +TCase * +test_pdf_uuid_equal_p (void) +{ + TCase *tc = tcase_create ("pdf_uuid_equal_p"); + + tcase_add_test(tc, pdf_uuid_equal_p_001); + tcase_add_test(tc, pdf_uuid_equal_p_002); + + tcase_add_checked_fixture (tc, + pdf_test_setup, + pdf_test_teardown); + + return tc; +} === added file 'torture/unit/base/types/pdf-types-uuid-generate.c' --- torture/unit/base/types/pdf-types-uuid-generate.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/types/pdf-types-uuid-generate.c 2011-05-30 10:06:30 +0000 @@ -0,0 +1,68 @@ +/* -*- mode: C -*- + * + * File: pdf-types-uuid-generate.c + * Date: Wed Apr 20 10:31:51 2011 + * + * GNU PDF Library - Unit tests for pdf_uuid_generate + * + */ + +/* Copyright (C) 2011 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 <pdf-test-common.h> +/* + * Test: pdf_uuid_generate_001 + * Description: + * Generate some UUIDs of supported types. + * Success condition: + * Generated UUIDs should be ok. + */ +START_TEST (pdf_uuid_generate_001) +{ + + pdf_uuid_t uuid_time; + pdf_uuid_t uuid_random; + + /* Create a time-based UUID */ + uuid_time = pdf_uuid_generate (PDF_UUID_TIME); + + /* Create a random-based UUID */ + uuid_random = pdf_uuid_generate (PDF_UUID_RANDOM); + +} +END_TEST + +/* + * Test case creation function + */ +TCase * +test_pdf_uuid_generate (void) +{ + TCase *tc = tcase_create ("pdf_uuid_generate"); + + tcase_add_test(tc, pdf_uuid_generate_001); + + tcase_add_checked_fixture (tc, + pdf_test_setup, + pdf_test_teardown); + + return tc; +} === added file 'torture/unit/base/types/pdf-types-uuid-string.c' --- torture/unit/base/types/pdf-types-uuid-string.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/types/pdf-types-uuid-string.c 2011-05-30 10:06:30 +0000 @@ -0,0 +1,221 @@ +/* -*- mode: C -*- + * + * File: pdf-types-uuid-string.c + * Date: Thu Apr 21 08:50:40 2011 + * + * GNU PDF Library - Unit tests for pdf_uuid_string + * + */ + +/* Copyright (C) 2011 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 <string.h> +#include <pdf.h> +#include <pdf-test-common.h> +/* + * Test: pdf_uuid_string_001 + * Description: + * Generate an UUID ascii representation in heap. + * Success condition: + * Generated UUID ascii should be ok. + */ +START_TEST (pdf_uuid_string_001) +{ + + pdf_uuid_t uuid; + pdf_char_t *buf; + pdf_char_t *ret_buf; + pdf_size_t buf_size; + + /* Crate a dynamically allocated buffer */ + buf_size = 46; + + buf = pdf_alloc (buf_size); + fail_if(buf == NULL); + + /* Generate a new UUID */ + uuid = pdf_uuid_generate (PDF_UUID_RANDOM); + + /* Get ascii representation of uuid */ + ret_buf = pdf_uuid_string (uuid, buf, buf_size); + fail_if(ret_buf == NULL); + + /* Free resources */ + pdf_dealloc (buf); + +} +END_TEST + +/* + * Test: pdf_uuid_string_002 + * Description: + * Generate an UUID ascii representation in stack. + * Success condition: + * Generated UUID ascii should be ok. + */ +START_TEST (pdf_uuid_string_002) +{ + + pdf_uuid_t uuid; + pdf_char_t *ret_buf; + pdf_size_t buf_size; + + /* Crate a statically allocated buffer */ + buf_size = 46; + + pdf_char_t buf[buf_size]; + + /* Generate a new UUID */ + uuid = pdf_uuid_generate (PDF_UUID_RANDOM); + + /* Get ascii representation of uuid */ + ret_buf = pdf_uuid_string (uuid, buf, buf_size); + fail_if(ret_buf == NULL); + +} +END_TEST + +/* + * Test: pdf_uuid_string_003 + * Description: + * Generate an UUID ascii representation, buffer size more than + * required. + * Success conditions: The buffer to store the UUID string is long + * enough. The conversion should pass. + */ +START_TEST (pdf_uuid_string_003) +{ + + pdf_uuid_t uuid; + pdf_char_t *buf; + pdf_char_t *ret_buf; + pdf_size_t buf_size; + + /* Crate the buffer */ + buf_size = 1001; + + buf = pdf_alloc (buf_size); + fail_if(buf == NULL); + + /* Generate a new UUID */ + uuid = pdf_uuid_generate (PDF_UUID_RANDOM); + + /* Get ascii representation of uuid */ + ret_buf = pdf_uuid_string (uuid, buf, buf_size); + fail_if(ret_buf == NULL); + + /* Free resources */ + pdf_dealloc (buf); + +} +END_TEST + +/* + * Test: pdf_uuid_string_004 + * Description: + * Cheks for appropriate structure of UUID ascii. + * Success conditions: The ascii structure is + * 00000000-0000-0000-0000-000000000000, where 0s match + * hexadecimal digits. + */ +START_TEST (pdf_uuid_string_004) +{ + + pdf_uuid_t uuid; + pdf_char_t *buf; + pdf_char_t *ret_buf; + pdf_size_t buf_size; + pdf_char_t *hex_digits = "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x41\x42\x43\x44\x45\x46\x61\x62\x63\x64\x65\x66"; + pdf_char_t *oc; + pdf_size_t chunk_size; + + /* Crate the buffer */ + buf_size = 46; + + buf = pdf_alloc (buf_size); + fail_if(buf == NULL); + + /* Generate a new UUID */ + uuid = pdf_uuid_generate (PDF_UUID_RANDOM); + + /* Get ascii representation of uuid */ + ret_buf = pdf_uuid_string (uuid, buf, buf_size); + fail_if(ret_buf == NULL); + + /* Check if characters are valid hex digits */ + /* Check if hex chunks have correct size */ + /* Check if scores are in correct positions */ + + chunk_size = strspn(buf, hex_digits); + fail_if(chunk_size != 8); + + oc = strchr(buf, '-'); + fail_if(oc == NULL); + fail_if(oc-buf != 8); + + chunk_size = strspn(oc+1, hex_digits); + fail_if(chunk_size != 4); + + oc = strchr(oc+1, '-'); + fail_if(oc == NULL); + fail_if(oc-buf != 13); + + chunk_size = strspn(oc+1, hex_digits); + fail_if(chunk_size != 4); + + oc = strchr(oc+1, '-'); + fail_if(oc == NULL); + fail_if(oc-buf != 18); + + chunk_size = strspn(oc+1, hex_digits); + fail_if(chunk_size != 4); + + oc = strchr(oc+1, '-'); + fail_if(oc == NULL); + fail_if(oc-buf != 23); + + chunk_size = strspn(oc+1, hex_digits); + fail_if(chunk_size != 12); + + /* Free resources */ + pdf_dealloc (buf); + +} +END_TEST + +/* + * Test case creation function + */ +TCase * +test_pdf_uuid_string (void) +{ + TCase *tc = tcase_create ("pdf_uuid_string"); + + tcase_add_test(tc, pdf_uuid_string_001); + tcase_add_test(tc, pdf_uuid_string_002); + tcase_add_test(tc, pdf_uuid_string_003); + tcase_add_test(tc, pdf_uuid_string_004); + + tcase_add_checked_fixture (tc, + pdf_test_setup, + pdf_test_teardown); + + return tc; +} === modified file 'torture/unit/base/types/tsuite-types.c' --- torture/unit/base/types/tsuite-types.c 2011-02-24 22:52:23 +0000 +++ torture/unit/base/types/tsuite-types.c 2011-05-30 10:06:30 +0000 @@ -27,6 +27,10 @@ #include <check.h> #include <pdf-test-common.h> +extern TCase *test_pdf_uuid_generate (void); +extern TCase *test_pdf_uuid_string (void); +extern TCase *test_pdf_uuid_equal_p (void); + Suite * tsuite_types () { @@ -34,6 +38,10 @@ s = suite_create("types"); + suite_add_tcase (s, test_pdf_uuid_generate ()); + suite_add_tcase (s, test_pdf_uuid_string ()); + suite_add_tcase (s, test_pdf_uuid_equal_p ()); + return s; } # Begin bundle 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 1U1sIERmzVHmCf+DqKn/xdyRThQkO+x9iwA=