Ejemplo n.º 1
0
        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);
        }