示例#1
0
        public async Task ChangeBet(string betId, int[] numbers, int price)
        {
            if (price <= 0)
            {
                throw new ArgumentException("Price must be positive number.");
            }

            using (var session = Casino.GetSessionAsync)
            {
                var bet = await session.LoadAsync <Bet>(betId).ConfigureAwait(false);

                var user = await session.LoadAsync <User>(Id).ConfigureAwait(false);

                await Lottery.ValidateOpen(session, bet.LotteryId).ConfigureAwait(false);

                user.Credit += bet.Price;
                if (user.Credit < price)
                {
                    throw new InsufficientFunds("Not enough credit");
                }

                bet.Price   = price;
                bet.Numbers = numbers;

                user.Credit -= price;
                await session.StoreAsync(bet).ConfigureAwait(false);

                await session.StoreAsync(user).ConfigureAwait(false);

                await session.SaveChangesAsync().ConfigureAwait(false);
            }
        }
 public void ChangeBets(Lottery lottery, int num)
 {
     for (int i = 0; i < num; i++)
     {
         Task.Run(async() =>
         {
             await Task.Delay(Lottery.Rand.Next(100, 1000));
             var name = UserOperations.GetName();
             var user = await UserOperations.RegisterOrLoad(lottery.CasinoTestInstance, $"{name}@karmel.com", name);
             while (true)
             {
                 await Task.Delay(Lottery.Rand.Next(100, 500));
                 await user.PlaceBet(lottery.CasinoTestInstance, lottery.Id, RandomSequence(), Lottery.Rand.Next(1, 10));
             }
         });
     }
 }
示例#3
0
        public static async Task CreateAndRunLottery()
        {
            var policy = Policy.Handle <TimeoutException>().Retry(5);
            // Console.Write("Creating Lottery ... ");
            var lottery = await Lottery.CreateLottery().ConfigureAwait(false);

            Instance.ReportInfo($"Lottery {lottery.Id} was created and will overdue at {lottery.DueTime}");
            // Console.WriteLine($"Done {lottery.Id}");

            //Console.WriteLine("Start betting");
            var takeItEasy = Environment.GetEnvironmentVariable("RAVEN_SLOW_MACHINE") ?? "N";
            var t          = StartPlacingBets(lottery, takeItEasy.Contains("Y", StringComparison.InvariantCultureIgnoreCase) ? 1000 : 10);

            Instance.ReportInfo($"Start betting in lottery {lottery.Id}");
            var sleep = (int)(lottery.DueTime - DateTime.UtcNow).TotalMilliseconds;

            if (sleep > 10)
            {
                await Task.Delay(sleep).ConfigureAwait(false);
            }

            Instance.ReportInfo($"Lottery {lottery.Id} is overdue");

            //Console.Write("Finalize bets ... ");
            await policy.Execute(lottery.FinalizeBets).ConfigureAwait(false);

            //Console.WriteLine("Done");

            Instance.ReportInfo($"Rolling the dice for lottery {lottery.Id}");
            //Console.WriteLine("Rolling the Dice ... ");
            lottery.RollTheDice();
            //Console.Write("Completing the lottery ... ");

            await policy.Execute(lottery.Complete);

            Instance.ReportInfo($"Lottery {lottery.Id} is completed");
            // Console.WriteLine("Done");

            var profit = await policy.Execute(lottery.GetFinalBettingReport).ConfigureAwait(false);

            Instance.ReportSuccess($"Report for lottery {lottery.Id} was generated and winners were rewarded.");

            // Console.WriteLine(profit);

            await t.ConfigureAwait(false);
        }
示例#4
0
        public static Task StartPlacingBets(Lottery lottery, int num)
        {
            var tasks = new List <Task>();

            for (int i = 0; i < num; i++)
            {
                var t = Task.Run(async() =>
                {
                    try
                    {
                        await Task.Delay(Lottery.Rand.Next(500, 1000)).ConfigureAwait(false);
                        var name = UserOperations.GetName();
                        var user = await UserOperations.RegisterOrLoad($"{name}@karmel.com", name)
                                   .ConfigureAwait(false);
                        for (int j = 0; j < 10; j++)
                        {
                            await Task.Delay(Lottery.Rand.Next(500, 1000)).ConfigureAwait(false);
                            await user.PlaceBet(lottery.Id, RandomSequence(), Lottery.Rand.Next(1, 10))
                            .ConfigureAwait(false);
                        }
                    }
                    catch (ConcurrencyException)
                    {
                        // expected
                    }
                    catch (InsufficientFunds)
                    {
                        // expected
                    }
                    catch (JavaScriptException e) when(e.Message.Contains("Lottery is over!"))
                    {
                        // expected
                    }
                    catch (Exception e)
                    {
                        // not expected at all!
                        Console.WriteLine(e);
                        throw;
                    }
                });
                tasks.Add(t);
            }

            return(Task.WhenAll(tasks));
        }
        public static async Task <Lottery> CreateLottery(CasinoTest casinoInstance)
        {
            var lottery = new Lottery(casinoInstance, $"Lottery/{DateTime.UtcNow}/" + Guid.NewGuid())
            {
                DueTime = DateTime.UtcNow.AddMinutes(1),
                Status  = LotteryStatus.Open
            };

            using (var session = casinoInstance.GetSessionAsync)
            {
                session.Advanced.WaitForReplicationAfterSaveChanges(timeout: TimeSpan.FromSeconds(180), replicas: casinoInstance.ReplicaCount());
                await session.StoreAsync(lottery, lottery.Id);

                await session.SaveChangesAsync();
            }

            return(lottery);
        }
示例#6
0
        public async Task PlaceBet(string lotteryId, int[] numbers, int price)
        {
            if (price <= 0)
            {
                throw new ArgumentException("Price must be positive number.");
            }

            using (var session = Casino.GetSessionAsync)
            {
                var user = await session.LoadAsync <User>(Id).ConfigureAwait(false);

                if (user.Credit < price)
                {
                    throw new InsufficientFunds("Not enough credit");
                }

                var bet = new Bet
                {
                    UserId    = Id,
                    LotteryId = lotteryId,
                    Numbers   = numbers,
                    Price     = price,
                    BetStatus = Bet.Status.Active
                };

                await session.StoreAsync(bet).ConfigureAwait(false);

                session.Advanced.GetMetadataFor(bet)[Constants.Documents.Metadata.Expires] = DateTime.UtcNow.AddMinutes(10);

                user.Credit -= price;
                user.Bets.Add(bet.Id);

                await Lottery.ValidateOpen(session, lotteryId).ConfigureAwait(false);

                session.CountersFor(lotteryId).Increment(DateTime.UtcNow.ToString("yyyy MMMM dd hh:mm"));

                await session.SaveChangesAsync().ConfigureAwait(false);
            }
        }
示例#7
0
        public async Task DeleteBet(string betId)
        {
            using (var session = Casino.GetSessionAsync)
            {
                var user = await session.LoadAsync <User>(Id).ConfigureAwait(false);

                var bet = await session.LoadAsync <Bet>(betId).ConfigureAwait(false);

                await Lottery.ValidateOpen(session, bet.LotteryId).ConfigureAwait(false);

                bet.BetStatus = Bet.Status.Deleted;

                if (user.Bets.Remove(betId))
                {
                    user.Credit += bet.Price;
                    await session.StoreAsync(bet).ConfigureAwait(false);

                    await session.StoreAsync(user).ConfigureAwait(false);

                    await session.SaveChangesAsync().ConfigureAwait(false);
                }
            }
        }
        public async Task CreateAndRunLottery()
        {
            var policy = Policy.Handle <TimeoutException>().Retry(5);

            Console.Write("Creating Lottery ... ");
            var lottery = await Lottery.CreateLottery(this);

            ReportEvent(new EventInfo
            {
                Message = $"Lottery {lottery.Id} was created and will overdue at {lottery.DueTime}",
                Type    = EventInfo.EventType.Info
            });
            Console.WriteLine($"Done {lottery.Id}");

            Console.WriteLine("Start betting");
            var t = StartPlacingBets(lottery, 1000);

            ReportEvent(new EventInfo
            {
                Message = $"Start betting in lottery {lottery.Id}",
                Type    = EventInfo.EventType.Info
            });
            var sleep = (int)(lottery.DueTime - DateTime.UtcNow).TotalMilliseconds;

            if (sleep > 10)
            {
                await Task.Delay(sleep);
            }

            ReportEvent(new EventInfo
            {
                Message = $"Lottery {lottery.Id} is overdue",
                Type    = EventInfo.EventType.Info
            });

            Console.Write("Finalize bets ... ");
            await policy.Execute(lottery.FinalizeBets);

            Console.WriteLine("Done");

            ReportEvent(new EventInfo
            {
                Message = $"Rolling the dice for lottery {lottery.Id}",
                Type    = EventInfo.EventType.Info
            });
            Console.WriteLine("Rolling the Dice ... ");
            lottery.RollTheDice();
            Console.Write("Completing the lottery ... ");

            await policy.Execute(lottery.Complete);

            ReportEvent(new EventInfo
            {
                Message = $"Lottery {lottery.Id} is completed",
                Type    = EventInfo.EventType.Info
            });
            Console.WriteLine("Done");

            var profit = await policy.Execute(lottery.GetFinalBettingReport);

            ReportEvent(new EventInfo
            {
                Message = $"Report for lottery {lottery.Id} was generated and winners were rewarded.",
                Type    = EventInfo.EventType.TestSuccess
            });
            Console.WriteLine(profit);

            await t;
        }