import _bootstrap # noqa: F401 import unittest from fault_log_analyzer.fingerprint import ( MinHash, message_fingerprint, sha1_hex, shingles, ) class TestFingerprint(unittest.TestCase): def test_sha1_hex_length(self): self.assertEqual(len(sha1_hex("abc", 16)), 16) def test_same_template_same_fingerprint(self): f1 = message_fingerprint("Connection from 10.0.0.11 failed after 3 retries") f2 = message_fingerprint("Connection from 10.0.0.12 failed after 5 retries") self.assertEqual(f1, f2) def test_different_message_different_fingerprint(self): self.assertNotEqual(message_fingerprint("disk full"), message_fingerprint("connection refused")) def test_shingles(self): s = shingles(["a", "b", "c", "d"], k=3) self.assertIn("a|b|c", s) self.assertIn("b|c|d", s) self.assertNotIn("c|d|e", s) def test_shingles_short_sequence(self): s = shingles(["a", "b"], k=3) self.assertIn("a|b", s) def test_shingles_empty(self): self.assertEqual(shingles([], k=3), set()) class TestMinHash(unittest.TestCase): def test_signature_length(self): mh = MinHash(num_hashes=16) sig = mh.signature(["a", "b", "c"]) self.assertEqual(len(sig), 16) def test_signature_empty(self): mh = MinHash(num_hashes=8) sig = mh.signature([]) self.assertEqual(sig, [0] * 8) def test_jaccard_estimate_identical(self): mh = MinHash(num_hashes=32) sig = mh.signature(["a", "b", "c", "d"]) self.assertEqual(mh.jaccard_estimate(sig, sig), 1.0) def test_jaccard_estimate_length_mismatch(self): mh = MinHash(num_hashes=8) with self.assertRaises(ValueError): mh.jaccard_estimate([1, 2], [1, 2, 3]) if __name__ == "__main__": unittest.main()