예제 #1
0
        public async Task SimpleFailScenario()
        {
            var provider = new ServiceCollection()
                           .AddKeySmith(ConfigurationHelper.GetConfiguration())
                           .BuildServiceProvider();

            var service = provider.GetRequiredService <IMemoLockService>();

            var root    = Guid.NewGuid().ToString().Substring(0, 8);
            var memoKey = new MemoKey(root, "name", TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));

            var db = provider.GetRequiredService <ConnectionMultiplexer>().GetDatabase();

            await ResetKeys(db, memoKey);

            try
            {
                try
                {
                    await service.MemoLockAsync(memoKey, c => throw new NullReferenceException("oups"), CancellationToken.None);

                    throw new Exception("Nothing was thrown");
                }
                catch (NullReferenceException)
                {
                }
                catch (GenerationException)// we actually get it from redis before we had time to clean the setup.
                {
                }

                try
                {
                    RedisValue answer = "answer";
                    await service.MemoLockAsync(memoKey, c => Task.FromResult(answer), CancellationToken.None);

                    throw new Exception("Nothing was thrown");
                }
                catch (GenerationException)
                {
                }

                Assert.False(await db.KeyExistsAsync(memoKey.GetValueKey()));
                Assert.True(await db.KeyExistsAsync(memoKey.GetErrorKey()));
            }
            finally
            {
                await ResetKeys(db, memoKey);
            }
        }
예제 #2
0
        public async Task SubscribeTests()
        {
            var connection = ConfigurationHelper.GetNewConnection();
            var library    = new MemoScriptLibrary(connection);
            var db         = connection.GetDatabase();

            var timeout = 500;
            var root    = Guid.NewGuid().ToString().Substring(0, 8);
            var key     = new MemoKey(root, "key", TimeSpan.FromMilliseconds(timeout), TimeSpan.FromSeconds(1));
            var result  = false;
            await library.SubscribeAsync(key.GetSubscribtionChannel(), (c, v) => result = true);

            await db.PublishAsync(key.GetValueChannel(), "identifier");

            await Task.Delay(30);

            Assert.True(result);
        }
예제 #3
0
 public ByteBuffer ToBuffer(ByteBuffer buffer = null)
 {
     buffer = buffer ?? new ByteBuffer(ByteBuffer.LITTLE_ENDING);
     MemoKey.ToBuffer(buffer);
     VotingAccount.ToBuffer(buffer);
     buffer.WriteUInt16(NumWitness);
     buffer.WriteUInt16(NumCommittee);
     buffer.WriteArray(Votes, (b, item) => {
         if (!item.IsNull())
         {
             item.ToBuffer(b);
         }
     }, VoteId.Compare);
     buffer.WriteArray(Extensions, (b, item) => {
         if (!item.IsNull())
         {
             ;
         }
     });              // todo
     return(buffer);
 }
예제 #4
0
        private Task ResetKeys(IDatabase db, MemoKey memoKey)
        {
            var key = memoKey.GetLockKey();

            return(db.KeyDeleteAsync(new RedisKey[] { memoKey.GetErrorKey(), memoKey.GetValueKey(), key.GetLockKey(), key.GetLockQueueKey(), key.GetLockQueueSetKey() }));
        }