fault-log-analyzer/tests/test_fingerprint.py

63 lines
1.8 KiB
Python

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()