63 lines
1.8 KiB
Python
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()
|