pdq_hasher_test.go (4731B)
1 package pdq 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/MTRNord/pdqhash-go/types" 8 "github.com/davidbyttow/govips/v2/vips" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 type Pair struct { 13 First string 14 Second string 15 } 16 17 func TestMain(m *testing.M) { 18 vips.LoggingSettings(nil, vips.LogLevelMessage) 19 vips.Startup(&vips.Config{ 20 ConcurrencyLevel: 0, 21 MaxCacheFiles: 5, 22 MaxCacheMem: 50 * 1024 * 1024, 23 MaxCacheSize: 100, 24 ReportLeaks: false, 25 CacheTrace: false, 26 CollectStats: false, 27 }) 28 defer vips.Shutdown() 29 30 os.Exit(m.Run()) 31 } 32 33 var DATA_ARRAY = [19]Pair{ 34 { 35 "./test-images/misc-images/b.jpg", 36 "d8f8f0cce0f4a84f0e370a22028f67f0b36e2ed596623e1d33e6b39c4e9c9b22", 37 }, 38 { 39 "./test-images/misc-images/c.png", 40 "e64cc9d91e623842f8d1f1d9a398e78c9f199a3bd87924f2b7e11e0bf061b064", 41 }, 42 { 43 "./test-images/misc-images/small.jpg", 44 "0007001f003f003f007f00ff00ff00ff01ff01ff01ff03ff03ff03ff03ff03ff", 45 }, 46 { 47 "./test-images/misc-images/wee.jpg", 48 "6227401f601ff4ccafcc9fad4b0d95d371a2eb7265a3285234d228ca94deeb2d", 49 }, 50 { 51 "./test-images/reg-test-input/labelme-subset/q0003.jpg", 52 "54a977c221d14c1c43ba5e6e21d4a13989a3553f1462611cbb85fda7be83b677", 53 }, 54 { 55 "./test-images/reg-test-input/labelme-subset/q0004.jpg", 56 "992d44af36d69e6ca6b812585928bac11def254ef5398c6d07466c9abcc65b92", 57 }, 58 { 59 "./test-images/reg-test-input/labelme-subset/q0122.jpg", 60 "cfb2009ddd21c6dab0046a7745b5984757a8a4535b3377aea2591d32b33ff940", 61 }, 62 { 63 "./test-images/reg-test-input/labelme-subset/q0291.jpg", 64 "a0fe94f1e5cc1cc8dd855948498dc9243f7ca27336f036d7f212b74bc103c9a7", 65 }, 66 { 67 "./test-images/reg-test-input/labelme-subset/q0746.jpg", 68 "1049d96239e24d4dca2c55512b8bdb77425f4dbcf575a0a95555aaab5554aaaa", 69 }, 70 { 71 "./test-images/reg-test-input/labelme-subset/q1050.jpg", 72 "489db672e9190276d452aeab41eba20f02375fe4092d88defdf491a5c55c5f70", 73 }, 74 { 75 "./test-images/reg-test-input/labelme-subset/q2821.jpg", 76 "b150231ffae4710ffcf4f18bb574b109a576f14bb8543189f8743289f174b109", 77 }, 78 { 79 "./test-images/reg-test-input/dih/bridge-1-original.jpg", 80 "d8f8f0cce0f4a84f0e370a22028f67f0b36e2ed596623e1d33e6b39c4e9c9b22", 81 }, 82 { 83 "./test-images/reg-test-input/dih/bridge-2-rotate-90.jpg", 84 "38a50efd71c83f429013d68d0ffffc52e34e0e15ada952a9d29684214aa9e5af", 85 }, 86 { 87 "./test-images/reg-test-input/dih/bridge-3-rotate-180.jpg", 88 "2dadda64b5a142e5d362209057da895ae63b8c7fc277b4b766b319361f893188", 89 }, 90 { 91 "./test-images/reg-test-input/dih/bridge-4-rotate-270.jpg", 92 "a5f0a457248995e8c9065c275aaa54d8b61ba4bdf8fcfc0387c32f8b0bfc4f05", 93 }, 94 { 95 "./test-images/reg-test-input/dih/bridge-5-flipx.jpg", 96 "d8f80f31e0f417b00e37f5dd028f980fb36ed12a9662c1e233e64c634e9c64dd", 97 }, 98 { 99 "./test-images/reg-test-input/dih/bridge-6-flipy.jpg", 100 "0dad259bb1a1bd18d362576556da32a1e63b7380c2374b4866b3c6c91b89ce77", 101 }, 102 { 103 "./test-images/reg-test-input/dih/bridge-7-flip-plus-1.jpg", 104 "f0a5e10271dcc0bd9c5309720fff018de34ef1e8ada9a956d2967ade1ea91a50", 105 }, 106 { 107 "./test-images/reg-test-input/dih/bridge-8-flip-minus-1.jpg", 108 "69f05aa8a4996a17c146a2da5aaaab07b61b5b60f8fc07fc83c3d0740bfcb0fa", 109 }, 110 } 111 112 func TestPDQHasher(t *testing.T) { 113 pdqHasher := NewPDQHasher() 114 hammingTolerance := 16 115 116 for _, pair := range DATA_ARRAY { 117 imagePath := pair.First 118 expectedHash := pair.Second 119 120 hash := pdqHasher.FromFile(imagePath) 121 122 expectedHashObj, err := types.Hash256FromHexString(expectedHash) 123 assert.ErrorIs(t, err, nil) 124 125 computedHash := hash.Hash 126 127 hammingDistance := computedHash.HammingDistance(expectedHashObj) 128 assert.LessOrEqualf(t, hammingDistance, hammingTolerance, "Hamming distance is too high: %s", imagePath) 129 } 130 } 131 132 func TestPDQHasherDehidral(t *testing.T) { 133 pdqHasher := NewPDQHasher() 134 hashes := pdqHasher.DihedralFromFile("./test-images/reg-test-input/labelme-subset/q0004.jpg", PDQ_DO_DIH_ALL) 135 136 assert.Equal(t, hashes.hash.String(), "992d44af36d69e6ca6b812585928bac11def254ef5398c6d07466c9abcc65b92") 137 assert.Equal(t, hashes.hashRotate90.String(), "9b323dd22976484c939787013f096d1669874a21dab0d3dadef50f2560cf3e4f") 138 assert.Equal(t, hashes.hashRotate180.String(), "8c78ee05e38335c6f3edf8f28e7d106b48ba8fe4a06c16c71213c670e993f138") 139 assert.Equal(t, hashes.hashRotate270.String(), "c86783787c23e2e6c6c22dab685cc7bc3cd2608b8fe579708ba0a58f359a94e5") 140 assert.Equal(t, hashes.hashFlipX.String(), "d92dbb5036d62093a6b82da75928453e1defdab1f539439247469325bcc6a465") 141 assert.Equal(t, hashes.hashFlipY.String(), "8c3811fa6383ca39f3ed470d8e7def9448ba701ba06ce9381213398fe9930ecf") 142 assert.Equal(t, hashes.hashFlipPlus1.String(), "993242252966b7a3939778fe3d0982e9698735dadab02c25def4f0da60cfc1b0") 143 assert.Equal(t, hashes.hashFlipMinus1.String(), "ee676c877c231d19c6c2d2546a5c38433cd29f748fe5868f8ba15a70359a6b1a") 144 }