public void recover_correctly(string name, bool expected, byte[] bytes) { var originalBytes = bytes.ToArray(); var byteSpan = bytes.AsSpan(); if (expected) { Assert.True(BloomFilterIntegrity.ValidateHash(byteSpan)); // bytes should be unchanged for (var i = 0; i < bytes.Length; i++) { Assert.AreEqual(originalBytes[i], bytes[i]); } } else { Assert.False(BloomFilterIntegrity.ValidateHash(byteSpan)); // bytes should be all 1s foreach (var b in bytes) { Assert.AreEqual(0b1111_1111, b); } } }
public void rehash_when_exactly_one_too_many_bits_are_set() { // some data with hash var cacheLine = NewCacheLine(0x01).WithHash(); // set an extra bit cacheLine[3] = cacheLine[3].SetBit(3); var copy = cacheLine.ToArray(); // still valid Assert.True(BloomFilterIntegrity.ValidateHash(cacheLine)); // same data CollectionAssert.AreEqual(copy[..^ 4], cacheLine[..^ 4]);
public void write_correctly(string name, bool expected, byte[] bytes) { var originalBytes = bytes.ToArray(); var byteSpan = bytes.AsSpan(); BloomFilterIntegrity.WriteHash(byteSpan); // bytes before the hash should be unchanged for (var i = 0; i < bytes.Length - sizeof(uint); i++) { Assert.AreEqual(originalBytes[i], bytes[i]); } // cacheline should be valid if (expected) { Assert.True(BloomFilterIntegrity.ValidateHash(byteSpan)); } else { Assert.False(BloomFilterIntegrity.ValidateHash(byteSpan)); } }