TigerTree_test.cc 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "catch.hpp"
  2. #include "TigerTree.hh"
  3. #include "tiger.hh"
  4. #include <cstring>
  5. using namespace openmsx;
  6. struct TTTestData final : public TTData
  7. {
  8. uint8_t* getData(size_t offset, size_t /*size*/) override
  9. {
  10. return buffer + offset;
  11. }
  12. bool isCacheStillValid(time_t&) override
  13. {
  14. return false;
  15. }
  16. uint8_t* buffer;
  17. };
  18. // TODO check that hash (re)calculation is indeed incremental
  19. TEST_CASE("TigerTree")
  20. {
  21. uint8_t buffer_[8192 + 1];
  22. uint8_t* buffer = buffer_ + 1;
  23. TTTestData data;
  24. data.buffer = buffer;
  25. std::string dummyName;
  26. time_t dummyTime = 0;
  27. auto dummyCallback = [](size_t, size_t) {};
  28. SECTION("zero sized buffer") {
  29. TigerTree tt(data, 0, dummyName);
  30. CHECK(tt.calcHash(dummyCallback).toString() ==
  31. "LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ");
  32. }
  33. SECTION("size less than 1 block") {
  34. TigerTree tt(data, 100, dummyName);
  35. memset(buffer, 0, 100);
  36. CHECK(tt.calcHash(dummyCallback).toString() ==
  37. "EOIEKIQO6BSNCNRX2UB2MB466INV6LICZ6MPUWQ");
  38. memset(buffer + 20, 1, 10);
  39. tt.notifyChange(20, 10, dummyTime);
  40. CHECK(tt.calcHash(dummyCallback).toString() ==
  41. "GOTZVYW3WIE37XFCDOY66PLLXWGP6DPN3CQRHWA");
  42. }
  43. SECTION("3 full and 1 partial block") {
  44. TigerTree tt(data, 4000, dummyName);
  45. memset(buffer, 0, 4000);
  46. CHECK(tt.calcHash(dummyCallback).toString() ==
  47. "YC44NFWFCN3QWFRSS6ICGUJDLH7F654RCKVT7VY");
  48. memset(buffer + 1500, 1, 10);
  49. tt.notifyChange(1500, 10, dummyTime); // change a single block
  50. CHECK(tt.calcHash(dummyCallback).toString() ==
  51. "JU5RYR446PVZSPMOJML4IQ2FXLDDKE522CEYIBA");
  52. memset(buffer + 2000, 1, 100);
  53. tt.notifyChange(2000, 100, dummyTime); // change 2 blocks
  54. CHECK(tt.calcHash(dummyCallback).toString() ==
  55. "IPV53CDVB2I63HXIXVK2OUPNS26YB7V7G2Y7XIA");
  56. }
  57. SECTION("7 full blocks (unbalanced internal binary tree)") {
  58. TigerTree tt(data, 7 * 1024, dummyName);
  59. memset(buffer, 0, 7 * 1024);
  60. CHECK(tt.calcHash(dummyCallback).toString() ==
  61. "FPSZ35773WS4WGBVXM255KWNETQZXMTEJGFMLTA");
  62. memset(buffer + 512, 1, 512);
  63. tt.notifyChange(512, 512, dummyTime); // part of block-0
  64. CHECK(tt.calcHash(dummyCallback).toString() ==
  65. "Z32BC2WSHPW5DYUSNSZGLDIFTEIP3DBFJ7MG2MQ");
  66. memset(buffer + 3 * 1024, 1, 4 * 1024);
  67. tt.notifyChange(3 * 1024, 4 * 1024, dummyTime); // blocks 3-6
  68. CHECK(tt.calcHash(dummyCallback).toString() ==
  69. "SJUYB3QVIJXNKZMSQZGIMHA7GA2MYU2UECDA26A");
  70. }
  71. }