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)); } }); } }
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); }
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); }
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); } }
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; }