public void TestThatGenerationIsThreadSafeAndUnique() { var results = new ConcurrentQueue <string>(); // Abuse threading here to ensure safety for (var tryNumber = 0; tryNumber < TryCount; tryNumber++) { var generator = new TimeBasedIdGenerator(); Parallel.For(0, EmailCount, currentMail => { var email = _emails[currentMail]; var generated = generator.GenerateId(email); results.Enqueue(generated); } ); // Tolerate the risk of having the same email within the same 200 ms window of a given day Thread.Sleep(200); } Assert.AreEqual(EmailCount * TryCount, results.Count); var uniqueIds = new HashSet <string>(results); Assert.IsTrue(uniqueIds.Count <= results.Count); // Accept a 5 delta Assert.IsTrue(uniqueIds.Count >= results.Count - 5); Assert.IsTrue(results.All(x => x.Length == 9)); }
public void TestTimeBasedIdGenerator() { var gen = new TimeBasedIdGenerator(); long id0 = gen.GetNextId(); Thread.Sleep(1000); long id1 = gen.GetNextId(); Assert.AreEqual(1, (id1 & 0xFFFFFF) - (id0 & 0xFFFFFF)); long diff = (id1 >> 24) - (id0 >> 24); Console.WriteLine("IDs={0:X} , {1:X}, XOR={2:X}", id0, id1, 0); Console.WriteLine("diff=" + diff); Assert.AreEqual(1000.0, diff, 10.0); String s1 = gen.GetNextIdAsString(); String s2 = gen.GetNextIdAsString(); Console.WriteLine("S1=" + s1); Console.WriteLine("S2=" + s2); Assert.AreNotEqual(s1, s2); }