From c84874ca8d8c6e7253b00955640e024d818c6ee9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Jul 2023 13:24:07 +0530 Subject: [PATCH] Add tests for the xxhash based hashers --- kittens/transfer/algorithm.c | 8 ++++++++ kitty_tests/file_transmission.py | 11 ++++++++++- tools/rsync/api_test.go | 18 +++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/kittens/transfer/algorithm.c b/kittens/transfer/algorithm.c index b54c58cf0..f05fec73c 100644 --- a/kittens/transfer/algorithm.c +++ b/kittens/transfer/algorithm.c @@ -290,6 +290,13 @@ digest(Hasher *self, PyObject *args UNUSED) { return ans; } +static PyObject* +digest64(Hasher *self, PyObject *args UNUSED) { + if (self->h.digest64 == NULL) { PyErr_SetString(PyExc_TypeError, "Does not support 64-bit digests"); return NULL; } + unsigned long long a = self->h.digest64(self->h.state); + return PyLong_FromUnsignedLongLong(a); +} + static PyObject* hexdigest(Hasher *self, PyObject *args UNUSED) { uint8_t digest[64]; char hexdigest[128]; @@ -314,6 +321,7 @@ Hasher_name(Hasher* self, void* closure UNUSED) { return PyUnicode_FromString(se static PyMethodDef Hasher_methods[] = { METHODB(update, METH_O), METHODB(digest, METH_NOARGS), + METHODB(digest64, METH_NOARGS), METHODB(hexdigest, METH_NOARGS), METHODB(reset, METH_NOARGS), {NULL} /* Sentinel */ diff --git a/kitty_tests/file_transmission.py b/kitty_tests/file_transmission.py index afb99c8ef..3aafd16dd 100644 --- a/kitty_tests/file_transmission.py +++ b/kitty_tests/file_transmission.py @@ -11,7 +11,7 @@ from pathlib import Path from kittens.transfer.main import parse_transfer_args from kittens.transfer.receive import File, files_for_receive -from kittens.transfer.rsync import decode_utf8_buffer, parse_ftc +from kittens.transfer.rsync import decode_utf8_buffer, parse_ftc, Hasher from kittens.transfer.utils import cwd_path, expand_home, home_path, set_paths from kitty.file_transmission import Action, Compression, FileTransmissionCommand, FileType, TransmissionType, ZlibDecompressor, iter_file_metadata from kitty.file_transmission import TestFileTransmission as FileTransmission @@ -425,3 +425,12 @@ class TestFileTransmission(BaseTest): self.assertEqual(files[1].remote_target, files[2].remote_id) self.assertEqual(files[3].ftype, FileType.link) self.assertEqual(files[3].remote_target, files[2].remote_id) + + def test_rsync_hashers(self): + h = Hasher("xxh3-64") + h.update(b'abcd') + self.assertEqual(h.hexdigest(), '6497a96f53a89890') + self.assertEqual(h.digest64(), 7248448420886124688) + h128 = Hasher("xxh3-128") + h128.update(b'abcd') + self.assertEqual(h128.hexdigest(), '8d6b60383dfa90c21be79eecd1b1353d') diff --git a/tools/rsync/api_test.go b/tools/rsync/api_test.go index 51a46b9ab..2dd8c715d 100644 --- a/tools/rsync/api_test.go +++ b/tools/rsync/api_test.go @@ -4,6 +4,7 @@ package rsync import ( "bytes" + "encoding/hex" "fmt" "io" "strconv" @@ -176,5 +177,20 @@ func TestRsyncRoundtrip(t *testing.T) { run_roundtrip_test(t, src_data, changed, num_of_patches, total_patch_size) run_roundtrip_test(t, src_data, changed[:len(changed)-3], num_of_patches, total_patch_size) run_roundtrip_test(t, src_data, append(changed, "xyz..."...), num_of_patches, total_patch_size) - +} + +func TestRsyncHashers(t *testing.T) { + h := new_xxh3_64() + h.Write([]byte("abcd")) + if diff := cmp.Diff(hex.EncodeToString(h.Sum(nil)), `6497a96f53a89890`); diff != "" { + t.Fatalf(diff) + } + if diff := cmp.Diff(h.Sum64(), uint64(7248448420886124688)); diff != "" { + t.Fatalf(diff) + } + h2 := new_xxh3_128() + h2.Write([]byte("abcd")) + if diff := cmp.Diff(hex.EncodeToString(h2.Sum(nil)), `8d6b60383dfa90c21be79eecd1b1353d`); diff != "" { + t.Fatalf(diff) + } }