public void TestAcquireLock_SameId()
        {
            using (MongoDbPessimisticLocker locker = new MongoDbPessimisticLocker(connectionString))
            {
                string id = "id-to-lock";
                string keeperId1 = "job1";
                string keeperId2 = "job2";

                Assert.True(locker.AcquireLock(id, keeperId1));
                Assert.False(locker.AcquireLock(id, keeperId2));
            }
        }
        public void TestAcquireLock_SameId_Timeout_LockReleased_By_MongoDB()
        {
            int ttl = 1;
            using (MongoDbPessimisticLocker locker = new MongoDbPessimisticLocker(connectionString, ttl, true))
            {
                string id = "id-to-lock";
                string keeperId1 = "job1";
                string keeperId2 = "job2";

                Assert.True(locker.AcquireLock(id, keeperId1));
                Thread.Sleep(TimeSpan.FromSeconds(ttl + 60)); // give mongodb a little bit time to remove lock
                Assert.True(locker.AcquireLock(id, keeperId2));
                Assert.False(locker.AcquireLock(id, keeperId1));
            }
        }
        public void TestAcquireLock_SameId_Timeout_KeepAllive()
        {
            int ttl = 1;
            using (MongoDbPessimisticLocker locker = new MongoDbPessimisticLocker(connectionString, ttl, true))
            {

                string id = "id-to-lock";
                string keeperId1 = "job1";
                string keeperId2 = "job2";

                Assert.True(locker.AcquireLock(id, keeperId1));
                for (int i = 0; i < 59; i++)
                {
                    Thread.Sleep(1000);
                    Assert.True(locker.AcquireLock(id, keeperId1));
                }
                Assert.False(locker.AcquireLock(id, keeperId2));
                Assert.True(locker.AcquireLock(id, keeperId1));
            }
        }
        static void Main(string[] args)
        {
            string lockId = "task1";
            string connectionString = "mongodb://localhost/LeaderElectionTest";
            using (var locker = new MongoDbPessimisticLocker(connectionString))
            {
                var leaderAwareTaskRunner = new LeaderAwareTaskRunner(locker, lockId);

                var taskRunner = new TaskRunner(500, ()=>
                {
                    leaderAwareTaskRunner.RunTaskOnLeader(() =>
                    {
                        Console.WriteLine("task executed on a leader");
                    });
                });

                taskRunner.Start();
                Console.ReadLine();
                taskRunner.Stop();
            }
        }