Browse Source

Re-enable the partial-input test for zstd.

There were two issues here: first, zstd didn't exhibit the right
behavior unless it got a very large input.  That's fine.

The second issue was a genuine bug, fixed by 39cfaba9e26d1ca0a.
Nick Mathewson 7 years ago
parent
commit
ba9f235e17
1 changed files with 27 additions and 24 deletions
  1. 27 24
      src/test/test_util.c

+ 27 - 24
src/test/test_util.c

@@ -2274,31 +2274,34 @@ test_util_compress_impl(compress_method_t method)
              "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0",
              (strlen(buf1)+1)*2);
 
-  if (method != ZSTD_METHOD) {
-    /* Check whether we can uncompress partial strings unless we are Zstandard,
-     * which doesn't seem to support this. */
-
-    tor_free(buf1);
-    tor_free(buf2);
-    tor_free(buf3);
-
-    buf1 =
-      tor_strdup("String with low redundancy that won't be compressed much.");
-    tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method));
-    tt_int_op(len1, OP_GT, 16);
-    /* when we allow an incomplete string, we should succeed.*/
-    tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1-16,
-                              method, 0, LOG_INFO));
-    tt_assert(len2 > 5);
-    buf3[len2]='\0';
-    tt_assert(!strcmpstart(buf1, buf3));
-
-    /* when we demand a complete string, this must fail. */
-    tor_free(buf3);
-    tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16,
-                             method, 1, LOG_INFO));
-    tt_assert(buf3 == NULL);
+
+  /* Check whether we can uncompress partial strings */
+
+  tor_free(buf1);
+  tor_free(buf2);
+  tor_free(buf3);
+
+  size_t b1len = 1<<10;
+  if (method == ZSTD_METHOD) {
+    // zstd needs a big input before it starts generating output that it
+    // can partially decompress.
+    b1len = 1<<18;
   }
+  buf1 = tor_malloc(b1len);
+  crypto_rand(buf1, b1len);
+  tt_assert(!tor_compress(&buf2, &len1, buf1, b1len, method));
+  tt_int_op(len1, OP_GT, 16);
+  /* when we allow an incomplete output we should succeed.*/
+  tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1-16,
+                            method, 0, LOG_INFO));
+  tt_int_op(len2, OP_GT, 5);
+  tt_int_op(len2, OP_LE, len1);
+  tt_assert(fast_memeq(buf1, buf3, len2));
+  /* when we demand a complete output, this must fail. */
+  tor_free(buf3);
+  tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16,
+                           method, 1, LOG_INFO));
+  tt_assert(buf3 == NULL);
 
  done:
   tor_free(buf1);