-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 04.08.2011 19:05, Georg Gottleuber wrote:
> On 04.08.2011 15:19, Aleksander Morgado wrote:
>> Does it include a testcase to catch the additional unspecified 0 byte at
>> the end of the encoded lzw stream thingy? That would be great to have.
> 
> Not yet. But I can do this.

Attached you find a new version of tests for LZW filter. It includes the
example from PDF ISO 32000-1 standard which is sensitive of additional 0
bytes at the end.

Please merge it.

Regards,
Georg

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk5KLPUACgkQ5sLITM1qIaJ6YwCgpGDgme1mXwaD+Agz8ZIZHkse
P8UAn2tDK71AdI9/SLepVQpxKCZHcueD
=cYqF
-----END PGP SIGNATURE-----
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: georg.gottleu...@uni-ulm.de-20110816083234-\
#   jl6mp5lelp22dkpf
# target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/
# testament_sha1: c3027eb278b71bad634e77e616ee249b10455681
# timestamp: 2011-08-16 10:32:40 +0200
# base_revision_id: jema...@gnu.org-20110804134913-4ri9zpgl9ser43xl
# 
# Begin patch
=== modified file 'ChangeLog'
--- ChangeLog   2011-08-04 13:49:13 +0000
+++ ChangeLog   2011-08-16 08:32:34 +0000
@@ -1,3 +1,8 @@
+2011-08-16  Georg Gottleuber <georg.gottleu...@uni-ulm.de>
+
+       torture,stm: Tests created for LZW filter
+       * torture/unit/base/stm/pdf-stm-rw-filter-lzw.c: New file with LZW tests
+
 2011-08-04  Georg Gottleuber <georg.gottleu...@uni-ulm.de>
 
        base,stm: fix bug in lzw filter.

=== modified file 'torture/unit/Makefile.am'
--- torture/unit/Makefile.am    2011-06-24 16:18:43 +0000
+++ torture/unit/Makefile.am    2011-08-03 10:02:47 +0000
@@ -76,7 +76,8 @@
                  base/stm/pdf-stm-rw-filter-a85.c \
                  base/stm/pdf-stm-rw-filter-flate.c \
                  base/stm/pdf-stm-rw-filter-v2.c \
-                 base/stm/pdf-stm-rw-filter-aesv2.c
+                 base/stm/pdf-stm-rw-filter-aesv2.c \
+                 base/stm/pdf-stm-rw-filter-lzw.c 
 
 TEST_SUITE_HASH = base/hash/pdf-hash-new.c \
                   base/hash/pdf-hash-add.c \

=== added file 'torture/unit/base/stm/pdf-stm-rw-filter-lzw.c'
--- torture/unit/base/stm/pdf-stm-rw-filter-lzw.c       1970-01-01 00:00:00 
+0000
+++ torture/unit/base/stm/pdf-stm-rw-filter-lzw.c       2011-08-16 08:32:34 
+0000
@@ -0,0 +1,242 @@
+/* -*- mode: C -*-
+ *
+ *       File:         pdf-stm-read-filter-lzw.c
+ *       Date:         Fr July 29 15:50:09 2011
+ *
+ *       GNU PDF Library - Unit tests for LZW filter.
+ *
+ */
+
+/* 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 <string.h>
+#include <check.h>
+#include <pdf.h>
+#include <pdf-test-common.h>
+#include "pdf-stm-test-common.h"
+
+struct test_strings_s {
+  /* LZW-Encoded string */
+  pdf_size_t encoded_size;
+  const pdf_char_t *encoded;
+  /* Decoded string */
+  pdf_size_t decoded_size;
+  const pdf_char_t *decoded;
+};
+
+static const struct test_strings_s test_strings[] = {
+  {
+    240,
+    "\x80\x0c\x46\x43\x21\x9c\x14\x69\x07\x1a\x0d\x61\x50\xa1\xb4\x36"
+    "\x1c\x37\x88\x44\x46\xe3\x88\xa4\x56\x28\x39\x8c\x46\x63\x23\x08"
+    "\x14\x12\x0d\x08\x85\xc3\x21\xd0\xd8\x94\x46\x2d\x16\x8d\x4a\x63"
+    "\x90\x38\x28\xce\x11\x09\x90\xc8\xe4\x92\x58\x9c\x9e\x2f\x29\x8d"
+    "\xc7\x65\xb2\xf9\x08\xd6\x64\x36\x9a\x4d\x66\xd3\x89\xcc\xb2\x3f"
+    "\x07\x9e\xcf\xe8\x33\x69\xbd\x12\x57\x1e\x97\x48\x26\x33\x2a\x5d"
+    "\x32\x89\x18\xa7\xce\xea\x50\xba\x54\xd2\x98\x38\xab\x8e\x6b\x34"
+    "\x79\x85\x72\xa9\x5e\xab\x55\xec\x75\x1a\x45\x4e\x47\x55\xa1\xda"
+    "\xa7\x56\x4a\x4d\x9e\x4b\x5f\xb0\xda\xe7\x96\xe8\x7d\xa2\xe3\x4e"
+    "\xb9\xdb\x2c\xb2\x2b\x7d\xfa\x4f\x79\xc0\xde\xec\xd8\x5b\xbd\xa7"
+    "\x01\x46\xc1\x5d\x71\x91\x2b\xc5\xcb\x21\x8a\xc2\x5f\x71\xb7\xf9"
+    "\xc5\xea\xb7\x99\x99\xe6\xf0\xf9\x6a\x86\x62\x7d\x76\xca\x63\xb3"
+    "\xb8\x9c\xfe\x9f\x27\x26\xd5\x4a\xb5\x96\xdc\x5e\x6b\x53\x9c\xd9"
+    "\x65\xf5\xb5\xdd\x14\xa3\x49\x5a\xda\x68\x28\x18\x6d\xf6\x3f\x4b"
+    "\xbb\xd4\x6c\x37\x11\xac\xf7\x07\x5d\xb6\xe5\x68\xe9\xc0\x08\x08",
+    1059,
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+    "1223334444555556666667777777888888889999999990"
+  },
+  { /* LZW encoding example from PDF ISO 32000-1 standard */
+    9,
+    "\x80\x0B\x60\x50\x22\x0C\x0C\x85\x01",
+    10,
+    "\x2d\x2d\x2d\x2d\x2d\x41\x2d\x2d\x2d\x42"
+  },
+  { 0, NULL, 0, NULL }
+};
+
+
+static const struct test_params_s tests_params[] = {
+  /* No   Test type          Test operation   Loop read size       Cache size 
*/
+  {     1,   TEST_TYPE_DECODER, TEST_OP_READ,    LOOP_RW_SIZE_ONE,    0 },
+  {     2,   TEST_TYPE_DECODER, TEST_OP_READ,    LOOP_RW_SIZE_TWO,    0 },
+  {     3,   TEST_TYPE_DECODER, TEST_OP_READ,    LOOP_RW_SIZE_HALF,   0 },
+  {     4,   TEST_TYPE_DECODER, TEST_OP_READ,    LOOP_RW_SIZE_EXACT,  0 },
+  {     5,   TEST_TYPE_DECODER, TEST_OP_READ,    LOOP_RW_SIZE_DOUBLE, 0 },
+
+  {     6,   TEST_TYPE_ENCODER, TEST_OP_READ,    LOOP_RW_SIZE_ONE,    0 },
+  {     7,   TEST_TYPE_ENCODER, TEST_OP_READ,    LOOP_RW_SIZE_TWO,    0 },
+  {     8,   TEST_TYPE_ENCODER, TEST_OP_READ,    LOOP_RW_SIZE_HALF,   0 },
+  {     9,   TEST_TYPE_ENCODER, TEST_OP_READ,    LOOP_RW_SIZE_EXACT,  0 },
+  {     10,  TEST_TYPE_ENCODER, TEST_OP_READ,    LOOP_RW_SIZE_DOUBLE, 0 },
+
+  {     11,  TEST_TYPE_DECODER, TEST_OP_WRITE,   LOOP_RW_SIZE_ONE,    0 },
+  {     12,  TEST_TYPE_DECODER, TEST_OP_WRITE,   LOOP_RW_SIZE_TWO,    0 },
+  {     13,  TEST_TYPE_DECODER, TEST_OP_WRITE,   LOOP_RW_SIZE_HALF,   0 },
+  {     14,  TEST_TYPE_DECODER, TEST_OP_WRITE,   LOOP_RW_SIZE_EXACT,  0 },
+  {     15,  TEST_TYPE_DECODER, TEST_OP_WRITE,   LOOP_RW_SIZE_DOUBLE, 0 },
+
+  {     16,  TEST_TYPE_ENCODER, TEST_OP_WRITE,   LOOP_RW_SIZE_ONE,    0 },
+  {     17,  TEST_TYPE_ENCODER, TEST_OP_WRITE,   LOOP_RW_SIZE_TWO,    0 },
+  {     18,  TEST_TYPE_ENCODER, TEST_OP_WRITE,   LOOP_RW_SIZE_HALF,   0 },
+  {     19,  TEST_TYPE_ENCODER, TEST_OP_WRITE,   LOOP_RW_SIZE_EXACT,  0 },
+  {     20,  TEST_TYPE_ENCODER, TEST_OP_WRITE,   LOOP_RW_SIZE_DOUBLE, 0 },
+};
+
+static void
+common_test_lzw (const pdf_char_t *function_name,
+                   int               test_index)
+{
+  int i;
+  const struct test_params_s *params = &tests_params[test_index - 1];
+
+  /* Sanity check */
+  fail_if (test_index != params->idx);
+
+  for (i = 0; test_strings[i].encoded; i++)
+    {
+      pdf_stm_test_common (function_name,
+                           params->type,
+                           params->operation,
+                           (params->type == TEST_TYPE_ENCODER ?
+                            PDF_STM_FILTER_LZW_ENC :
+                            PDF_STM_FILTER_LZW_DEC),
+                           NULL,
+                           params->stm_cache_size,
+                           params->loop_size,
+                           test_strings[i].decoded,
+                           test_strings[i].decoded_size,
+                           test_strings[i].encoded,
+                           test_strings[i].encoded_size);
+    }
+}
+
+/*
+ * Test: pdf_stm_read_filter_lzw_dec_001-005
+ * Description:
+ *   Test LZW decoder filter with different read loop sizes
+ * Success condition:
+ *   The read data should be ok.
+ */
+START_TEST (pdf_stm_read_filter_lzw_dec_001) { common_test_lzw (__FUNCTION__,  
1); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_dec_002) { common_test_lzw (__FUNCTION__,  
2); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_dec_003) { common_test_lzw (__FUNCTION__,  
3); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_dec_004) { common_test_lzw (__FUNCTION__,  
4); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_dec_005) { common_test_lzw (__FUNCTION__,  
5); } END_TEST
+
+/*
+ * Test: pdf_stm_read_filter_lzw_enc_001-005
+ * Description:
+ *   Test LZW encoder filter with different read loop sizes
+ * Success condition:
+ *   The read data should be ok.
+ */
+START_TEST (pdf_stm_read_filter_lzw_enc_001) { common_test_lzw (__FUNCTION__,  
6); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_enc_002) { common_test_lzw (__FUNCTION__,  
7); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_enc_003) { common_test_lzw (__FUNCTION__,  
8); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_enc_004) { common_test_lzw (__FUNCTION__,  
9); } END_TEST
+START_TEST (pdf_stm_read_filter_lzw_enc_005) { common_test_lzw (__FUNCTION__, 
10); } END_TEST
+
+/*
+ * Test: pdf_stm_write_filter_lzw_dec_001-005
+ * Description:
+ *   Test LZW decoder filter with different write loop sizes
+ * Success condition:
+ *   The written data should be ok.
+ */
+START_TEST (pdf_stm_write_filter_lzw_dec_001) { common_test_lzw (__FUNCTION__, 
11); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_dec_002) { common_test_lzw (__FUNCTION__, 
12); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_dec_003) { common_test_lzw (__FUNCTION__, 
13); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_dec_004) { common_test_lzw (__FUNCTION__, 
14); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_dec_005) { common_test_lzw (__FUNCTION__, 
15); } END_TEST
+
+/*
+ * Test: pdf_stm_write_filter_lzw_enc_001-005
+ * Description:
+ *   Test LZW encoder filter with different write loop sizes
+ * Success condition:
+ *   The written data should be ok.
+ */
+START_TEST (pdf_stm_write_filter_lzw_enc_001) { common_test_lzw (__FUNCTION__, 
16); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_enc_002) { common_test_lzw (__FUNCTION__, 
17); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_enc_003) { common_test_lzw (__FUNCTION__, 
18); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_enc_004) { common_test_lzw (__FUNCTION__, 
19); } END_TEST
+START_TEST (pdf_stm_write_filter_lzw_enc_005) { common_test_lzw (__FUNCTION__, 
20); } END_TEST
+
+/*
+ * Test case creation functions
+ */
+
+TCase *
+test_pdf_stm_rw_filter_lzw (void)
+{
+  TCase *tc = tcase_create ("pdf_stm_rw_filter_lzw");
+
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_001);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_002);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_003);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_004);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_005);
+
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_001);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_002);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_003);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_004);
+  tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_005);
+
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_001);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_002);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_003);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_004);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_005);
+
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_001);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_002);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_003);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_004);
+  tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_005);
+
+  tcase_add_checked_fixture (tc,
+                             pdf_test_setup,
+                             pdf_test_teardown);
+  return tc;
+}
+
+/* End of pdf-stm-read-filter-lzw.c */

=== modified file 'torture/unit/base/stm/tsuite-stm.c'
--- torture/unit/base/stm/tsuite-stm.c  2011-05-17 22:17:31 +0000
+++ torture/unit/base/stm/tsuite-stm.c  2011-08-03 10:02:47 +0000
@@ -45,6 +45,7 @@
 extern TCase *test_pdf_stm_rw_filter_flate (void);
 extern TCase *test_pdf_stm_rw_filter_v2 (void);
 extern TCase *test_pdf_stm_rw_filter_aesv2 (void);
+extern TCase *test_pdf_stm_rw_filter_lzw (void);
 
 Suite *
 tsuite_stm ()
@@ -70,6 +71,7 @@
   suite_add_tcase (s, test_pdf_stm_rw_filter_v2 ());
   suite_add_tcase (s, test_pdf_stm_rw_filter_aesv2 ());
   suite_add_tcase (s, test_pdf_stm_flush ());
+  suite_add_tcase (s, test_pdf_stm_rw_filter_lzw ());
 
   return s;
 }

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

Reply via email to