summaryrefslogtreecommitdiff
path: root/subversion/tests/libsvn_subr/checksum-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/tests/libsvn_subr/checksum-test.c')
-rw-r--r--subversion/tests/libsvn_subr/checksum-test.c248
1 files changed, 145 insertions, 103 deletions
diff --git a/subversion/tests/libsvn_subr/checksum-test.c b/subversion/tests/libsvn_subr/checksum-test.c
index c5e2409..4c6d993 100644
--- a/subversion/tests/libsvn_subr/checksum-test.c
+++ b/subversion/tests/libsvn_subr/checksum-test.c
@@ -27,38 +27,47 @@
#include "svn_error.h"
#include "svn_io.h"
-#include "private/svn_pseudo_md5.h"
#include "../svn_test.h"
+/* Verify that DIGEST of checksum type KIND can be parsed and
+ * converted back to a string matching DIGEST. NAME will be used
+ * to identify the type of checksum in error messages.
+ */
static svn_error_t *
-test_checksum_parse(apr_pool_t *pool)
+checksum_parse_kind(const char *digest,
+ svn_checksum_kind_t kind,
+ const char *name,
+ apr_pool_t *pool)
{
- const char *md5_digest = "8518b76f7a45fe4de2d0955085b41f98";
- const char *sha1_digest = "74d82379bcc6771454377db03b912c2b62704139";
const char *checksum_display;
svn_checksum_t *checksum;
- SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_md5, md5_digest, pool));
+ SVN_ERR(svn_checksum_parse_hex(&checksum, kind, digest, pool));
checksum_display = svn_checksum_to_cstring_display(checksum, pool);
- if (strcmp(checksum_display, md5_digest) != 0)
+ if (strcmp(checksum_display, digest) != 0)
return svn_error_createf
(SVN_ERR_CHECKSUM_MISMATCH, NULL,
- "verify-checksum: md5 checksum mismatch:\n"
+ "verify-checksum: %s checksum mismatch:\n"
" expected: %s\n"
- " actual: %s\n", md5_digest, checksum_display);
+ " actual: %s\n", name, digest, checksum_display);
- SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1, sha1_digest,
- pool));
- checksum_display = svn_checksum_to_cstring_display(checksum, pool);
+ return SVN_NO_ERROR;
+}
- if (strcmp(checksum_display, sha1_digest) != 0)
- return svn_error_createf
- (SVN_ERR_CHECKSUM_MISMATCH, NULL,
- "verify-checksum: sha1 checksum mismatch:\n"
- " expected: %s\n"
- " actual: %s\n", sha1_digest, checksum_display);
+static svn_error_t *
+test_checksum_parse(apr_pool_t *pool)
+{
+ SVN_ERR(checksum_parse_kind("8518b76f7a45fe4de2d0955085b41f98",
+ svn_checksum_md5, "md5", pool));
+ SVN_ERR(checksum_parse_kind("74d82379bcc6771454377db03b912c2b62704139",
+ svn_checksum_sha1, "sha1", pool));
+ SVN_ERR(checksum_parse_kind("deadbeef",
+ svn_checksum_fnv1a_32, "fnv-1a", pool));
+ SVN_ERR(checksum_parse_kind("cafeaffe",
+ svn_checksum_fnv1a_32x4,
+ "modified fnv-1a", pool));
return SVN_NO_ERROR;
}
@@ -66,94 +75,97 @@ test_checksum_parse(apr_pool_t *pool)
static svn_error_t *
test_checksum_empty(apr_pool_t *pool)
{
- svn_checksum_t *checksum;
- char data = '\0';
-
- checksum = svn_checksum_empty_checksum(svn_checksum_md5, pool);
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
-
- checksum = svn_checksum_empty_checksum(svn_checksum_sha1, pool);
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ svn_checksum_kind_t kind;
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ {
+ svn_checksum_t *checksum;
+ char data = '\0';
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, &data, 0, pool));
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ checksum = svn_checksum_empty_checksum(kind, pool);
+ SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
- SVN_ERR(svn_checksum(&checksum, svn_checksum_sha1, &data, 0, pool));
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ SVN_ERR(svn_checksum(&checksum, kind, &data, 0, pool));
+ SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ }
return SVN_NO_ERROR;
}
+/* Verify that "zero" checksums work properly for the given checksum KIND.
+ */
static svn_error_t *
-test_pseudo_md5(apr_pool_t *pool)
+zero_match_kind(svn_checksum_kind_t kind, apr_pool_t *pool)
{
- apr_uint32_t input[16] = { 0 };
- apr_uint32_t digest_15[4] = { 0 };
- apr_uint32_t digest_31[4] = { 0 };
- apr_uint32_t digest_63[4] = { 0 };
- svn_checksum_t *checksum;
+ svn_checksum_t *zero;
+ svn_checksum_t *A;
+ svn_checksum_t *B;
- /* input is all 0s but the hash shall be different
- (due to different input sizes)*/
- svn__pseudo_md5_15(digest_15, input);
- svn__pseudo_md5_31(digest_31, input);
- svn__pseudo_md5_63(digest_63, input);
+ zero = svn_checksum_create(kind, pool);
+ SVN_ERR(svn_checksum_clear(zero));
+ SVN_ERR(svn_checksum(&A, kind, "A", 1, pool));
+ SVN_ERR(svn_checksum(&B, kind, "B", 1, pool));
- SVN_TEST_ASSERT(memcmp(digest_15, digest_31, sizeof(digest_15)));
- SVN_TEST_ASSERT(memcmp(digest_15, digest_63, sizeof(digest_15)));
- SVN_TEST_ASSERT(memcmp(digest_31, digest_63, sizeof(digest_15)));
+ /* Different non-zero don't match. */
+ SVN_TEST_ASSERT(!svn_checksum_match(A, B));
- /* the checksums shall also be different from "proper" MD5 */
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 15, pool));
- SVN_TEST_ASSERT(memcmp(digest_15, checksum->digest, sizeof(digest_15)));
+ /* Zero matches anything of the same kind. */
+ SVN_TEST_ASSERT(svn_checksum_match(A, zero));
+ SVN_TEST_ASSERT(svn_checksum_match(zero, B));
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 31, pool));
- SVN_TEST_ASSERT(memcmp(digest_31, checksum->digest, sizeof(digest_15)));
+ return SVN_NO_ERROR;
+}
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 63, pool));
- SVN_TEST_ASSERT(memcmp(digest_63, checksum->digest, sizeof(digest_15)));
+static svn_error_t *
+zero_match(apr_pool_t *pool)
+{
+ svn_checksum_kind_t kind;
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ SVN_ERR(zero_match_kind(kind, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
-zero_match(apr_pool_t *pool)
+zero_cross_match(apr_pool_t *pool)
{
- svn_checksum_t *zero_md5;
- svn_checksum_t *zero_sha1;
- svn_checksum_t *A_md5;
- svn_checksum_t *B_md5;
- svn_checksum_t *A_sha1;
- svn_checksum_t *B_sha1;
+ svn_checksum_kind_t i_kind;
+ svn_checksum_kind_t k_kind;
+ for (i_kind = svn_checksum_md5;
+ i_kind <= svn_checksum_fnv1a_32x4;
+ ++i_kind)
+ {
+ svn_checksum_t *i_zero;
+ svn_checksum_t *i_A;
- zero_md5 = svn_checksum_create(svn_checksum_md5, pool);
- SVN_ERR(svn_checksum_clear(zero_md5));
- SVN_ERR(svn_checksum(&A_md5, svn_checksum_md5, "A", 1, pool));
- SVN_ERR(svn_checksum(&B_md5, svn_checksum_md5, "B", 1, pool));
+ i_zero = svn_checksum_create(i_kind, pool);
+ SVN_ERR(svn_checksum_clear(i_zero));
+ SVN_ERR(svn_checksum(&i_A, i_kind, "A", 1, pool));
- zero_sha1 = svn_checksum_create(svn_checksum_sha1, pool);
- SVN_ERR(svn_checksum_clear(zero_sha1));
- SVN_ERR(svn_checksum(&A_sha1, svn_checksum_sha1, "A", 1, pool));
- SVN_ERR(svn_checksum(&B_sha1, svn_checksum_sha1, "B", 1, pool));
+ for (k_kind = svn_checksum_md5;
+ k_kind <= svn_checksum_fnv1a_32x4;
+ ++k_kind)
+ {
+ svn_checksum_t *k_zero;
+ svn_checksum_t *k_A;
+ if (i_kind == k_kind)
+ continue;
- /* Different non-zero don't match. */
- SVN_TEST_ASSERT(!svn_checksum_match(A_md5, B_md5));
- SVN_TEST_ASSERT(!svn_checksum_match(A_sha1, B_sha1));
- SVN_TEST_ASSERT(!svn_checksum_match(A_md5, A_sha1));
- SVN_TEST_ASSERT(!svn_checksum_match(A_md5, B_sha1));
+ k_zero = svn_checksum_create(k_kind, pool);
+ SVN_ERR(svn_checksum_clear(k_zero));
+ SVN_ERR(svn_checksum(&k_A, k_kind, "A", 1, pool));
- /* Zero matches anything of the same kind. */
- SVN_TEST_ASSERT(svn_checksum_match(A_md5, zero_md5));
- SVN_TEST_ASSERT(svn_checksum_match(zero_md5, B_md5));
- SVN_TEST_ASSERT(svn_checksum_match(A_sha1, zero_sha1));
- SVN_TEST_ASSERT(svn_checksum_match(zero_sha1, B_sha1));
+ /* Different non-zero don't match. */
+ SVN_TEST_ASSERT(!svn_checksum_match(i_A, k_A));
+
+ /* Zero doesn't match anything of a different kind... */
+ SVN_TEST_ASSERT(!svn_checksum_match(i_zero, k_A));
+ SVN_TEST_ASSERT(!svn_checksum_match(i_A, k_zero));
- /* Zero doesn't match anything of a different kind... */
- SVN_TEST_ASSERT(!svn_checksum_match(zero_md5, A_sha1));
- SVN_TEST_ASSERT(!svn_checksum_match(zero_sha1, A_md5));
- /* ...even another zero. */
- SVN_TEST_ASSERT(!svn_checksum_match(zero_md5, zero_sha1));
+ /* ...even another zero. */
+ SVN_TEST_ASSERT(!svn_checksum_match(i_zero, k_zero));
+ }
+ }
return SVN_NO_ERROR;
}
@@ -163,12 +175,14 @@ zlib_expansion_test(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
const char *data_path;
+ const char *srcdir;
svn_stringbuf_t *deflated;
Byte dst_buffer[256 * 1024];
Byte *src_buffer;
- apr_size_t sz;
+ uInt sz;
- data_path = svn_dirent_join(opts->srcdir, "zlib.deflated", pool);
+ SVN_ERR(svn_test_get_srcdir(&srcdir, opts, pool));
+ data_path = svn_dirent_join(srcdir, "zlib.deflated", pool);
SVN_ERR(svn_stringbuf_from_file2(&deflated, data_path, pool));
src_buffer = (Byte*)deflated->data;
@@ -177,6 +191,7 @@ zlib_expansion_test(const svn_test_opts_t *opts,
for (sz = 1; sz < 256; sz++)
{
z_stream stream;
+ uLong crc = crc32(0, Z_NULL, 0);
memset(&stream, 0, sizeof(stream));
inflateInit2(&stream, -15 /* DEFLATE_WINDOW_SIZE */);
@@ -193,12 +208,15 @@ zlib_expansion_test(const svn_test_opts_t *opts,
{
return svn_error_createf(
SVN_ERR_TEST_FAILED, NULL,
- "Failure decompressing with blocksize %d", (int)sz);
+ "Failure decompressing with blocksize %u", sz);
}
+ crc = crc32(crc, dst_buffer, sizeof(dst_buffer) - stream.avail_out);
+ stream.avail_out = sizeof(dst_buffer);
+ stream.next_out = dst_buffer;
stream.avail_in += sz;
} while (stream.next_in + stream.avail_in < src_buffer + deflated->len);
- stream.avail_in = (src_buffer + deflated->len) - stream.next_in;
+ stream.avail_in = (uInt) (deflated->len - stream.total_in);
{
int zr = inflate(&stream, Z_NO_FLUSH);
@@ -207,8 +225,9 @@ zlib_expansion_test(const svn_test_opts_t *opts,
{
return svn_error_createf(
SVN_ERR_TEST_FAILED, NULL,
- "Final flush failed with blocksize %d", (int)sz);
+ "Final flush failed with blocksize %u", sz);
}
+ crc = crc32(crc, dst_buffer, sizeof(dst_buffer) - stream.avail_out);
zr = inflateEnd(&stream);
@@ -216,42 +235,65 @@ zlib_expansion_test(const svn_test_opts_t *opts,
{
return svn_error_createf(
SVN_ERR_TEST_FAILED, NULL,
- "End of stream handling failed with blocksize %d",
- (int)sz);
+ "End of stream handling failed with blocksize %u",
+ sz);
}
}
- {
- apr_uint32_t crc = crc32(0, dst_buffer, stream.total_out);
-
- if (stream.total_out != 242014 || crc != 0x8f03d934)
- {
- return svn_error_createf(
- SVN_ERR_TEST_FAILED, NULL,
- "Decompressed data doesn't match expected size or crc with "
- "blocksize %d: Found crc32=0x%08x, size=%d.\n"
- "Verify your ZLib installation, as this should never happen",
- (int)sz, (unsigned)crc, (int)stream.total_out);
- }
- }
+ if (stream.total_out != 242014 || crc != 0x8f03d934)
+ {
+ return svn_error_createf(
+ SVN_ERR_TEST_FAILED, NULL,
+ "Decompressed data doesn't match expected size or crc with "
+ "blocksize %u: Found crc32=0x%08lx, size=%lu.\n"
+ "Verify your ZLib installation, as this should never happen",
+ sz, crc, stream.total_out);
+ }
}
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_serialization(apr_pool_t *pool)
+{
+ svn_checksum_kind_t kind;
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ {
+ const svn_checksum_t *parsed_checksum;
+ svn_checksum_t *checksum = svn_checksum_empty_checksum(kind, pool);
+ const char *serialized = svn_checksum_serialize(checksum, pool, pool);
+
+ SVN_ERR(svn_checksum_deserialize(&parsed_checksum, serialized, pool,
+ pool));
+
+ SVN_TEST_ASSERT(parsed_checksum->kind == kind);
+ SVN_TEST_ASSERT(svn_checksum_match(checksum, parsed_checksum));
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_checksum_parse,
"checksum parse"),
SVN_TEST_PASS2(test_checksum_empty,
"checksum emptiness"),
- SVN_TEST_PASS2(test_pseudo_md5,
- "pseudo-md5 compatibility"),
SVN_TEST_PASS2(zero_match,
"zero checksum matching"),
SVN_TEST_OPTS_PASS(zlib_expansion_test,
"zlib expansion test (zlib regression)"),
+ SVN_TEST_PASS2(zero_cross_match,
+ "zero checksum cross-type matching"),
+ SVN_TEST_PASS2(test_serialization,
+ "checksum (de-)serialization"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN